前節からの続きです。
先ほどのモデルを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 -