トップページ > 過去ログ > 記事閲覧
3D空間に画像を3方向に回転させて表示させたい
名前:monyfula 日時: 2012/09/01 19:03

お世話になっています。 3Dの空間上にLoadGraph等で読み込んだ画像をピッチ、ヨー、ロールの3方向にそれぞれ回転させて表示させたいのですが、どうすればよいでしょうか? DrawBillboard3Dを使えばカメラとは垂直方向に回転ができますが、そうではなくカメラからハリボテとわかるような方向に画像を回転させ、カメラの方向を向かない画像を描画したいと思っています。 ご教示いただけたら幸いです。

Page: 1 |

Re: 3D空間に画像を3方向に回転させて表示させたい ( No.1 )
名前:管理人 日時:2012/09/02 05:32

カメラの方向に向けないように画像を描画する場合は DrawPolygon3D を使用します ピッチ、ヨー、ロールではありませんが、x軸回転、y軸回転、z軸回転を行って描画することは 行列を使用すれば比較的簡単に実現できます サンプルプログラムを書いてみましたので、よろしければご覧ください #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { VERTEX3D Vertex[ 6 ] ; VECTOR Angle ; int GraphHandle ; // ウインドウモードで起動 ChangeWindowMode( TRUE ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 画像の読み込み GraphHandle = LoadGraph( "256x256.bmp" ) ; // 2ポリゴン分の頂点の座標と法線以外のデータをセット Vertex[ 0 ].dif = GetColorU8( 255,255,255,255 ) ; Vertex[ 0 ].spc = GetColorU8( 0, 0, 0, 0 ) ; Vertex[ 0 ].u = 0.0f ; Vertex[ 0 ].v = 0.0f ; Vertex[ 0 ].su = 0.0f ; Vertex[ 0 ].sv = 0.0f ; Vertex[ 1 ].dif = GetColorU8( 255,255,255,255 ) ; Vertex[ 1 ].spc = GetColorU8( 0, 0, 0, 0 ) ; Vertex[ 1 ].u = 1.0f ; Vertex[ 1 ].v = 0.0f ; Vertex[ 1 ].su = 0.0f ; Vertex[ 1 ].sv = 0.0f ; Vertex[ 2 ].dif = GetColorU8( 255,255,255,255 ) ; Vertex[ 2 ].spc = GetColorU8( 0, 0, 0, 0 ) ; Vertex[ 2 ].u = 0.0f ; Vertex[ 2 ].v = 1.0f ; Vertex[ 2 ].su = 0.0f ; Vertex[ 2 ].sv = 0.0f ; Vertex[ 3 ].dif = GetColorU8( 255,255,255,255 ) ; Vertex[ 3 ].spc = GetColorU8( 0, 0, 0, 0 ) ; Vertex[ 3 ].u = 1.0f ; Vertex[ 3 ].v = 1.0f ; Vertex[ 3 ].su = 0.0f ; Vertex[ 3 ].sv = 0.0f ; Vertex[ 4 ] = Vertex[ 2 ] ; Vertex[ 5 ] = Vertex[ 1 ] ; // 回転パラメータを初期化 Angle.x = 0.0f ; Angle.y = 0.0f ; Angle.z = 0.0f ; // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // メインループ while( ProcessMessage() == 0 ) { // 画面を初期化 ClearDrawScreen() ; // 回転パラメータの操作処理 if( CheckHitKey( KEY_INPUT_Z ) == 1 ) Angle.x -= 0.1f ; if( CheckHitKey( KEY_INPUT_A ) == 1 ) Angle.x += 0.1f ; if( CheckHitKey( KEY_INPUT_X ) == 1 ) Angle.y -= 0.1f ; if( CheckHitKey( KEY_INPUT_S ) == 1 ) Angle.y += 0.1f ; if( CheckHitKey( KEY_INPUT_C ) == 1 ) Angle.z -= 0.1f ; if( CheckHitKey( KEY_INPUT_D ) == 1 ) Angle.z += 0.1f ; MATRIX TransformMatrix ; // 回転( x, y, z軸回転の順 )+座標移動行列の作成 TransformMatrix = MGetRotX( Angle.x ) ; TransformMatrix = MMult( TransformMatrix, MGetRotY( Angle.y ) ) ; TransformMatrix = MMult( TransformMatrix, MGetRotZ( Angle.z ) ) ; TransformMatrix = MMult( TransformMatrix, MGetTranslate( VGet( 320.0f, 240.0f, 0.0f ) ) ) ; // 行列を使ってワールド座標を算出 Vertex[ 0 ].pos = VTransform( VGet( -100.0f, 100.0f, 0.0f ), TransformMatrix ) ; Vertex[ 1 ].pos = VTransform( VGet( 100.0f, 100.0f, 0.0f ), TransformMatrix ) ; Vertex[ 2 ].pos = VTransform( VGet( -100.0f, -100.0f, 0.0f ), TransformMatrix ) ; Vertex[ 3 ].pos = VTransform( VGet( 100.0f, -100.0f, 0.0f ), TransformMatrix ) ; Vertex[ 4 ].pos = Vertex[ 2 ].pos ; Vertex[ 5 ].pos = Vertex[ 1 ].pos ; // 行列を使って法線を算出 Vertex[ 0 ].norm = VTransformSR( VGet( 0.0f, 0.0f, -1.0f ), TransformMatrix ) ; Vertex[ 1 ].norm = Vertex[ 0 ].norm ; Vertex[ 2 ].norm = Vertex[ 0 ].norm ; Vertex[ 3 ].norm = Vertex[ 0 ].norm ; Vertex[ 4 ].norm = Vertex[ 0 ].norm ; Vertex[ 5 ].norm = Vertex[ 0 ].norm ; // ライティングは行わない SetUseLighting( FALSE ) ; // 2ポリゴンの描画 DrawPolygon3D( Vertex, 2, GraphHandle, TRUE ) ; // 画面にパラメータを表示 DrawFormatString( 0, 0, GetColor( 255,255,255 ), "x:%.3f y:%.3f z:%.3f", Angle.x, Angle.y, Angle.z ) ; DrawString( 0, 460, "ZAキー:x軸回転 XSキー:y軸回転 CDキー:z軸回転", GetColor( 255,255,255 ) ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; } 因みに、DrawPolygon3D で描画する画像は縦横のサイズが2のn乗である必要がありますので注意してください
Re: 3D空間に画像を3方向に回転させて表示させたい ( No.2 )
名前:monyfula(解決) 日時:2012/09/03 20:51

管理人様のコードで無事に解決できました。 ありがとうございます。

Page: 1 |