c++ - 如何从向前、向上和向右 vector 计算欧拉角?

标签 c++ vector angle quaternions euler-angles

因为这是一个复杂的问题,通常会导致很多困惑(我以前问过这个问题的变体,但从来没有以正确的方式问过这个问题,也没有得到答案),我将尝试做这个尽可能清楚。

事实:

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

我正在尝试做的事情:

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

问题:

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

我需要什么:

我需要根据向前、向上和向右 vector 计算可靠的 3D 欧拉角(例如,不会从 + 翻转到 - “随机”的角)。我意识到这有点复杂,但这就是我在这里问的原因:我缺乏自己解决这个问题的知识和经验。

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

如有任何帮助,我们将不胜感激!

最佳答案

首先,我想说的是,由于@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 Controller 。或者 quat10 需要规范化,不确定。我会解决的:)

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

关于c++ - 如何从向前、向上和向右 vector 计算欧拉角?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24216507/

相关文章:

CSS3 - 帮助创建两个 100% 页面宽度的特定 div 形状(见附图)

c++ - 寻找引用角的算法

c++ - 复制赋值运算符=自赋值校验错误

c++ - 如何将缓冲区中的数据复制到内存中的某处(char *)

r - 按最后一个元素匹配向量

geometry - 计算闭合多边形的内部平分线

C++,无法打开源文件 "ifstream"Visual Studio

c++ - 为什么我们需要在编译期间包含 C 或 CPP 声明文件而不是像 iostream 这样的默认库?

c++ - 为什么我不能使用指针和长度创建 vector

c++ - 向上转换一个 const vector