四元数 - 如何限制轴?

Bar*_*cki 5 3d quaternions

是否有可能将四元数限制为仅在 x 和 y 轴上移动(例如在欧拉-偏航和俯仰中,没有滚动)?我有什么方程式或类似的东西可以做到这一点吗?

一些例子:

运动应该像这样:http: //360.art.pl/experimental/1/
但是当我在四元数上构建我的播放器时,它没有限制,我不知道如何修复它http://360.art。 pl/实验/2/

com*_*orm 0

让我首先描述一下你所说的约束类型。给定一个world_up向量,您希望限制旋转,使其相对于相机显得垂直。如果相机视图坐标标记为camera_upcamera_rightcamera_forward

constrain rotation matrix R such that:  dot(R*world_up, camera_right) == 0
Run Code Online (Sandbox Code Playgroud)

LookAt()这可以通过构造一组垂直坐标向量作为视图方向的函数来直接完成(例如,类似函数) view_forward

given vectors:  view_forward, world_up

Rot_forward = normalize(view_forward)
Rot_right = normalize( cross(view_forward, world_up) )
Rot_up = cross(Rot_right, Rot_forward)
Run Code Online (Sandbox Code Playgroud)

回答这个问题:我可能是错的,但我不认为这种约束可以直接用四元数来实现。如上生成旋转矩阵并将其转换为四元数会更容易。

这确实提出了一个问题:您想通过在这里使用四元数来解决什么问题?

  • 如果您需要四元数来与其他系统或库交互,那没问题。
  • 如果您试图修复不良行为,即当您的视点接近天顶时场景快速旋转,请注意这是您的约束的结果:无论您如何实现它,它都会发生。
  • 如果您尝试使用四元数来获得更自然的插值,请注意您的约束使这一点毫无意义:自然的四元数插值将违反约束。view_forward考虑到约束,插值向量而不是四元数会更自然。