カメラの位置とカメラの注視点(=キャラ)のベクトルを基準に
キャラを動かすプログラムを考えています。
上を押せばそのベクトルと同じ方向に、下なら反対方向、
左ならそのベクトルに対し直角でその向きに対し左側に、右ならその逆と言う感じです。
しかしなかなか上手くいきません。どこに問題があるのでしょうか?
#include "DxLib.h"
#include <math.h>
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle, ModelComp ;
VECTOR CameraPos ;
VECTOR CharaPos ;
VECTOR vCamDir ;
float x=100.0f,y=-400.0f,z=200.0f,x2=100.0f,y2=0.0f,z2=200.0f;
float Roll=0.0f;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
ChangeWindowMode(TRUE);
// モデルの読み込み
ModelHandle = MV1LoadModel( "キャラ.pmd" ) ;
ModelComp = MV1LoadModel( "比較用モデル.mqo" );
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;
// 3Dモデルのスケールを均等に50倍にする
MV1SetScale( ModelHandle, VGet( 50.0f, 50.0f, 50.0f ) ) ;
// カメラの座標を初期化
CameraPos.x = x2 + 900 * sin(Roll);
CameraPos.y = y2;
CameraPos.z = z2 - 900 * cos(Roll);
// キャラの位置を初期化
CharaPos.x = x;
CharaPos.y = y;
CharaPos.z = z;
//カメラ移動方向ベクトルを正規化してスケーリング→vCamDirは速度ベクトルとして利用
vCamDir = VGet(x-x2,0,z-z2);
vCamDir = VNorm(vCamDir);
vCamDir = VScale(vCamDir,20.0f/3.0f);
// ESCキーが押されるかウインドウが閉じられるまでループ
while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
//AorDキーでカメラ位置変更
if( CheckHitKey( KEY_INPUT_A ) == 1)
{
Roll += PHI_F / 60.0f;
CameraPos.x = x2 + 900 * sin(Roll);
CameraPos.z = z2 - 900 * cos(Roll);
}
if( CheckHitKey( KEY_INPUT_D ) == 1)
{
Roll -= PHI_F / 60.0f;
CameraPos.x = x2 + 900 * sin(Roll);
CameraPos.z = z2 - 900 * cos(Roll);
}
// 方向キーでキャラの座標を移動
if( CheckHitKey( KEY_INPUT_UP ) == 1 )
{
//キャラ位置の設定(キャラ位置=キャラ位置+速度ベクトル)
MV1SetPosition(ModelHandle,(CharaPos=VAdd(CharaPos,vCamDir)) );
}
if( CheckHitKey( KEY_INPUT_DOWN ) == 1 )
{
//同上
MV1SetPosition(ModelHandle,(CharaPos=VSub(CharaPos,vCamDir)) );
}
// カメラの位置と注視点をセット、注視点はキャラ位置よりy軸+方向に400上の点
SetCameraPositionAndTarget_UpVecY( CameraPos, VGet( x, 0.0f, z ) ) ;
// モデルの描画
MV1DrawModel( ModelHandle) ;
// 比較用モデルを描画
MV1DrawModel(ModelComp);
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
今のところこのようなプログラムになっています。正直かなり滅茶苦茶です…