トップページ > 記事閲覧
DXライブラリで3Dモデルをカメラの回転後の方向に前進後進を
名前:初心者 N 日時: 2015/10/14 16:24

初めまして、今回 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; }
メンテ

Page: 1 |

Re: DXライブラリで3Dモデルをカメラの回転後の方向に前進後進を ( No.1 )
名前:管理人 日時:2015/10/16 02:04

こちらの行で3Dモデルを移動されていますが、 if(CheckHitKey(KEY_INPUT_S)){//Sキーが押されていたら 後進 z+=0.1f; } if(CheckHitKey(KEY_INPUT_W)){//Wキーが押されていたら 前進 z-=0.1f; } 移動値に3Dモデルの向きである angleY の値が全く絡んでいないのが原因です こちらのようにすると3Dモデルが向いている方向に進みます if(CheckHitKey(KEY_INPUT_S)){//Sキーが押されていたら 後進 x += sin( angleY ) * 0.1f; z += cos( angleY ) * 0.1f; } if(CheckHitKey(KEY_INPUT_W)){//Wキーが押されていたら 前進 x += sin( angleY ) * -0.1f; z += cos( angleY ) * -0.1f; } ただ、3Dモデルの初期状態での向きによっては上記のようにしても向いている方向に移動しませんので、その際は if(CheckHitKey(KEY_INPUT_S)){//Sキーが押されていたら 後進 x += sin( -angleY ) * 0.1f; z += cos( -angleY ) * 0.1f; } if(CheckHitKey(KEY_INPUT_W)){//Wキーが押されていたら 前進 x += sin( -angleY ) * -0.1f; z += cos( -angleY ) * -0.1f; } と、angleY を -angleY にしてみたり if(CheckHitKey(KEY_INPUT_S)){//Sキーが押されていたら 後進 x += sin( angleY + 3.14f / 2.0f ) * 0.1f; z += cos( angleY + 3.14f / 2.0f ) * 0.1f; } if(CheckHitKey(KEY_INPUT_W)){//Wキーが押されていたら 前進 x += sin( angleY + 3.14f / 2.0f ) * -0.1f; z += cos( angleY + 3.14f / 2.0f ) * -0.1f; } と、angleY を angleY + 角度 のようにして向いている方向に移動するように調整してみてください
メンテ
Re: DXライブラリで3Dモデルをカメラの回転後の方向に前進後進を ( No.2 )
名前:初心者 N 日時:2015/10/19 11:33

コメントありがとうございます!! 自分で方向を調整して、なんとか自身のしたいことに近くなりました。 ありがとうございました
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存