Yaw Pitch Roll的变换顺序问题

今天花了不少时间去理解Yaw Pitch Roll的变换顺序

比如给定一个旋转(15, 30, 60),那么物体应该先围绕哪个轴转呢?总得有个顺序吧?


解决这个问题的第一个天坑就是:网上的资料坐标系都不一样!所以很多文章虽然说的是同一件事情,但是描述是不一样的,因为他们坐标系不一样!

我自己理解这个问题是OPENGL的右手坐标系,即:Y是上下,X是左右,Z是内外。对应一下:Yaw是对Y轴旋转, Pitch是对X轴旋转,Roll是对Z轴旋转。

先搞清楚了这个才能继续思考后面的问题,网上的资料不管是国内还是国外,都是千奇百怪的坐标系,所以读起来总不通畅。


第二个坑就是:搞清楚了坐标系变换分为 intrinsic 和 extrinsic,简单来说,就是围绕第一根轴旋转完了以后,接下来围绕旋转的第二根轴是世界坐标系的轴,还是当时情况下(旋转完第一根轴后)的局部坐标系轴。intrinsic是指始终围绕当前情况下的局部坐标系旋转,extrinsic是指围绕绝对不动的坐标系轴旋转。YawPitchRoll用的是intrinsic,即下次旋转的轴是本地坐标系的轴。

这里就有一个需要注意的问题,按照YawPitchRoll的顺序,第一感觉矩阵乘法的顺序是R*P*Y*Vertex(OPENGL是左乘),但是请注意!!!!矩阵乘法是extrinsic的!!!所以顺序要反过来变成Y*P*R*Vertex!!!

我在这个地方绕了好几个小时。这里必须要用举例来说明:假设我们要围绕Y轴转45度(记做矩阵Y),再围绕旋转后的X轴转30度(记做矩阵X)(intrinsic)。

如果我们写成 X * Y * Vertex,实际上表明的是,先围绕父空间的Y轴旋转,再围绕父空间的X轴旋转。

但是我们实际上想表达的是,围绕Y轴旋转后本地的X轴旋转,所以我们需要预先计算出坐标系围绕自己X轴旋转的矩阵,就是Y*X(表示在Y空间里旋转)。

所以最后顺序变成了Y * X * Vertex。这里非常绕,一定要牢记在依次旋转的时候,到底是extrinsic还是intrinsic!

普通的矩阵连乘是extrinsic,如果要变成intrinsic,需要自己再琢磨一下!


现在解决最后一个问题,旋转围绕轴的顺序是什么。答案是:先Yaw(y轴),再Pitch(x轴),最后Roll(z轴)。一定要注意,这是OPENGL的坐标系!


那为什么不采用其他顺序呢,我谷歌了半天也没有找到一个合理的答案,但是我自己试出来了一个现象,不知道是否是这个原因:


如果采用这个顺序有一个好处,旋转完y轴以后,不论你如何旋转X轴,都不会影响这次变换在Y轴上的数值;同理,旋转完X轴后,无论你如何旋转Z轴都不会影响这次变换在X,Y轴上的数值。比如给定一个旋转(15, 30, 60),按照yaw pitch roll的顺序(即先30,再15,最后60)之后,世界坐标系中看,旋转的角度也是(15,30,60)。如果不用这个顺序,你就会发现后面的变换会影响前面的结果,比如先X轴15度,再Y轴30度,最后Z轴60度,换到世界坐标后,X的值就不是15度了。


如果有人明白更深一层原理的,欢迎不吝赐教!

你可能感兴趣的:(引擎)