繁体   English   中英

沿局部轴平移3D对象

[英]Translating a 3D object along a local axis

我正在为班级项目制作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上看到很多类似的问题,但是它们似乎都使用稍微不同的实现方式,这对我来说没有意义。

看到:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM