前節からの続きです。
先ほどのモデルを360度好きな方向から見られるように十字キーで回転できるようにしてみましょう。
実行結果
今回これを実現するには、ある点を軸に座標を回転させる必要があります。
座標の回転はこちらの説明にある通りの計算式で計算できます。
これを計算できる関数をrotate関数として以下の通り作ってみます。
また、3D座標空間は以下のような軸から成っています。
今回Y軸を基準に回転するので、平面はX-Z平面になります。
それを踏まえて以下のプログラムをご覧ください。
/***** main.cpp *****/ #include <math.h> #include <DxLib.h> static const float ROTATE_SPEED = DX_PI_F/90;//回転スピード // (x,y)の点を(mx,my)を中心にang角回転する void rotate(float *x, float *y, const float ang, const float mx, const float my){ const float ox = *x-mx, oy = *y-my; *x = ox * cos(ang) + oy * sin(ang); *y = -ox * sin(ang) + oy * cos(ang); *x += mx; *y += my; } int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){ ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); float cameraX=0, cameraZ=-20; //カメラの座標 const float targetX=0, targetZ=0;//カメラの視線の先ターゲットの座標 //3Dモデルの読み込み int ModelHandle = MV1LoadModel( "dat/Lat式ミク/Lat式ミクVer2.3_Normal.pmd" ) ; //奥行0.1~1000までをカメラの描画範囲とする SetCameraNearFar( 0.1f, 1000.0f ) ; while(!ScreenFlip()&&!ProcessMessage()&&!ClearDrawScreen()){ if( CheckHitKey(KEY_INPUT_LEFT) > 0 ){//左キーが押されていたら rotate(&cameraX, &cameraZ, +ROTATE_SPEED, targetX, targetZ);//回転 } if( CheckHitKey(KEY_INPUT_RIGHT) > 0 ){//右キーが押されていたら rotate(&cameraX, &cameraZ, -ROTATE_SPEED, targetX, targetZ);//回転 } //第一引数の視点から第二引数のターゲットを見る角度にカメラを設置 SetCameraPositionAndTarget_UpVecY( VGet( cameraX, 10, cameraZ ), VGet( targetX, 10.0f, targetZ ) ) ; // 3Dモデルの描画 MV1DrawModel( ModelHandle ) ; } DxLib_End(); return 0; }
左キー、右キーが押されているとrotate関数をコールし、カメラ位置の座標を表すcameraX,cameraZを更新するようになっています。
- Remical Soft -