初心者です、DXライブラリで2Dホーミングミサイルのやアクションサンプルを参考に色々やってみたのですが計算が合いません。移動ベクトルから向きを求めて、その向きから移動ベクトルを求めるようにするにはどうしたら良いでしょうか?
うまくいかないサンプルを載せてみます。
#include "DxLib.h"
#include "Player.h"
#include <math.h>
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
ChangeWindowMode(TRUE),DxLib_Init(),SetDrawScreen( DX_SCREEN_BACK );
MATRIX Matrix ;
VECTOR Vect1, Vect2 ;
//プレイヤ
//---------------------------------------------------------------------
#define PLAYER_ANGLE_SPEED 0.02f // 角度変化速度
VECTOR Position ; // 座標
VECTOR TargetMoveDirection ; // モデルが向くべき方向のベクトル
float Angle ; // モデルが向いている方向の角度
int ModelHandle ; // モデルハンドル
VECTOR MoveVec ;
float TargetAngle ; // 目標角度
float SaAngle ; // 目標角度と現在の角度との差
//--------------------------------------------------
Position = VGet( 0.0f, 0.0f, 0.0f ) ;
Angle = 0.0f ;// 回転値は0
TargetMoveDirection = VGet( 1.0f, 0.0f, 0.0f ) ;// 初期状態でプレイヤーが向くべき方向はX軸方向
ModelHandle = MV1LoadModel( "model/arrow.mqo" ) ;
MV1SetPosition( ModelHandle, Position ) ;//3Dモデルを移動
//------------------------------------------------------------
//敵
//------------------------------------------------------------------------
VECTOR PositionEnemy ; // 座標
int ModelHandleEnemy;
//-----------------------------------------------------------------------
PositionEnemy = VGet( 500.0f, 0.0f, 500.0f ) ;
ModelHandleEnemy = MV1LoadModel( "model/arrow.mqo" ) ;
MV1SetPosition( ModelHandleEnemy, PositionEnemy ) ;//3Dモデルを移動
//カメラの位置と注視点をセット、注視点は原点
SetCameraPositionAndTarget_UpVecY( VGet( 0.0f, 1000.0f, 1000.0f ), VGet( 0.0f, 0.0f, 0.0f ) ) ;
//-----------------------------------------------------------------------------------------------------------------
while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){
MoveVec = VSub( PositionEnemy, Position ) ;//移動ベクトルを求める
TargetMoveDirection=VNorm( MoveVec ) ;// 移動ベクトルを正規化したものをプレイヤーが向くべき方向として保存
// 目標の方向ベクトルから角度値を算出する
TargetAngle = atan2( TargetMoveDirection.x, TargetMoveDirection.z ) ;
// 目標の角度と現在の角度との差を割り出す
// 最初は単純に引き算
SaAngle = TargetAngle - Angle ;
// ある方向からある方向の差が180度以上になることは無いので
// 差の値が180度以上になっていたら修正する
if( SaAngle < -PHI_F ){
SaAngle += TWO_PHI_F ;
}else if( SaAngle > PHI_F ){
SaAngle -= TWO_PHI_F ;
}
// 角度の差が0に近づける
if( SaAngle > 0.0f ){
// 差がプラスの場合は引く
SaAngle -= PLAYER_ANGLE_SPEED ;
if( SaAngle < 0.0f ){
SaAngle = 0.0f ;
}
}else{
// 差がマイナスの場合は足す
SaAngle += PLAYER_ANGLE_SPEED ;
if( SaAngle > 0.0f ){
SaAngle = 0.0f ;
}
}
// モデルの角度を更新
Angle = TargetAngle - SaAngle ;
MV1SetRotationXYZ( ModelHandle, VGet( 0.0f, Angle + PHI_F, 0.0f ) ) ;
MV1DrawModel( ModelHandle ) ;
MV1DrawModel( ModelHandleEnemy ) ;
// プレイヤーが向くべき方向ベクトルをプレイヤーのスピード倍したものを移動ベクトルとする
// 適当な値を Vect1 に代入
Vect1 = VGet( 10.0f, 0.0f, 10.0f ) ;
// Y軸回転行列を Matrix に代入( y度回転する )
Matrix = MGetRotY( Angle +PHI_F / 180 ) ;
// Vect1 を Matrix を使用して変換した値を Vect2 に代入
Vect2 = VTransform( Vect1, Matrix ) ;
MoveVec = VSub( Vect2, VGet(0,0,0) ) ;//2つの点から移動ベクトルを求める
TargetMoveDirection=VNorm( MoveVec ) ;//移動ベクトルを正規化したものをプレイヤーが向くべき方向として保存
Position=VAdd(VScale(TargetMoveDirection,1),Position);
MV1SetPosition( ModelHandle, Position ) ;//3Dモデルを移動
}
DxLib_End();
return 0;
}
3D版ホーミングミサイル
Re: 3D版ホーミングミサイル
89行目を変更したら
Vect1 = VGet( 10.0f, 0.0f, 10.0f ) ;
↓
Vect1 = VGet( 0.0f, 0.0f, 10.0f ) ;
なんだか個人的に満足行くカンジに解決してしまいました、お騒がせしました。
Vect1 = VGet( 10.0f, 0.0f, 10.0f ) ;
↓
Vect1 = VGet( 0.0f, 0.0f, 10.0f ) ;
なんだか個人的に満足行くカンジに解決してしまいました、お騒がせしました。