【问题标题】:Translating a 3D object along a local axis沿局部轴平移 3D 对象
【发布时间】:2015-08-04 14:13:24
【问题描述】:

我正在为一个班级项目制作一个 FPS 风格的相机。我目前正在使用 2 个 Vec3 来保持相机的位置和旋转。使用我当前的代码,我只能相对于全局轴进行平移,而不是在我当前面对的方向上。如何使用相机的旋转来向我想要的方向平移?例如:按“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 上看到了很多类似的问题,但它们似乎都使用了对我没有意义的略有不同的实现。

【问题讨论】:

  • 这真的是一道数学题,而不是 C++ 题。如果我对 LA 的记忆没有让我失望(很可能),你应该能够将你的方向向量与你的旋转矩阵相乘以获得旋转的方向。

标签: c++ matrix 3d directx


【解决方案1】:

见:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-19
    • 2019-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    相关资源
    最近更新 更多