gpt4 book ai didi

3d - 四元数 - 如何限制轴?

转载 作者:行者123 更新时间:2023-12-04 13:14:07 24 4
gpt4 key购买 nike

是否有可能将四元数限制为仅在 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_rotationhttp://en.wikipedia.org/wiki/Quaternionhttp://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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com