我正在为类项目制作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上看到了很多类似的问题,但他们似乎都使用了一些对我来说没有意义的稍微不同的实现。
答案 0 :(得分:0)
查看:强>
对于平移,仅提取要从矩阵移动的方向向量,并将其添加到矩阵的位置。请注意,directx具有行方式矩阵而不是像OpenGL
那样的列式矩阵因此,对于x-movement,提取X=(Xx,Xy,Xz)
并将m*X
添加到矩阵原点(x0,y0,z0)
m
是移动步长(+/-)4.0f*timer.Delta();