- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 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/
我有一个第一人称相机 Controller 实现如下: float rotSpeed = 20.0f; xRotation += deltaPos.y * rotSpeed * Time.deltaT
我正在编写一个程序,它加载一个包含场景描述的文件,然后使用 OpenGL 显示它。我将 GLM 用于我的所有数学运算。场景文件中的旋转以四元数格式存储。我的场景管理系统以欧拉角的形式对对象进行旋转,这
我想要实现的效果是从相机的 pointOfView 位置指向一个箭头,在 x 和 z 轴上与场景(和重力)对齐,但指向与相机相同的方向。它可能看起来像这样: 现在,我将其欧拉角 x 和 z 设置为 0
我是一名优秀的程序员,十分优秀!