OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

三次元を二次元に・・・

  • すぐに回答を!
  • 質問No.151817
  • 閲覧数382
  • ありがとう数1
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 8% (5/58)

ヘッダーファイルの中に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);
}
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.1

プロジェクションは無視しますが、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未満のときは、ラインそのものを表示しないような工夫が必要になります。
-PR-
-PR-

その他の回答 (全1件)

  • 回答No.2

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


このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ