【问题标题】:How to get a Vector3 rotation between two Quaternions如何在两个四元数之间获得 Vector3 旋转
【发布时间】:2019-12-21 17:47:15
【问题描述】:

我正在编写一个使用Configurable Joint 旋转Rigidbody 的脚本。我已经找到了targetRotation,但现在我正在努力解决targetAngularVelocity,如果设置正确,它应该可以帮助我避免晃动。

targetAngularVelocitydocumantation 中定义如下:“这是一个Vector3。它定义了关节应旋转到的所需角速度”。问题是我不知道如何根据两个Quaternions 获得这个Vector3 - 对象的当前旋转和目标旋转。

我理解不正确吗?有没有基于两个Quaternions返回旋转向量的函数?

【问题讨论】:

  • 速度只是你希望它移动的速度......这就像问“我有A点和B点,我如何将它们结合起来以获得两者之间的速度”.. .
  • @RonBeyer 也许我不够清楚。我正在使用这个 Configurable Joint 在 A 点和 B 点之间旋转。现在我想设置 targetAngularVelocity 以匹配该旋转 - 所以我需要基于两个 Quaternions 获得一个旋转向量。
  • 您可以尝试使用欧拉空间表示 quaternionB.eulerAngles - quaternionA.eulerAngles 如果您是这个意思。没有你的代码有点难以分辨
  • @derHugo 已经尝试过了,似乎没有用。此返回的值与对象的实际 angularVelocity 完全不同(由 Spring 驱动器旋转到 targetRotation - 因此它们应该匹配,或者至少相似)。

标签: c# unity3d quaternions


【解决方案1】:

所以在数学上,四元数代表刚体的方向。首先考虑前向问题,看看方向 q_1 在对 t 应用旋转速度 ω 后如何转换为另一个方向 q_2 时间。

在数学上,旋转向量的大小为 ω,方向为 k,使得 ω = ω* k

这是通过四元数乘法完成的

q_2 = q_ω * q_1

其中q_ω表示绕k轴旋转角度θ=ω*t。

反过来,你需要找到 q_ω

var q_ω = q_2 * Quaternion.Inverse(q_1);

并提取旋转轴和角度

q_ω.ToAngleAxis(out float angle, out Vector3 axis);

并合成旋转速度矢量,对应于time 秒内的此变换。

var ω = (angle/time)*axis;

【讨论】:

  • 哇,好在总有人知道四元数的相关知识^^
  • 虽然我知道很多 3D 物理和刚体力学,而且我是一名 C# 程序员,但我实际上从未玩过 Unity。您的问题的答案似乎需要我没有的 Unity 模拟引擎知识。
  • @derHugo 确实我知道很多四元数。感谢您的评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-23
  • 2017-09-07
  • 2014-02-26
  • 2016-11-22
  • 1970-01-01
  • 2018-11-18
  • 2018-02-19
相关资源
最近更新 更多