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

标签 3d quaternions

是否有可能将四元数限制为仅在 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/

相关文章:

c++ - 开放世界 3d 环境的最佳 map 格式

java - Libgdx 在 3D 中创建天空/环境

c++ - 四元数到方向 vector

unity-game-engine - 计算盒子的边界,包括旋转

ios - SCN四元数乘法

c++ - 如何找到从一个 vector 到另一个 vector 的正确旋转?

python - 使用向量叉积隐藏 3D 人脸

3d - 什么是好的免费骨骼动画模型格式?

algorithm - 如何定位相机以使我的主要对象完全可见并适合屏幕?

3d - 将 Unity 转换转换为 THREE.js 旋转