アプリ版:「スタンプのみでお礼する」機能のリリースについて

ヘッダーファイルの中にXeasyGraphic.hと言うのがあり、立方体を表示させ回転たいのです。
そして、三次元で回転させ、二次元に落とすという方法をしたかったのですが、どうしても、ゆがんでしまいます。どうしたらいいでしょうか?


-------ソース-------
#include<stdio.h>
#include<XeasyGraphics.h>
#include<math.h>
int main(){
/*立方体の宣言*/
float box_x[8]={10,10,10,-10,10,-10,-10,-10};/*X軸*/
float box_y[8]={10,10,-10,10,-10,10,-10,-10};/*Y軸*/
float box_z[8]={10,-10,10,-10,-10,10,10,-10};/*Z軸*/
/*立方体のキャッシュ*/
float box_x2[360][8],box_y2[360][8],box_z2[360][8];
/*平面に落とした時のキャッシュ*/
float flat_x[360][8],flat_y[360][8];
/*回転用*/
int j,i;
float th,x,y,x2,y2;
/*回転プログラム*/
for(j=1;j<=360;j++){
for(i=0;i<8;i++){
x=box_x[i];
y=box_y[i];
th=(PAI/180)*j;
box_x2[j-1][i]=x*cos(th)-y*sin(th);
box_y2[j-1][i]=x*sin(th)+y*cos(th);
box_z2[j-1][i]=box_z[i];
}
}
/*三次元から二次元へ*//*ここが間違えていると思われる*/
for(j=0;j<360;j++){
for(i=0;i<8;i++){
flat_x[j][i]=box_x2[j][i]-box_z2[j][i];
flat_y[j][i]=box_y2[j][i]-box_z2[j][i];
}
}
/*この後に表示が入る予定*/
getchar();
exit(0);
}

A 回答 (2件)

プロジェクションは無視しますが、3D→2Dの透視変換をするならば、


d = box_z2 - (-15); // Z座標=(-15) から見る
flat_x = box_x2 / d;
flat_y = box_y2 / d;
のようにします。

3DのZ座標の最小値は-10√2だからこの場合はありえませんが、box_z2 - (-15) が負になると、座標が反転し、0だと、0割り算が発生し、正であっても0に近いと、XY座標が極めて大きな値になるので、例えば1未満のときは、ラインそのものを表示しないような工夫が必要になります。
    • good
    • 0

No.1ですが、Z軸で回転させているので、-10√2は-10の間違いでした。

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!