Math 为什么三维旋转矩阵方法通常使用单独的矢量和角度而不是常规的Euler角度?

Math 为什么三维旋转矩阵方法通常使用单独的矢量和角度而不是常规的Euler角度?,math,matrix,vector,glm-math,Math,Matrix,Vector,Glm Math,为什么三维旋转矩阵方法通常使用单独的矢量和角度而不是常规的Euler角度 例如,在glm中,给定mat4模型和vec3旋转,而不是: 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

为什么三维旋转矩阵方法通常使用单独的矢量和角度而不是常规的Euler角度

例如,在
glm
中,给定mat4
模型和vec3
旋转,而不是:

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旋转向量来实现,从而简化几乎所有使用该库的代码?我在其他实现中也看到了这一点。

首先,将所有旋转的集合看作所有单位向量和角度的集合在理论上是优雅的。如果你结合两个旋转,你会得到第三个这样的旋转

代码的内部将旋转表示为矩阵或四元数。如果是后者,则特别容易在四元数和轴角度模型之间切换

如果在Euler角中指定了旋转,则可以通过三个单独旋转的简单组合来获得旋转矩阵。如果API只允许Euler角度,但在“轴角度”中指定了旋转,那么要计算Euler角度就不太容易了


因此,API的设计者将选择一种理论上优雅、易于转换为内部格式并提供可用于各种输入的系统的方法。他们可能会添加一个方便的方法,根据欧拉角度输入,这取决于他们希望API的节约程度

因为一般来说,欧拉角不是个好主意。您得到了排序转换的组合,这意味着使用这样的API会导致混乱

另一方面,以
(0,0,0)
为原点的旋转矢量更易于想象和描述,也更精确。我使用两种主要方法进行这种轮换:

但也有其他的方法,比如使用四元数等等

新手往往倾向于欧拉角,因为它们看起来很容易实现,但它们的缺点非常明显,常常被完全忽略,所以即使是专业人士,他们也会坚持使用它们,因为很多好的游戏和应用程序仍然在使用它们,并且由于奇点和可怕的处理方式而遭受后果他们说得对

为什么他们不简单地将其作为一个Euler旋转向量来实现,从而简化几乎所有使用该库的代码

因为它并没有“简化几乎每一段代码以使用库”。欧拉角在建模工具、教程和图形新手编写的代码中非常普遍。但是,当严肃的图形应用程序需要表示对象的方向时,它通常作为矩阵本身或四元数来表示。后者可被视为角度/轴旋转的编码

矩阵和四元数可以组合。欧拉角不能。四元数可以平滑插值,从而允许角色动画。插值多个Euler角会导致非常不幸的结果。将轴向旋转应用于欧拉角,以万向节锁定为准;将旋转应用于方向(矩阵或四元数)不会改变方向。等等

欧拉角是一种新手陷阱。它们很容易理解,但最终在最常见的情况下并不是很有用。最好有不适合这种陷阱的API

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


因此,对于需要不同的Euler排序的人来说,使用选择特定Euler排序的
glm::rotate
函数是没有用的。

我想这可以让你使用具有不同矢量的不同坐标系作为基础。Euler角度或轴角度哪一个更容易可视化?