当我尝试改变方向时,我的相机围绕一个点旋转。如果我旋转我的相机,例如说,在Y轴上旋转30度,而不是相机朝右看30度,相机将旋转它正在看的点。为什么我的相机用这个数学旋转一点?
o is the camera, A and B are 3D models. The lines show line-of-sight.
This is what I expect:
A B
| >/
|/
|/
|/
o
This is what actually happens:
A B
|\
| \
| \
| > \
o
现在,根据我的理解,为了移动相机,我必须以相反的量移动世界。所以如果我想在Z轴上移动+1,我会在Z轴上翻译世界-1。由于我使用四元数来表示方位,因此我使用相机四元数的倒数(因为方向总是单位四元数,我使用共轭进行优化,而不是计算倒数)以适当的量旋转世界。
这里是我怎么转换四元数矩阵,其中q是倒四元数:
[1 - 2 * (q.y * q.y + q.z * q.z) 2 * (q.x * q.y - q.w * q.z) 2 * (q.x * q.z + q.w * q.y) 0]
|2 * (q.x * q.y + q.w * q.z) 1 - 2 * (q.x * q.x + q.z * q.z) 2 * (q.y * q.z - q.w * q.x) 0|
|2 * (q.x * q.z - q.w * q.y) 2 * (q.y * q.z + q.w * q.z) 1 - 2 * (q.x * q.x + q.y * q.y) 0|
[0 0 0 1]
在那之后,我设置的矩阵的平移分量:
[... ... ... -x]
|... ... ... -y|
|... ... ... -z|
[0 0 0 1]
最后我将它乘到模型视图矩阵堆栈上,然后渲染所有对象。 我很确定这个数学是正确的,但它不会产生我期待的结果。显然,向前和向右的向量是问题,所以我唯一的问题是为什么他们错了,如果我想要得到我期待的结果,应该如何设置它们。谢谢。编号: 我从this guy's quaternion camera class找到解决方案。首先我构造一个旋转矩阵,就像我之前做的那样,但是我从第一,第二和第三列(分别为xa,ya和za)获取矩阵的列向量。然后,我这样设置矩阵的平移分量:
[... ... ... -xa.dotProduct(cameraPos)]
|... ... ... -ya.dotProduct(cameraPos)|
|... ... ... -za.dotProduct(cameraPos)|
[... ... ... ... ]
然后将所得矩阵可乘以到模型视图矩阵堆栈,它完美。
使您的编辑解决方案,并接受它。这就是我们如何标记在这里解决的问题。我想你应该得到一些解释。我会为此写一个答案。 – datenwolf 2012-02-02 08:41:10