【发布时间】:2014-09-13 15:55:58
【问题描述】:
我正在开发一个 Direct3D9 空间模拟器游戏,在该游戏中我需要创建一个摄像机来保持玩家飞船的位置和视角。目前,我将代码限制为前后移动、上下移动以及扫射。下面是我的代码,它有问题。一切都包装在一个类中,所有向量都在构造函数中初始化为 D3DXVECTOR3(0.0f, 0.0f, 0.0f),除了 LocalUp( D3DXVECTOR3(0.0f, 1.0f, 0.0f) ) 和 LocalAhead( D3DXVECTOR3(0.0f) , 0.0f, 1.0f) ) 并且浮点数设置为 0.0f;
D3DXVECTOR3 Position, LookAt ,PosDelta, PosDeltaWorld, WorldAhead, WorldUp, LocalUp,
LocalAhead, Velocity;
D3DXMATRIX View, CameraRotation;
float SpeedX, SpeedY, SpeedZ;
void Update(float ElapsedTime)
{
SpeedX = 0.0f;
SpeedY = 0.0f;
if(IsKeyDown('A'))
{
SpeedX = -0.02f;
Velocity.x -= SpeedX;
}
if(IsKeyDown('D'))
{
SpeedX = 0.02f;
Velocity.x += SpeedX;
}
if(IsKeyDown('X'))
{
SpeedZ += 0.01f;
Velocity.z += SpeedZ;
}
if(IsKeyDown('Z'))
{
SpeedZ -= 0.01f;
Velocity.z -= SpeedZ;
}
if(IsKeyDown('W'))
{
SpeedY = 0.02f;
Velocity.y += SpeedY;
}
if(IsKeyDown('S'))
{
SpeedY = -0.02f;
Velocity.y -= SpeedY;
}
D3DXVec3Normalize(&Velocity, &Velocity);
PosDelta.x = Velocity.x * SpeedX;
PosDelta.y = Velocity.y * SpeedY;
PosDelta.z = Velocity.z * SpeedZ;
D3DXMatrixRotationYawPitchRoll(&CameraRotation, 0, 0, 0);
D3DXVec3TransformCoord(&WorldUp, &LocalUp, &CameraRotation);
D3DXVec3TransformCoord(&WorldAhead, &LocalAhead, &CameraRotation);
D3DXVec3TransformCoord(&PosDeltaWorld, &PosDelta, &CameraRotation);
Position += PosDeltaWorld;
LookAt = Position + WorldAhead;
D3DXMatrixLookAtLH(&View, &Position, &LookAt, &WorldUp);
}
在应用程序的另一部分调用“D3DXMatrixPerspectiveFovLH”和“IDirect3DDevice9::SetTransform”函数。由于它们工作正常,我将不再谈论它们。
问题是,每当Z轴速度很大时,我单独或同时扫射和横向移动,相机的Z轴速度就会降低。而且,当速度几乎为0后,再按一下加速键,矢量的感觉就反转了,然后又恢复正常了。当以相当高的速度改变矢量的感觉时也会发生这种情况(例如,按下 X 然后立即按下“Z”)。谁能解释一下为什么会发生这种情况以及我该如何解决这个问题?
我还要问另一个问题:如果不按任何键,如何才能慢慢降低扫射和 Y 轴速度?我想在游戏中实现惯性效果。
如果有人可以帮助我,请回复!
编辑:新代码:
void NewFrontiers3DEntityPlayer::OnFrameUpdate(float ElapsedTime)
{
State.SpeedX = 0.0f;
State.SpeedY = 0.0f;
if(IsKeyDown(State.Keys[CAM_STRAFE_LEFT]))
State.SpeedX = -0.02f;
if(IsKeyDown(State.Keys[CAM_STRAFE_RIGHT]))
State.SpeedX = 0.02f;
if(IsKeyDown(State.Keys[CAM_MOVE_FORWARD]))
{
State.SpeedZ += 0.01f;
}
if(IsKeyDown(State.Keys[CAM_MOVE_BACKWARD]))
{
State.SpeedZ -= 0.01f;
}
if(IsKeyDown(State.Keys[CAM_MOVE_UP]))
State.SpeedY = 0.02f;
if(IsKeyDown(State.Keys[CAM_MOVE_DOWN]))
State.SpeedY = -0.02f;
State.Velocity.x = State.SpeedX;
State.Velocity.y = State.SpeedY;
State.Velocity.z = State.SpeedZ;
D3DXVec3Normalize(&State.Velocity, &State.Velocity);
State.PosDelta.x = State.Velocity.x * ElapsedTime;
State.PosDelta.y = State.Velocity.y * ElapsedTime;
State.PosDelta.z = State.Velocity.z * ElapsedTime;
D3DXMatrixRotationYawPitchRoll(&State.CameraRotation, 0, 0, 0);
D3DXVec3TransformCoord(&State.WorldUp, &State.LocalUp, &State.CameraRotation);
D3DXVec3TransformCoord(&State.WorldAhead, &State.LocalAhead, &State.CameraRotation);
D3DXVec3TransformCoord(&State.PosDeltaWorld, &State.PosDelta, &State.CameraRotation);
State.Position += State.PosDeltaWorld;
State.LookAt = State.Position + State.WorldAhead;
D3DXMatrixLookAtLH(&State.View, &State.Position, &State.LookAt, &State.WorldUp);
return;
}
“状态”是一个包含有关相机的所有信息的结构。
【问题讨论】:
-
由于您使用的是 c++,我建议您使用类而不是全局变量
-
我正在使用类,我使用了全局变量,因为在这里发布要容易得多。
标签: c++ vector camera directx direct3d9