为什么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旋转向量,从而简化几乎所有使用该库的代码?我也在其他实现中也看到了这一点。
答案 0 :(得分:0)
首先,将所有旋转的集合视为所有单位矢量和角度的集合在理论上很优雅。如果将两个旋转组合在一起,则会得到第三个旋转。
代码内部将旋转表示为矩阵或四元数。如果是后者,则特别容易在四元数和轴角模型之间进行转换。
如果以欧拉角指定旋转角度,则可以通过简单地组合三个单独的旋转角度来获得旋转矩阵。如果您的API仅允许使用Euler角度,但您指定了轴角度旋转角度,那么进行相反的操作就不那么容易了,那么计算Euler角度将很困难。
因此,API的设计人员将选择一种理论上讲究优雅的方法,该方法易于转换为内部格式,并提供可用于多种输入的系统。他们可能会根据欧拉角的简化程度为输入添加方便的方法,具体取决于他们希望制作API的程度。
答案 1 :(得分:0)
因为欧拉角通常不是一个好主意。您获得了6
个转换顺序组合,这意味着使用此类API会引起混乱。
另一方面,以(0,0,0)
为原点的旋转向量很容易想象和描述,并且更加准确。我使用两种主要方法进行轮换:
但是还有其他一些像使用四元数之类的东西。
菜鸟通常倾向于倾斜欧拉角,因为它们似乎易于实施,但缺点却非常明显,而且常常被完全忽略,因此即使像专家一样,它们也会让我感到痛苦游戏和应用仍会使用它们,并因其奇异和可怕而遭受后果,以致无法正确处理它们。
答案 2 :(得分:0)
为什么他们不简单地将其实现为单个Euler旋转向量,从而简化几乎所有使用该库的代码?
因为它不会“简化几乎所有使用该库的代码”。欧拉角在建模工具,教程和图形新手编写的代码中很普遍。但是,当需要严肃的图形应用程序来表示对象的方向时,通常是作为矩阵本身还是作为四元数。后者可以看作是角度/轴旋转的编码。
可以组成矩阵和四元数。欧拉角不能。四元数可以平滑地插值,从而可以动画角色。内插多个欧拉角会导致非常不幸的结果。向欧拉角施加轴向旋转受万向节锁定;不会将旋转应用于方向(矩阵或四元数)。依此类推。
欧拉角是一种新手陷阱。它们是很容易理解的东西,但在最常见的情况下最终不是很有用。最好有不适合此类陷阱的API。
的确,没有一套欧拉角。将3个轴向旋转应用于结果的顺序。如果以不同的顺序应用相同的角度,则会得到不同的结果。使用Euler角的人通常会根据需要选择不同的Euler角顺序。
因此,拥有一个glm::rotate
函数来选择特定的Euler顺序对于任何需要其他顺序的人都是没有用的。