要做坐标变换,首先要搞清楚坐标系之间的父子关系,搞清父子关系的关键是一个坐标系的基向量。
一个坐标系的基向量是它的父坐标系中的一个普通向量。
一个坐标系的原点是它的父坐标系中的一个普通的点。
令子坐标系基向量=(Base_x, Base_y, Base_z)
子坐标系原点坐标=O_son
P点在子坐标系坐标=(Coor_son_x, Coor_son_y, Coor_son_z)
P点在父坐标系坐标Coor_parent的计算为:
Coor_parent = Base_x * Coor_son_x + Base_y * Coor_son_y + Base_z * Coor_son_z + O_son
翻译下就是:
一个点在父坐标系中的位置 = 这个点在当前坐标系的位置 + 当前坐标系原点在父坐标系中的位置
写成矩阵乘法的形式就是:(这里用的是列向量形式)
Coor_parent = [Base_x, Base_y, Base_z, O_son] x [x, y, z, 1]T
所以子转父的矩阵就是 [Base_x, Base_y, Base_z, O_son],其中的Base_x, Base_y, Base_z 三个基向量都是父坐标系的向量,O_son是父坐标系中的一个点。
举例
切线空间是由切线(x轴),副切线(y轴), 法线(z轴)组成的,但是并没有说这里的切线 法线是哪个空间的,其实哪个空间都可以,只要计算的时候保持同一个空间的再计算就可以。
如果切线法线是模型空间的,那么切线法线表示的就是切线空间和模型空间之间的关系
如果切线法线是世界空间的,那么切线法线表示的就是切线空间和世界空间之间的关系
update:
记一个口诀吧:子转父,子基纵排; 父转子,子基横排。纵排横排说的是构建变换矩阵时子坐标系基向量的排列方向。
纵排 [BX, BY, BZ],基向量纵向展开得到矩阵
BX.x BY.x BZ.x
BX.y BY.y BZ.y
BX.z BY.z BZ.z