今天在学习godot 需要用到坐标变换。
简单来说,我有一个世界坐标系的坐标(鼠标坐标), 需要转换为相对于某个节点的坐标
按照我之前的想法,这个应该是找到世界坐标系到 这个节点的旋转矩阵R,然后通过 R * Pos 即可得到结果。于是在godot中实验,我认为该节点的transform 不就是这个旋转矩阵嘛,于是调用transform * pos
, 却发现结果反了,需要pos * transform
结果才是正常的。
首先有些定义得先定义清楚:
- 关于左乘右乘的说法,AB 表示 A右乘B
- 如果对于一个坐标pos(列向量)要进行变换,需要进行的操作是 R pos, pos R 没有意义(或者说没有坐标变换的意义)
- 矩阵相乘AB, 表示 先进行B变换,再进行A变换。若有相对于世界坐标系的两个变换 Rx 和 Ry, 如果要先应用Ry,再应用Rx, 那么表达式为 RxRy。
- 如果Rx是要在Ry变换完的基础上进行的变换,则表达式为RyRx。推导过程为:先把Rx 转换为相对于世界坐标系的变换: Rx’ = Ry Rx Ry^T, 再用正常的顺序结合:Rx’ * Ry = RyRx
- 以上两条就是大家常说的矩阵左乘与矩阵右乘的区别: 矩阵左乘 表示相对于静坐标系变换, 右乘表示相对于动坐标系变换。
- 综上,实际上常说的左乘与右乘的区别,只说的是矩阵之间,矩阵与向量之间没有这么多弯弯绕,只有一种。(如果是列向量的话,只能是R pos;行向量的话,只能是pos R)
回到前面的问题,我要将坐标从世界坐标系 变换到 物体坐标系, 应该是拿到transform ,然后计算 transform^T pos 才对。而 godot中是使用 pos transform 来完成这个操作,跟左乘右乘没关系,我之前也混乱了。