如何从前向、向上和向右向量计算欧拉角?

Clo*_*kex 4 c++ vector angle quaternions euler-angles

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

事实:

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

我正在尝试做的事情:

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

问题:

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

我需要的:

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

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

任何帮助将非常感激!

Clo*_*kex 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);
Run Code Online (Sandbox Code Playgroud)

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

我不知道您实际上可以单独使用 quat 的那部分。

  • 是的,有一整类数学运算可以应用于四元数。例如,如果您需要连接旋转(例如执行层次变换),您只需像矩阵一样将两个四元数相乘。 (2认同)