カメラを回転させた際に、キャラが思った通りの方角に移動
させることができません。(例えば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;
}