DirectX11坐标变换的理解
仿射变换
1.齐次坐标
在矩阵中我们定义向量为(x,y,z)
这个定义方便了我们进行旋转和缩放操作
但是现在问题是:当我们需要进行平移怎么办?
在通常的理解里,向量的平移是没有意义的,因为平移后的向量和原来的向量是相等的。因此为了实现从世界坐标中的一个位置将图形位移到另一个位置,或者局部坐标向世界坐标的变换,我们的做法是对局部坐标的原点进行平移。也就是__对点进行平移__。
为了能够区分向量和点
我们在(x,y,z)的基础上添加了第四个分量w,即(x,y,z,w)
其中:
(x,y,z,0)表示向量
(x,y,z,1)表示坐标
这种表示方式就称之为齐次坐标
2.仿射变换矩阵
因为现在向量和坐标都是四维的,因此理所当然我们的变换矩阵也会变成4*4的矩阵
2.1简单分析
2.1.1第四列
为什么第四列为0 0 0 1?
对第四列左右进行运算就知道,x0+y0+z0+11 = 1
这样得到的结果第四个分量永远都等于原来的第四个分量
比如原来的坐标为[x,y,z,0],那么得到的结果就是[x’,y’,z’,0]
2.1.2第四行
现在我们观察一下第四行,[bx,by,bz,1],这又代表什么呢?
我们分两种情况讨论:
- 向量:向量的第四个坐标是0,那么和[bx,by,bz,1]相乘都是0,也就是对x,y,z坐标不产生影响。
- 点:点的第四个坐标是1,那么和[bx,by,bz,1]相乘的结果是[bx,by,bz,1],那么这个结果会和原本对X,Y,Z的运算结果进行分量相加。也就是说对x,y,z坐标进行移动。这就达到了对点进行平移,而对向量不产生影响的效果了。
2.2平移矩阵
如果没有旋转和缩放
那么这个矩阵就称之为平移矩阵
很容易想到:如果不想要平移,只要将bx,by,bz设为0即可
3.从局部坐标向世界坐标的变换
假设我们现在在局部坐标轴上面建立了自己的图形,那么我们如何将其变换到世界坐标系呢?
有了上面仿射变换的理解,接下去的操作就简单很多了。我们通过龙书上面的一道例题来进行理解:
假设一个正方形的顶点局部坐标在(−0.5,0,−0.5)和(0.5,0,0.5)之间,将它的边长变为 2, 顺时针旋转 45°,并放置在世界空间的(10,0,10)坐标上,那如何求它在世界空间中的坐标 呢?
我们需要构建 S,R,T 矩阵,世界矩阵 W 如下所示:
上面的W = SRT称为组合变换,通过矩阵乘法将旋转、平移、缩放整合成一个组合变换矩阵,这样就可以避免多次变换,提高性能。
我们对这种变换有两种理解:
1.在局部坐标轴上进行旋转缩放,并且将局部坐标轴的原点移动到世界坐标轴的某个位置(如本题中的10,0,10)
2.先将局部坐标轴×单位世界矩阵,这相当于变换前的局部坐标原点位于世界坐标原点,然后对改图形的世界坐标进行旋转、缩放和平移。