虽然dx提供了视图矩阵的计算函数,自己推导一遍能很有益处,下面是我的推导过程:
从世界矩阵变换为view矩阵,首先需要先平移再旋转(平移再旋转以后相机在自身视图坐标系就是是原点)所以如果相机在px, py, pz 的位置,则平移矩阵为:
1, 0, 0, 0
0, 1, 0, 0
0, 0, 1, 0
-px,-py,-pz,1
相机的三个方向right, up, look在view其次坐标系分别对应x,y,z如果分别与view矩阵乘将是:
(right.x, right.y , right.z) * matview3x3 = (1,0,0)
(up.x , up.y , up.z ) * matview3x3 = (0,1,0)
(look.x , look.y , look.z ) * matview3x3 = (0,0,1)
那么
right.x, right.y , right.z
look.x , look.y , look.z * matview3x3 = f3x3单位矩阵
up.x , up.y , up.z
这两个矩阵是互逆的,又由于right, up, look是直交的,所以
matview3x3是前面矩阵的转置矩阵:即
matview3x3=
right.x, up.x, look.x
right.y, up.y, look.y
right.z up.z, look.z
转换为4x4矩阵为:
right.x, up.x, look.x, 0
right.y, up.y, look.y, 0
right.z up.z, look.z, 0
0 , 0 , 0 , 1
加入之前的平移可以得到最终的视图矩阵为:
1, 0, 0, 0 right.x, up.x, look.x, 0
0, 1, 0, 0 乘 right.y, up.y, look.y, 0
0, 0, 1, 0 right.z up.z, look.z, 0
-px,-py,-pz,1 0 , 0 , 0 , 1
得到的最终结果为:
matview4x4=
right.x, up.x, look.x, 0
right.y, up.y, look.y, 0
right.z up.z, look.z, 0
-right·px -up·py -look·pz, 1
|