3d 三维空间中摄像机的旋转与平移

3d 三维空间中摄像机的旋转与平移,3d,c++11,3d,C++11,我在3D空间中平移和旋转相机时有点小问题。在Direct3D9中,相机被定义为位置、注视和向上轴(作为3d矢量)。因此,我存储了相机的旋转和位置,在为新帧定义相机时,我通过旋转旋转观察向量和上轴,并设置位置。当平移相机时,我做了平移,旋转它,平移相机的位置,并以此来观察矢量。但是过了一段时间,注视向量和新的平移不再对齐——也就是说,当平移向量是定义向前的原始注视向量的直倍数时,相机不再向前移动。我不明白为什么会发生这种情况-有什么建议吗?你能体验一下吗?我以前也曾遇到过这种情况,所以我放弃了向量

我在3D空间中平移和旋转相机时有点小问题。在Direct3D9中,相机被定义为位置、注视和向上轴(作为3d矢量)。因此,我存储了相机的旋转和位置,在为新帧定义相机时,我通过旋转旋转观察向量和上轴,并设置位置。当平移相机时,我做了平移,旋转它,平移相机的位置,并以此来观察矢量。但是过了一段时间,注视向量和新的平移不再对齐——也就是说,当平移向量是定义向前的原始注视向量的直倍数时,相机不再向前移动。我不明白为什么会发生这种情况-有什么建议吗?

你能体验一下吗?我以前也曾遇到过这种情况,所以我放弃了向量,转而使用

你会有这种感觉吗?我以前也曾遇到过这种情况,所以我放弃了向量,转而使用

我不这么认为。用于创建视图矩阵的D3DX函数仅使用D3DXVector3。我不能使用四元数。@DeadMG,如果问题是这样的话,你可以用D3DXVECTOR3乘以D3DX四元数。听起来很像。@Moo Juice:那为什么LookAt向量和translation向量没有相同的万向节锁呢?我也没有找到任何函数将D3DXVECTOR3与D3DX四元数相乘,并且也检查了运算符重载。我通过每次计算一个新的LookAt向量来解决这个问题,而不是缓存它并尝试用正确的转换来更新它。这肯定解决了眼前的问题。@DeadMG,很高兴解决了它。该函数实际上不在DirectX SDK(AFAIK)中。我可以编辑我的答案来显示,如果你想它作为未来的参考?我不这么认为。用于创建视图矩阵的D3DX函数仅使用D3DXVector3。我不能使用四元数。@DeadMG,如果问题是这样的话,你可以用D3DXVECTOR3乘以D3DX四元数。听起来很像。@Moo Juice:那为什么LookAt向量和translation向量没有相同的万向节锁呢?我也没有找到任何函数将D3DXVECTOR3与D3DX四元数相乘,并且也检查了运算符重载。我通过每次计算一个新的LookAt向量来解决这个问题,而不是缓存它并尝试用正确的转换来更新它。这肯定解决了眼前的问题。@DeadMG,很高兴解决了它。该函数实际上不在DirectX SDK(AFAIK)中。我可以编辑我的答案,以显示它,如果你想它作为未来的参考?