2015-05-22 98 views
0

我正在爲類項目製作FPS樣式相機。我目前使用2個Vec3s來保持相機的位置和旋轉。用我目前的代碼,我只能在全球座標軸方面進行翻譯,而不是以我當前所面對的方向進行翻譯。我如何使用相機的旋轉爲了在我想要的方向上進行翻譯? EX:按下'W'會使攝像機沿其局部Z軸向前平移。沿本地軸翻譯3D物體

camMat = Matrix4Identity(); 

//Input for camera 
if (GetAsyncKeyState('Q')) 
{ 
    camRot.y += 60.0f*timer.Delta(); 
} 
if (GetAsyncKeyState('E')) 
{ 
    camRot.y -= 60.0f*timer.Delta(); 
} 
if (GetAsyncKeyState('W')) 
{ 
    camPos.z += 4.0f*timer.Delta(); 
} 
if (GetAsyncKeyState('S')) 
{ 
    camPos.z -= 4.0f*timer.Delta(); 
} 
if (GetAsyncKeyState('A')) 
{ 
    camPos.x -= 4.0f*timer.Delta(); 
} 
if (GetAsyncKeyState('D')) 
{ 
    camPos.x += 4.0f*timer.Delta(); 
} 

camMat = Matrix4Multiply(camMat, Matrix4RotationX(camRot.x)); 
camMat = Matrix4Multiply(camMat, Matrix4RotationY(camRot.y)); 
camMat = Matrix4Multiply(camMat, Matrix4RotationZ(camRot.z)); 
camMat = Matrix4Multiply(camMat, Matrix4Translate(camPos.x, camPos.y, camPos.z)); 

編輯:我看到很多類似的問題對SO,但他們似乎都使用時,不會對我做的意義略有不同的實現。

+0

這實在是一個數學問題,而不是C++問題。如果我對洛杉磯的記憶沒有讓我失望(很可能),你應該能夠將你的方向矢量與你的旋轉矩陣相乘以得到旋轉的方向。 – Cubic

回答

0

見:

對於翻譯只能提取你想從你的矩陣移動,並把它添加到矩陣的位置方向向量。要注意的是DirectX的已排明智的矩陣,而不是逐列,比如OpenGL

所以對於X-運動提取X=(Xx,Xy,Xz),並添加m*X到矩陣起源(x0,y0,z0)

  • 其中m是移動步(+/-)4.0f*timer.Delta();
  • 剛請記住,攝像機矩陣通常是一個逆矩陣,並且在DirectX矩陣中轉發矩陣中的位置(請參見第二個鏈接)