是否有可能将四元数限制为仅在 x 和 y 轴上移动(例如在 Eulers-yaw 和 pitch 中,没有滚动)?我有什么方程式或类似的东西可以做到这一点吗?
一些例子:
运动应该像这样:http://360.art.pl/experimental/1/
但是当我在四元数上构建我的播放器时,它没有限制,我不知道如何修复它 http://360.art.pl/experimental/2/
最佳答案
您可以尝试直接从 yaw/pitch 构造四元数:
q = quat_from_axis_angle(up_vector, yaw) * quat_from_axis_angle(local_right, pitch)
(您可能需要以相反的顺序将它们相乘,具体取决于您将它们转换为旋转矩阵的精确程度),或者在每次更改它们时重新对齐它们:
rotated_right = apply_rotation(q, local_right);
projected_right = rotated_right - dot(rotated_right, up_vector) * up_vector;
realign = quat_align_vector(rotated_right, normalized(projected_right));
q = realign * q
projected_right
这是 rotated_right
的投影到水平面上。如果不滚动,这两个向量必须相同,这意味着 dot(rotated_right, up_vector) = 0
.最后一个等式是必须满足的实际约束。在 q
中是二次的.例如。为 local_right=(1,0,0)
, 和 up_vector=(0,0,1)
,变成 dot(q*(1i+0j+0k)*conj(q), 0i+0j+1k)=2*x*z-2*w*y=0
, 与 q=w+xi+yi+zk
.您可以找到
quat_from_axis_angle
的公式和 apply_rotation
在 http://en.wikipedia.org/wiki/Quaternion和 http://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation .至于quat_align_vector
,一种方法是quat_align_vector(src, dst) = sqrt([dot(src, dst), cross(src, dst)])
与
[a, b]
用实部生成四元数 a
, 和一个虚部 b
. Sqrt(x)
可以计算为 exp(ln(x)/2)
(这些功能也在 wiki 上)。你也可以尝试用 exp(ln(x)/2*tick*realign_rate)
替换 sqrt为了平滑恢复向上向量:)。或者反其道而行之,稍微简化一下公式:quat_align_vector(src, dst) = [dot(halfway, dst), cross(halfway, dst)],
halfway = normalized(normalized(src) + normalized(dst))
另见 https://stackoverflow.com/a/1171995 .
编辑:更正的向量,添加了约束。
关于3d - 四元数 - 如何限制轴?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11646863/