4

因为这是一个复杂的问题,通常会导致很多混乱(我之前已经问过这个问题的变体,但从来没有以正确的方式问过这个问题,也没有得到答案),我会尽量让这个问题变得清晰可能的。

事实:

  • 我正在使用统一。
  • 我可以从任何四元数旋转中轻松获得 Forward、Up 和 Right 向量。
  • 我不能简单地记录自己的欧拉角,修改它们并通过新的四元数应用旋转,因为对象是由物理控制的。
  • 除非它是用代码(或伪代码)编写的,否则我根本不懂数学,所以这对我最有利。
  • C++ 风格的答案对我来说是最容易理解的,但我几乎可以编写任何类型的代码。
  • 我不是想让任何人为我编写代码!我只在代码或伪代码中寻求答案,因为我从未学会阅读普通的数学曲线;我是程序员,不是数学家。
  • Unity 使用左手坐标系。X = 右,Y = 上,Z = 前。

我正在尝试做的事情:

我正在尝试在人形骨骼结构上播放动画,并使用扭矩(旋转力)将物理布娃娃推入与骨骼结构大致相同的姿势。

问题:

我可以在四元数中完全工作,直到我需要将扭矩施加到刚体上。该AddTorque 函数在欧拉角中有效工作,这意味着我不能使用四元数。我可以很容易地从四元数中提取欧拉角,但它们不可靠并且会导致布娃娃严重喷出。

我需要的:

我需要从 Forward、Up 和 Right 向量计算可靠的 3D Euler 角(例如,不会从 + 翻转到 - “随机”的那些)。我意识到这有点复杂,但这就是我在这里问的原因:我缺乏自己解决这个问题的知识和经验。

鉴于向量本身是可靠的,我认为没有理由不能从它们中计算出可靠的欧拉角。另外,我不知道欧拉角我想要或需要什么旋转顺序,但我相信以后修改它会相当容易。

任何帮助将非常感激!

4

2 回答 2

7

首先,我想说我解决了我的问题完全归功于@Tobias 的努力。非常感谢!一直以来,我一直在从错误的角度解决问题。我假设我需要以AddTorque特定方式使用(使用欧拉角)并从那里开始工作,但@Tobias(以及稍后的@JarkkoL)指出我需要以AddTorque不同的方式使用。

所以这就是我在 UnityScript(实际上是 JavaScript)中所做的:

var quat0:Quaternion;
var quat1:Quaternion;
var quat10:Quaternion;
quat0=transform.rotation;
quat1=target.transform.rotation;
quat10=quat1*Quaternion.Inverse(quat0);
rigidbody.AddTorque(quat10.x,quat10.y,quat10.z,ForceMode.Force);

而且,出乎所有人的意料,这个作品!它只是......有效!当然,刚体立方体需要很长时间才能稳定下来,但那是因为我需要一个 PID 控制器。或者可能quat10需要规范化,不确定。我会解决的:)

我不知道您实际上可以单独使用季铵盐的那一部分。

于 2014-06-15T01:05:24.550 回答
1

首先,我认为您在 Unity 论坛中遇到 Unity 特定问题的运气会更好(:也就是说,如果您正在使用这个接口,我认为您误解了 AddTorque() 接口:http: //docs.unity3d.com /ScriptReference/Rigidbody.AddTorque.html

不是传递欧拉角,而是将向量传递给作为旋转轴的函数。我不熟悉 Unity,但我相信向量的长度指定了要添加多少扭矩。欧拉角本质上是对旋转的不良表示,因此在涉及旋转时,您应该始终假设(除非另有说明)完善的 API 与四元数、轴/角度对或矩阵一起工作。欧拉角对于最终用户来说更多是一种方便的表示。

于 2014-06-14T14:34:43.820 回答