我正在研究Direct3D9空間模擬器遊戲,其中我需要創建一個包含玩家飛船位置和角度的相機。目前,我限制我的代碼只是爲了前後移動,上下移動以及掃射。下面是我的代碼,它有一個問題。除了LocalUp(D3DXVECTOR3(0.0f,1.0f,0.0f))和LocalAhead(D3DXVECTOR3(0.0f,0.0f,0.0f)),構造函數中的所有矢量都被初始化爲D3DXVECTOR3(0.0f, ,0.0f,1.0f)),浮點數設爲0.0f;Direct3D9遊戲:宇宙飛船相機
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'),也會發生這種情況。有人可以解釋我爲什麼會發生這種情況,我該如何解決這個問題?
我還會問另一個問題:如果沒有按鍵被按下,我怎樣才能緩慢減少strafe和Y軸的速度?我想在遊戲中實現慣性效果。
如果有人能夠幫助我,請回復!
編輯:NEW CODE:
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++我會推薦你使用類而不是全局變量 – Quest 2014-09-13 16:41:16
我正在使用類,我使用全局變量,因爲在這裏發佈會更容易。 – 2014-09-13 16:52:08