将四元数与 qmultiply 组合

东方俯仰偏航roll.gif

下载场景:文件:orient_qmultiply_compose.hip

跟拉夫加朵学的一招,干杯!

上面示例中的某处是 2 个四元数技巧,对事物使用 qmultiply,并从角度/轴对创建四元数。Raph 向我展示了一种结合这些知识的优雅方式。假设您有一堆具有任意方向的点,并且您希望将它们全部在 x 轴上旋转 20 度,但在它们的局部旋转轴上。

你可以做的是创建一个临时四元数,它围绕原点 x 20 度,然后将其与原始四元数 qmultiply。简单的!

创建临时四元数比您想象的要容易;四元数函数可以取一个角度和轴,甚至更懒,定义轴向量,然后缩放该向量。轴矢量的长度将用作旋转量。例如:

  1. vector4 foo = quaternion({1,0,0}*0.2));

所以这是围绕 x 轴 ( 1,0,0 ) 旋转 0.2 弧度(大约 11 度)。

要将其添加到现有的方向,请使用 qmultiply:

  1. @orient = qmultiply(@orient, foo);

对此进行扩展,您可以为局部 x、y、z 定义临时四元数,使用通道来设置旋转量,并将每个四元数 qmultiply 到 @orient 上。这就是下面的Vex所做的,提供简单的 xyz 控制(我将其命名为 pitch/yaw/roll 因为它听起来更酷)。

  1. vector4 pitch = quaternion({1,0,0}*ch('pitch'));
  2. vector4 yaw = quaternion({0,1,0}*ch('yaw'));
  3. vector4 roll = quaternion({0,0,1}*ch('roll'));
  4. @orient = qmultiply(@orient, pitch);
  5. @orient = qmultiply(@orient, yaw);
  6. @orient = qmultiply(@orient, roll);

一个很好的额外技巧是通过@ptnum 驱动旋转量,例如

  1. float speed = rand(@ptnum,123) * @Time;
  2. float offset = rand(@ptnum,456);
  3. float flap = sin(speed+offset);
  4. vector4 pitch = quaternion({1,0,0}*flap);
  5. @orient = qmultiply(@orient, pitch);

这样一来,所有方向都将沿其局部 x 轴摆动,但具有独立的速度和偏移量。