https://www.cnblogs.com/delphi-xe5/p/12340038.html

https://www.cnblogs.com/delphi-xe5/p/12340039.html

https://www.cnblogs.com/delphi-xe5/p/12340053.html

https://www.cnblogs.com/psklf/p/5656938.html

参考上面 四个资料 。总结自己的理解

1.  欧拉角  分 静态  和动态。  静态就是 旋转的时候坐标轴 不动 。   这个很简单没问题。    动态就是 旋转的时候坐标轴会跟着动,一般说的都是这个 ,一下默认都是讨论 的 坐标轴跟着 动的。

2.欧拉角 有 2 类表示方式。  第一类  zxz   xyx 等等   同一个轴旋转 2次。      第二类 xyz, yzx 等等 一个轴旋转一次。  这两类本质是一样的,因为坐标轴本身就是垂直的, 第三次转动使用第一次的轴没问题。(画一个图,实际转一下就明白,或者在3d软件下模拟一下,或者看这个文章https://www.cnblogs.com/delphi-xe5/p/12340038.html 里的图像演示)

默认情况下 3d软件 使用的都是 xyz 类型的 欧拉角 。

 

3.欧拉角的缺陷:

欧拉角是在世界坐标系下, 按物体本地坐标系(即前面说的动态,跟着坐标轴动的)旋转的三个角度。   注意 是有顺序的 先x轴转,再y轴转,再z轴转。  当然也可以用其他顺序。总之必须是固定顺序,

所以每一个不同的欧拉角,都是世界坐标系 按顺序的三次旋转得到的(也可理解为局部坐标系, 因为最开始局部坐标系和世界坐标系本身就重合的)。 

在角度不动的时候,没有任何缺陷,都是完美。

欧拉角的缺陷是加法问题。 当给角度加上一个值,看看会有什么变化,看看影响是否均衡,看看对最终实际结果有啥影响。

举例子 当另外两个角度不变,其中一个角度变化的时候: 如下:

-------------------------------------------------------------------------

a1:    x轴0度。 y轴30度,  z轴30度  是一个角度。

a2:    x轴10度。 y轴30度,  z轴30度  是一个角度。

a3:    x轴20度。 y轴30度,  z轴30度  是一个角度。

a4:    x轴30度。 y轴30度,  z轴30度  是一个角度。

a5:    x轴40度。 y轴30度,  z轴30度  是一个角度。

a6:    x轴50度。 y轴30度,  z轴30度  是一个角度。

a1-a6    物体的最终实际角度变化很大。(和后面的比较而言)

-----------------------------------------------------------

b1:    x轴30度。 y轴0度,  z轴30度  是一个角度。

b2:    x轴30度。 y轴10度,  z轴30度  是一个角度。

b3:    x轴30度。 y轴20度,  z轴30度  是一个角度。

b4:    x轴30度。 y轴30度,  z轴30度  是一个角度。

b5:    x轴30度。 y轴40度,  z轴30度  是一个角度。

b6:    x轴30度。 y轴50度,  z轴30度  是一个角度。

b1 到 b6 物体的最终实际角度变化中等。

-------------------------------------------------------

c1:    x轴30度。 y轴30度,  z轴0度  是一个角度。

c2:    x轴30度。 y轴30度,  z轴10度  是一个角度。

c3:    x轴30度。 y轴30度,  z轴20度  是一个角度。

c4:    x轴30度。 y轴30度,  z轴30度  是一个角度。

c5:    x轴30度。 y轴30度,  z轴40度  是一个角度。

c6:    x轴30度。 y轴30度,  z轴50度  是一个角度。

c1 到 c6 物体的最终实际角度变化很小。

-----------------------------------------------

总结: 首先:工a1-a6      相比较   b1-b6,c1-c6        来说,a1 -a 6 对最终实际结果影响比较大。 

其次  a1 - a6 本身     a6的最终实际变化   大于  a1的最终实际变化。

总结: 就是变化很混乱,严重不均衡。 

 

4 。两个 欧拉角 中间值问题  

       两个欧拉角的中间值  ,就是 x, y,z 的算数平均值 得到新的欧拉角 。 这没问题。没毛病。完全ok.

       先x轴转一个角, 再y轴转一个角 , 再z轴转一个角。  一点问题都没有.

      问题在于欧垃角的表达方式看似很合理, 在静态下感觉很合理。  

    在动态下,也是对的,没错。  但是和人的感觉有冲突。  眼睛的感觉, 从一个角度 转到另一个角度 是直接转过去 , 而且是平滑 平稳的 转过去的。 

   欧拉角经过三个步骤 也没毛病,是合理的。 但是中间值 不均衡。 为什么不均衡 就是3 说的原因。 因为他本身就不均衡。

  所以要使用四元数来解决中间值问题。这才是均衡的。 但是在静态下 四元数不性感 ,还是欧拉角性感。 所以两种方式分别使用。

 

 5  万向节 死锁问题:

 这个问题折磨了很久 终于搞通了。    其实这个问题本身不是问题。 是个人的思路,感觉 认识错误 造成的。  理性的理解的话 根本不存在万向节。 

注意:(澄清一点 本行之前的x,y,z角度应该用a,g,c来表示。不然容易和坐标轴重复。 因为本行之前不涉及命名重复问题,所以懒的改了。)

 

 这要从 欧拉角 的 旋转顺序说起,a,b,c三个旋转角。   xyz欧拉 方向  (按blender 设置来说 xyz欧拉方向   实际是先旋转c 即绕z轴旋转, 再绕b即y轴旋转, 再绕c即x轴旋转)。  先把已经条件理清除。  不然后面说得都等于0.

假设 m1   :    a=10   , b=20 ,c=30     那么先绕局部坐标z转30,在y20 再x10度 旋转。 得到结果。

        m2 :      a=15   , b=25 ,c=35     那么先绕局部坐标z转35,在y25 再x15度 旋转。 得到结果。

这都没问题, 因为都是从 原始坐标旋转得到的。  清注意,所有的欧拉角 都是从原始世界坐标开始旋转得到的。  即使是先旋转了一次, 然后进行第二次旋转。 那么也要先计算 a,b,c角度的分别和。 然后重新 从世界坐标按 z,y, 按顺序旋转出来。(为什么要如此,因为3的原因, 欧拉角本身不均衡,不具备可加性。只能按定义来)

万向节产生的原因 就是当你旋转了一次之后。  再旋转第二次的时候,错误的把第一次旋转当成了基准。    此时你无法解释很多东西,你蒙蔽了,轴也有的转有的不转,这就是所谓的万向节。   他大爷的,终于解释清除了。

 

6; 万向坐标轴   ,blender 里有一个万向坐标系。

   应该就是问题5 的延伸。   当以上一次旋转做为基准的时候,该怎么弄呢?    聪明的陀螺仪出现了。  把陀螺仪做为万向坐标, 就能很好的实现以上一个旋转结果 做为基准 ,进行下面的旋转的要求。

因为陀螺仪 能  把每一次的旋转 都进行线性累加,  陀螺仪 真牛逼。 直接在陀螺仪上旋转 。 可以放弃欧拉角了。 牛逼啊。  陀螺仪的旋转轴, z会影响y,z  。 y会影响x.   所以陀螺仪的y,x坐标会乱跑。但是z坐标稳定。

完结。

 

7. 万向节死锁, 用陀螺仪当然也能解释万向节死锁显现。 但这是另外一个系统。 和欧拉角无关 。

也就是说 旋转有两套系统 ,一套是欧拉角 系统。       一套是陀螺仪坐标系统(但是坐标会乱跑,甚至不垂直,甚至重合(就是万向节));

3d软件正好使用了  2种方式。