トップページ > 記事閲覧
キャラの移動について
名前:アライス 日時: 2016/08/11 22:42

カメラを回転させた際に、キャラが思った通りの方角に移動 させることができません。(例えばWキーを押したときにカメラから見て奥に移動といった具合です。) プログラムに何を追加すればいいのかご教授お願いいたします。 Main.cpp ----------------------------------------------------------------------------- #include "DxLib.h" #include "Camera.h" int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int) { Camera instCamera; VECTOR P_Position; P_Position.x = 0.0f; P_Position.y = 0.0f; P_Position.z = -10.0f; instCamera.Init(P_Position); int Green = GetColor( 0, 255, 0 ); if(DxLib_Init() < -1) return -1; //エラーが出たら終了 int Player = MV1LoadModel("Lat式ミク/Lat式ミクVer2.3_Normal.pmd"); int Player2 = MV1LoadModel("Lat式ミク/Lat式ミクVer2.3_Normal.pmd"); //描画先を裏画面に SetDrawScreen( DX_SCREEN_BACK ); MV1SetPosition( Player, P_Position); MV1SetPosition( Player2, VGet(P_Position.x + 10, P_Position.y, P_Position.z)); while(CheckHitKey(KEY_INPUT_ESCAPE) == 0) { //画面をクリア ClearDrawScreen() ; instCamera.Update(P_Position); if(CheckHitKey(KEY_INPUT_W)) { MoveVec = VAdd( MoveVec, UpMoveVec ) ; } if(CheckHitKey(KEY_INPUT_S)) { P_Position.z -= 1.0f; } if(CheckHitKey(KEY_INPUT_A)) { P_Position.x -= 1.0f; } if(CheckHitKey(KEY_INPUT_D)) { P_Position.x += 1.0f; } MV1SetPosition( Player, P_Position); if(Player == -1) return -1; //DrawFormatString( 0, 0, Green, "回転[%f,%f]", VRotate, HRotate ); MV1DrawModel(Player); MV1DrawModel(Player2); ScreenFlip() ; } //WaitKey(); DxLib_End(); return 0; ---------------------------------------------------------------------------------- Camera.h ---------------------------------------------------------------------------------- #pragma once #include "DxLib.h" class Camera { float VRotate, HRotate, TRotate; MATRIX vec1,vec2; public: VECTOR Eye; Camera(void); ~Camera(void); HRESULT Init(VECTOR P_Position); HRESULT Update(VECTOR P_Position); }; --------------------------------------------------------------------------------- Camera.cpp --------------------------------------------------------------------------------- #include "Camera.h" //コンストラクタ Camera::Camera(void) { Eye.x = 0.0f; Eye.y = 0.0f; Eye.z = 0.0f; VRotate = 0.0f; HRotate = 0.0f; TRotate = 0.0f; vec1 = MGetRotY(HRotate); vec2 = MGetRotZ(VRotate); } //デストラクタ Camera::~Camera(void) { } //初期化処理 HRESULT Camera::Init(VECTOR P_Position) { //カメラの位置を初期化 //カメラの回転値を初期化 VRotate = 0.0f; HRotate = -DX_PI_F / 2; TRotate = 0.0f; vec1 = MGetRotY(HRotate); vec2 = MGetRotZ(VRotate); return S_OK; } HRESULT Camera::Update(VECTOR P_Position) { //画面をクリア ClearDrawScreen() ; // 左シフトキーを押しているかどうかで処理を分岐 if( CheckHitKey( KEY_INPUT_LSHIFT ) == 1 ) { // 左右キーでカメラの捻り方向回転値を変更 if( CheckHitKey( KEY_INPUT_LEFT ) == 1 ) { TRotate -= DX_PI_F / 60.0f ; } if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 ) { TRotate += DX_PI_F / 60.0f ; } } else { // 左右キーでカメラの水平方向回転値を変更 if( CheckHitKey( KEY_INPUT_LEFT ) == 1 ) { HRotate -= DX_PI_F / 60.0f ; if(HRotate < -DX_PI_F * 2.5f) HRotate = -DX_PI_F / 2; } if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 ) { HRotate += DX_PI_F / 60.0f ; } } // 上下キーでカメラの垂直方向回転値を変更 if( CheckHitKey( KEY_INPUT_UP ) == 1 && VRotate < DX_PI_F / 2.5f) { VRotate += DX_PI_F / 60.0f ; } if( CheckHitKey( KEY_INPUT_DOWN ) == 1 && VRotate > DX_PI_F / -2.5f) { VRotate -= DX_PI_F / 60.0f ; } vec1 = MGetRotY(HRotate); vec2 = MGetRotZ(VRotate); SetCameraPositionAndAngle( P_Position, VRotate, HRotate, TRotate ) ; Eye =VAdd( VTransform(VTransform(VGet(-100.0f, 0.0f, 0.0f),vec2), vec1), VGet( P_Position.x, P_Position.y+10.0f, P_Position.z )) ; SetCameraPositionAndTarget_UpVecY(Eye,VGet( P_Position.x, P_Position.y+10.0f, P_Position.z )); return S_OK; }
メンテ

Page: 1 |

Re: キャラの移動について ( No.1 )
名前:管理人 日時:2016/08/11 22:43

カメラから見て奥に移動するという処理を実現するに当たって 現状のDXライブラリの機能だけでは少し処理が面倒であることに気づいたので、関数を追加しました よろしければその関数を追加したこちらのバージョンをダウンロードしてください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_DevCppTest.exe // Dev-C++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) 以下の関数を追加しました( GetCameraUpVector は以前からありますが一応 ) // カメラの正面方向に垂直な上方向のベクトルを取得する VECTOR GetCameraUpVector( void ) ; // カメラの正面方向に垂直な下方向のベクトルを取得する VECTOR GetCameraDownVector( void ) ; // カメラの正面方向に垂直な右方向のベクトルを取得する VECTOR GetCameraRightVector( void ) ; // カメラの正面方向に垂直な左方向のベクトルを取得する VECTOR GetCameraLeftVector( void ) ; // カメラの正面方向のベクトルを取得する VECTOR GetCameraFrontVector( void ) ; // カメラの後ろ方向のベクトルを取得する VECTOR GetCameraBackVector( void ) ; カメラから見て奥方向は GetCameraFrontVector で取得できますので、例えば Wキーを 押したときに画面の奥の方に移動させたい場合は if(CheckHitKey(KEY_INPUT_W)) { MoveVec = VAdd( MoveVec, UpMoveVec ) ; } こちらの部分を、このようにします if(CheckHitKey(KEY_INPUT_W)) { P_Position = VAdd( P_Position, GetCameraFrontVector() ) ; } 速度を調整したい場合は VScale を使用します、例えば3倍の速度でカメラから見て奥に移動させたい場合は if(CheckHitKey(KEY_INPUT_W)) { P_Position = VAdd( P_Position, VScale( GetCameraFrontVector(), 3.0f ) ) ; } とします 上下左右・後方についてもそれぞれ GetCameraUpVector, GetCameraLeftVector, GetCameraRightVector, GetCameraBackVector で 同じように記述することで処理を実現できますので、よろしければお試しください m(_ _)m
メンテ
Re: キャラの移動について ( No.2 )
名前:アライス 日時:2016/08/13 21:54

管理人様、返信と新たに関数を追加していただき本当にありがとうございます。 これらの関数を使って頑張って作品を作りたいと思います。
メンテ

Page: 1 |

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

   クッキー保存