沿局部轴平移3D对象

时间:2015-05-22 13:57:47

标签: c++ matrix 3d directx

我正在为类项目制作FPS风格的相机。我目前正在使用2个Vec3来保持摄像机的位置和旋转。使用我当前的代码,我只能相对于全局轴进行转换,而不是朝着当前面向的方向转换。如何使用相机的旋转以便按照我想要的方向平移? EX:按'W'会使摄像机沿其本地Z轴向前平移。

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上看到了很多类似的问题,但他们似乎都使用了一些对我来说没有意义的稍微不同的实现。

1 个答案:

答案 0 :(得分:0)

查看:

对于平移,仅提取要从矩阵移动的方向向量,并将其添加到矩阵的位置。请注意,directx具有行方式矩阵而不是像OpenGL

那样的列式矩阵

因此,对于x-movement,提取X=(Xx,Xy,Xz)并将m*X添加到矩阵原点(x0,y0,z0)

  • 其中m是移动步长(+/-)4.0f*timer.Delta();
  • 请记住,相机矩阵通常是逆矩阵
  • 和OpenGL矩阵中的位置在DirectX矩阵中转换(参见第二个链接)