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

来源:互联网 发布:java split 竖线 编辑:程序博客网 时间:2024/04/29 00:51

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

按照变换顺序,应该先旋转后平移,对于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是正交矩阵。坐标轴是一组正交基,向量空间中所有向量都可以用这组正交基线性表出。

原创粉丝点击