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

时间:2014-06-14 04:13:24

标签: c++ vector angle quaternions euler-angles

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

事实:

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

我想做的事情:

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

问题:

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

我需要什么:

我需要从前向,向上和向右矢量计算可靠的3D欧拉角(例如,从+到#"随机")。我意识到这有点复杂,但这就是我在这里问的原因:我缺乏自己解决这个问题的知识和经验。

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

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:3)

首先,我想说我完全解决了我的问题,因为@ Tobias的努力。非常感谢!这段时间我一直在从错误的一端接近问题。我假设我需要以特定的方式使用AddTorque(使用Euler角度)并从那里开始工作,但是@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需要规范化,不确定。我会解决这个问题:)

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

答案 1 :(得分:1)

首先,我认为你会在Unity论坛中为Unity特定问题带来更好的运气(:那就是说,如果你正在使用的话,我认为你误解了AddTorque()接口:http://docs.unity3d.com/ScriptReference/Rigidbody.AddTorque.html < / p>

不是传递欧拉角,而是将矢量传递给旋转轴的函数。我不熟悉Unity,但我相信矢量的长度指定了要添加多少扭矩。欧拉角本质上是旋转的不良表示,所以你应该总是假设(除非另有说明)完全成熟的API在旋转时使用四元数,轴/角度对或矩阵。欧拉角更适合最终用户。