初めまして、今回 DXライブラリにて方向転換をした後の方角に向けて進む方法を教えてもらいたく投稿をしました。現在のコードは以下のようになっています。どうしても3Dモデルが回転をした後の方向に進むのではなく初期に設定された方向へと進んでしまいます。
main.cpp
#include <DxLib.h>
#include <math.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 x=0,y=0,z=0; //モデル座標
float angleX = 0.0f,angleY = 0.0f,angleZ = 0.0f;
float cameraX=0,cameraY=20, cameraZ=-20; //カメラの座標
const float targetX=0,targetY=10.0f, targetZ=0;//カメラの視線の先ターゲットの座標
//3Dモデルの読み込み
int ModelHandle = MV1LoadModel( ) ;
//3D MAPモデルの読み込み
int MapModelHanlde = MV1LoadModel();
//奥行0.1〜1000までをカメラの描画範囲とする
SetCameraNearFar( 0.1f, 1000.0f ) ;
while(!ScreenFlip()&&!ProcessMessage()&&!ClearDrawScreen()){
if(CheckHitKey(KEY_INPUT_S)){//Sキーが押されていたら 後進
z+=0.1f;
}
if(CheckHitKey(KEY_INPUT_W)){//Wキーが押されていたら 前進
z-=0.1f;
}
if( CheckHitKey(KEY_INPUT_A) > 0){//Aキーが押されていたら
angleY -= ROTATE_SPEED;
}
if( CheckHitKey(KEY_INPUT_D) > 0){//Dキーが押されていたら
angleY += ROTATE_SPEED;
}
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);//回転
}
if( CheckHitKey(KEY_INPUT_UP) > 0 ){//上キーが押されていたら
rotate(&cameraY, &cameraZ, +ROTATE_SPEED, targetX, targetZ);//回転
}
if( CheckHitKey(KEY_INPUT_DOWN) > 0 ){//下キーが押されていたら
rotate(&cameraY, &cameraZ, -ROTATE_SPEED, targetX, targetZ);//回転
}
//第一引数の視点から第二引数のターゲットを見る角度にカメラを設置
SetCameraPositionAndTarget_UpVecY( VGet( cameraX + x, cameraY + y, cameraZ + z ), VGet( targetX + x, targetY + y, targetZ + z ) ) ;
//第二引数の回転角度をセット
MV1SetRotationXYZ( ModelHandle, VGet( angleX, angleY, angleZ ) ) ;
// 指定位置にモデルを配置
MV1SetPosition( ModelHandle, VGet( x, y, z ) ) ;
// 3Dモデルの描画
MV1DrawModel(MapModelHanlde); //Mapモデルの読み込み
MV1DrawModel(ModelHandle) ; //3Dモデルの読み込み
DrawFormatString(0,0,GetColor(255,255,255),"x=%.1f y=%.1f z=%.1f",x,y,z);
DrawFormatString(0,15,GetColor(255,255,255),"cameraX = %.1f cameraY = %.1f cameraZ = %.1f",cameraX,cameraY,cameraZ);
DrawFormatString(0,30,GetColor(255,255,255),"targetX = %.1f targetY = %.1f targetZ = %.1f",targetX,targetY,targetZ);
DrawFormatString(0,45,GetColor(255,255,255),"angleX = %.1f angleY = %.1f angleZ = %.1f",angleX,angleY,angleZ);
}
DxLib_End();
return 0;
}