我在相机旋转的数学方面有问题,更像是我缺乏这方面的知识并且在互联网上找不到任何相关信息(阅读,很可能不知道正确的搜索关键字)
无论如何,这就是我正在尝试做的(伪代码):
RotateCamera(angle,axis){
Quaternion rotation = cam.getRotation();
Quaternion rot = new Quaternion();
rot.fromAngleNormalAxis(angle, axis);
rotation.multLocal(rot);
cam.setRotation(rotation);
}
update(float value){ // just to show what input I use the RotateCamera method for the directions
RotateCamera(value,Vector3f(0,1,0)) // left
RotateCamera(-value,Vector3f(0,1,0)) // right
RotateCamera(value,Vector3f(1,0,0)) // up
RotateCamera(-value,Vector3f(1,0,0)) // down
}
现在效果很好,但有时凸轮会滚动,而不仅仅是偏航/俯仰。这样做的正确方法是什么?
最佳答案
仅给出了一些代码,很难确定。但看起来您已经将旋转轴硬编码到您的更新方法中。关于旋转(无论是用四元数还是矩阵表示)的事情是它们的乘法不是“可交换的”,这意味着进行相同的两次旋转但顺序相反不会给出相同的结果。
看起来你假设相机面向 (0,0,1) 方向,我们称它为 z 轴,y 轴 (0,1,0) 从你的顶部出来头。只要这个假设成立,你向上、向下、向左和向右看的旋转轴就是 (1,0,0)、(1,0,0)、(0,1,0) 和 (0 ,1,0) 因为它们似乎在您的代码片段中。但是假设您刚刚向左旋转了 90 度。这会将相机的 View 从 (0,0,1) 方向发送到 (1,0,0) 方向。现在假设你做了一个“向上”旋转,它被编码为围绕 (1,0,0) 轴。这是围绕您正在查看的同一轴的旋转,效果是滚动。
这是否解决了问题?如果是这样,你应该编码你的旋转轴 w.r.t.相机的当前方向。
关于math - 四元数的相机旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8069695/