为什么3D旋转矩阵方法通常使用单独的矢量和角度而不是常规的欧拉角?

问题描述 投票:-2回答:3

为什么3D旋转矩阵方法通常使用单独的矢量和角度而不是常规的欧拉角?

例如,在glm中,给出mat4 model和vec3 rotation,而不是:

model = glm::rotate (model, rotation);

为什么我要写:

model = glm::rotate (model, rotation.x, glm::vec3 (1, 0, 0));
model = glm::rotate (model, rotation.y, glm::vec3 (0, 1, 0));
model = glm::rotate (model, rotation.z, glm::vec3 (0, 0, 1));

为什么他们不是简单地将它作为单个Euler旋转向量实现,几乎简化了每一段代码以便使用该库?我也在其他实现中看到了这一点。

math matrix vector glm-math
3个回答
0
投票

首先,它理论上优雅地将所有旋转的集合视为所有单位向量和角度的集合。如果你组合两个旋转你得到第三个这样的旋转。

代码内部将旋转表示为矩阵或可能是四元数。如果它的后者特别容易在四元数和轴角模型之间进行。

如果您的旋转指定为欧拉角,那么您可以通过三个单独旋转的简单组合来获得旋转矩阵。如果您的API仅允许欧拉角,但是您在轴角度中指定了旋转,那么执行逆转就不那么容易了,那么计算欧拉角是很棘手的。

因此,API的设计者将选择理论上优雅的方法,易于转换为内部格式,并提供可与各种输入一起使用的系统。根据他们想要制作API的简约程度,他们可以根据欧拉角添加一种方便的输入方法。


0
投票

因为欧拉角一般不是一个好主意。你有6排序变换的组合,这意味着使用这样的API将导致混淆。

另一方面,以(0,0,0)为原点的旋转矢量可以直接想象和描述,也更准确。我用这种旋转有两种主要方法:

但也有其他人喜欢使用四元数等。

新手往往倾向于倾向于欧拉角度,因为它们似乎很容易实现,但它们的缺点是如此重要并且经常被完全忽略,因此它们仍然与它们保持同样的优点让我感到痛苦,因为许多优秀的游戏和应用程序仍在使用它们并承受后果由于奇点和可怕性正确处理它们。


0
投票

为什么他们不是简单地将它作为单个Euler旋转向量实现,几乎简化了每一段代码以便使用该库?

因为它并没有“简化每一段代码以便使用该库”。欧拉角在建模工具,教程和由不熟悉图形的人编写的代码中很常见。但是,当严肃的图形应用程序表示对象的方向时,它通常作为矩阵本身或四元数。后者可以被认为是角度/轴旋转的编码。

可以组成矩阵和四元数。欧拉角不能。可以平滑地插入四元数,从而允许字符的动画。插值多个欧拉角导致非常不幸的结果。对欧拉角施加轴向旋转受万向节锁定;将旋转应用于方向(矩阵或四元数)则不会。等等。

欧拉角是一种新手陷阱。它们是非常容易理解的东西,但在最常见的情况下最终不是很有用。拥有不能满足此类陷阱的API更好。

实际上,没有一组欧拉角; 3轴旋转应用于结果的顺序。如果以不同的顺序应用相同的角度,则会得到不同的结果。使用欧拉角的人通常会根据需要选择不同的欧拉角度排序。

所以有一个选择特定欧拉顺序的glm::rotate函数对于需要不同的人来说是没用的。

© www.soinside.com 2019 - 2024. All rights reserved.