gpt4 book ai didi

math - 没有欧拉角的四元数旋转

转载 作者:行者123 更新时间:2023-12-03 18:44:45 24 4
gpt4 key购买 nike

this comment强烈建议我们永远不要使用欧拉角。我知道欧拉角有一些限制,最显着的是万向节锁定,但我想知道最好的技术,或一组技术,在没有欧拉角的情况下通常使用的技术?

关于这个主题的大多数讨论都涉及从欧拉角转换为四元数,这是一件很简单的事情。但我读过的关于在没有欧拉角的情况下进行旋转的唯一方法是使用以下技术从两个向量创建四元数,如 Stan Melax 在“Game Programming Gems”中的“The Shortest Arc Quaternion”一文所述:

template <typename T>
inline QuaternionT<T> QuaternionT<T>::CreateFromVectors(const Vector3<T>& v0, const Vector3<T>& v1)
{

Vector3<T> c = v0.Cross(v1);
T d = v0.Dot(v1);
T s = std::sqrt((1 + d) * 2);

QuaternionT<T> q;
q.x = c.x / s;
q.y = c.y / s;
q.z = c.z / s;
q.w = s / 2.0f;
return q;
}

这是链接评论中提到的方法吗?

最佳答案

方向

方向是变换在坐标系内定向对象的方式。方向是一个绝对量,如位置或标量。方向在概念上是一个值。并且有一些操作可以应用于方向,具体取决于它们的表示。

与向量和标量不同,方向可以用多种方式表示。

“使用欧拉角”是什么意思?

欧拉角是围绕 3 个固定的正交轴进行 3 次旋转的系列。这些应用的顺序很重要,通常由惯例确定。

“使用欧拉角”意味着欧拉角是您的代码存储和操作对象方向的方式。您最终如何组合这些角度以生成矩阵无关紧要。重要的是您的代码会将方向视为 3 个角度。例如,当您对方向应用旋转偏移时,它将作为旋转角度的偏移提供,这些偏移将直接应用于存储的欧拉角。

“使用矩阵”是什么意思?

我知道没有人这么说,但我有一点要在这里说明。

“使用矩阵”意味着旋转矩阵是您的代码存储和操作对象方向的方式。如果某段代码想要旋转对象,他们将在左侧或右侧应用一个矩阵。即使该矩阵是通过一些轴向旋转计算的,代码仍然在矩阵上执行基本操作,而不是角度。

“使用四元数”是什么意思?

出于本讨论的目的,“四元数”是用于对方向进行编码的 4 元素单位向量。四元数可以对它们进行类似矩阵的操作,例如组合和求逆。四元数必须保持标准化才能正确编码方向。

“使用四元数”意味着您将对象的方向和操作存储为四元数。在最基本的层面上,您对方向的所有操作都在处理四元数数学。

如何调整方向

欧拉角经常被使用,因为它们(理论上)可以直观地进行调整:您只需增加或减少一个角度。如果要在 X 方向上将对象旋转 -10 度,只需从 X 轴旋转中减去 10。但是我们不想使用它们,因为它们很糟糕,所以让我们看看其他方向表示。

要将方向调整为矩阵,您必须做两件事。您必须将当前方向与偏移旋转矩阵相乘(如果您想在 X 轴上旋转 -10 度,则为此创建一个角度/轴矩阵并将其右乘)。然后,由于计算机的精度有限,您必须重新正交化矩阵。如果你不做第二步,你的矩阵最终将不再是正交的,从而不再是一个方向。

对矩阵进行正交化很难。这就是我们使用四元数的(部分)原因。对四元数进行归一化很容易;它只是 4 元素向量归一化。由于四元数和矩阵具有类似的运算,因此相同的数学运算适用于两者。所以它们看起来几乎相同。

关于math - 没有欧拉角的四元数旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17044296/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com