在3D图形学中,经常需要进行坐标变换的操作。所以,作为学习者,很有必要将坐标变换的原理掌握。在3D渲染流水线中,有很多的变换,基本上都是从一个坐标空间变换到另外一个坐标空间的。既然坐标变换在3D中用的如此的多,那么就应该详细的了解坐标变换的原理。这有助于我们理解3D流水线中的各种变换过程。
在DirectX 9.0读书笔记(1)向量一文中,详细的讲述了如何将A坐标系里面的坐标点变换到B坐标系中去。这里直接使用文章的结论,即:如果我们在A坐标系中有一个向量或者点,那么如何用在B坐标系中表示这个向量或者点了?对于向量来说,假设在A坐标系中表示的向量为Q(x,y,z),而A坐标系的三个基坐标在B坐标系中分别为U(ux,uy,uz), V(vx,vy,vz)和W(wx,wy,wz),那么我们就可以用如下的公式得出Q向量在B坐标系里面的坐标为:Qb = x * U + y * V + z * W ; 由于向量可以平移,而点不可以平移,所以对于A空间中的点Q(x,y,z),我们的公式变成如下的:Qb = x * U + y * V + z * W + O,这里的O是A坐标系的原点在B坐标系中的坐标表示。
好了,通过上面的公式,我们就自然的知道了如何进行坐标变换了吧。
我们知道,在3D流水线中,大多数时候,都是使用矩阵来进行坐标变换。所以,我们很有必要知道,如何通过上面的结论来构造一个矩阵,从而将坐标变换到我们想要的空间中去。
在讲述矩阵的坐标变换表示之前,我们先来看下:向量和矩阵的乘法运算。
注意,这里使用的行向量,所以向量和矩阵的乘法运算,只能是(向量 * 矩阵),而不是(矩阵 * 向量)。不同的表示方法,对于构造出来的矩阵也是不同的,大家需要自己区分。
向量Q(x,y,z)和一个3*3的矩阵M = ,其结果为Q * M = x * U + y * V + z * W .
看到这个结果你是否想到了什么?没错,对于向量空间变换,我们只要将对应的坐标基的表示如上面例子中的U,V,W,按照矩阵M的表示方法表示起来就可以了。然后使用向量乘以这个矩阵,就能够得到变换后的坐标了。
但是,我们还要考虑一点,上面的公式中,似乎只能对向量进行变换,如果是点的话,就没有办法了。所以,很自然的,我们想到要使用齐次坐标来表示。齐次坐标,与普通的3D坐标相比,多了一个分量。即Q(x,y,z ,w)。这里的w取值为0的时候,表示这个Q表示的是一个向量,如何w为1,表示的就是Q表示一个点。那么,矩阵也要做相应的改变哦。
对于上图中的矩阵,只要将它变成4*4的齐次矩阵就可以了。熟悉D3D的同学,应该知道我说的是下面这样的矩阵:
好了,这样就大功告成了。我们的坐标变换的矩阵表示方法就是这样的了。