3D几何流水线之模型变换

参考书:Real-time Rendering 2nd, 《3D游戏与计算机图形学中的数学方法》

最初,物体在模型空间中,通过模型变换改变了物体的位置和朝向,物体被变换到世界空间。

按照变换顺序,应该先旋转后平移,对于opengl的规则,是TR X V。
矩阵T,R都是4X4的,T中只有第4列有效,其他是单位阵的排列,R中是前3X3子阵有效,其他是单位阵排列,将TR相乘:

| 1 0 0 Tx | | Ux Vx Nx 0 | | Ux Vx Nx Tx |
| 0 1 0 Ty | X | Uy Vy Ny 0 | = | Uy Vy Ny Ty |
| 0 0 1 Tz | | Uz Vz Nz 0 | | Uz Vz Nz Tz |
| 0 0 0 1 | | 0 0 0 1 | | 0 0 0 1 |

可 见,在最后得到的4X4 TR矩阵中,等于是把3X3 UVN矩阵填到平移矩阵中,这两个矩阵相乘时互相没有影响对方。其实UVN表示坐标系的映射—用(1,0,0)T, (0,1,0)T, (0,0,1)T分别右乘UVN矩阵,得到的列向量正是UVN的3列,这就是说三个坐标轴被UVN矩阵变换到世界坐标系中了,而UVN的3列表示的正是 x,y,z轴在世界坐标系下的向量。

再加上缩放变换,先看一下R X S :

|Ux Vx Nx 0| | Sx 0 0 0 | | UxSx VxSy NxSz 0 |
|Uy Vy Ny 0| X | 0 Sy 0 0 | = | UySx VySy NySz 0 |
|Uz Vz Nz 0| | 0 0 Sz 0 | | UzSx VzSy NzSz 0 |
|0 0 0 1| | 0 0 0 1 | | 0 0 0 1 |

那么最终的 T X R X S就是:
| UxSx VxSy NxSz Tx |
| UySx VySy NySz Ty |
| UzSx VzSy NzSz Tz |
| 0 0 0 1 |

可见缩放矩阵的作用是分别对三个坐标轴进行缩放。这个4X4矩阵,第4列是平移变换,3X3部分是缩放和坐标轴变换。因为坐标轴是单位向量,所以求3X3每列的模就得到相应的缩放值。

如果是把物体从世界坐标空间变回到模型空间,那么逆矩阵就是:
(TRS)-1 = S-1 X R-1 X T-1
| 1/Sx 0 0 0 | | Ux Uy Uz 0 | | 1 0 0 -Tx | | Ux/Sx Uy/Sx Uz/Sx (U' dot -T) |
= | 0 1/Sy 0 0 | X | Vx Vy Vz 0 | X | 0 1 0 -Ty | = | Vx/Sy Vy/Sy Vz/Sy (V' dot -T) |
| 0 0 1/Sz 0| | Nx Ny Nz 0 | | 0 0 1 -Tz | | Nx/Sz Ny/Sz Nz/Sz (N' dot -T) |
| 0 0 0 1| | 0 0 0 1| | 0 0 0 1 | | 0 0 0 1 |

其中 U', V', N'是U,V,N分别乘以1/Sx, 1/Sy, 1/Sz
这个4X4的逆变换矩阵就不是没影响啦,第4列是U', V', N'和-T的点积,计算这种逆矩阵时要注意,不能直接填-T的!这个逆矩阵是不能直接“填”出来的,3X3部分每一行是逆缩放后的坐标轴,第4列是前面矩阵每一列和-T的点积

至于为什么UVN矩阵的逆就是他的转置,因为UVN是正交矩阵。坐标轴是一组正交基,向量空间中所有向量都可以用这组正交基线性表出。

你可能感兴趣的:(游戏)