カメラの方向に向けないように画像を描画する場合は 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乗である必要がありますので注意してください