今天花了不少时间去理解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!
普通