目录
前边的文章整理了二维平面中的几何变换的相关知识,其实在三维中,大部分操作都可以拿二维变换来进行类比。
1、3D齐次坐标和齐次矩阵
1.1、3D齐次坐标
引入第四坐标,将三维坐标扩充为四维表示,其中,齐次参数为非零任意值,为了方便,一般设置h=1。所以在3D中点和向量分辨表示为:
3D点:。
3D向量:。
1.2、3D齐次矩阵
3D中,齐次矩阵是一个4X4的矩阵:
上式中左上角:为3D中的线性变换矩阵。
右上角:为平移向量。
仿设变换中,最下面一行固定为:0 0 0 1。
齐次矩阵是先平移再线性变换还是先线性变换再平移?因为我们知道
等价于
所以实际上,是先做的线性变换,然后再进行平移。
2、齐次坐标形式下3D几何变换
2.1、3D缩放
缩放矩阵:。
若缩放点不是原点,需要先把缩放点平移到原点,再进行缩放,等缩放结束,再平移回去。
2.2、3D平移
平移矩阵:。
2.3、3D旋转
3D中旋转情况相对复杂。在2D中,旋转只能绕着垂直于xy平面的的轴进行旋转,但是在3D中,可以分别绕x轴、y轴、z轴及3D中其他任意轴进行旋转。
2.3.1、绕坐标轴旋转
绕x轴的旋转矩阵(x轴值不变):。
绕y轴的旋转矩阵(y轴值不变):
绕z轴的旋转矩阵(z轴值不变):
注:如果已知绕z轴的旋转矩阵,有一个更便捷的方法可以得到绕x轴、绕y轴的旋转矩阵。绕z轴旋转时,写成方程的形式为:,绕另外两个轴的旋转公式可以由绕z轴的公式的坐标参数x、y、z循环替换得到:。即y替代x、z替代y、x替代z。比如绕x轴的旋转公式为:,也就知道了它的旋转矩阵。
2.3.2、绕任意轴旋转
绕与坐标轴不一致的轴进行旋转的变换矩阵,可以利用平移+坐标轴旋转的复合变换得到。第一步将指定旋转轴经移动和旋转变换到坐标轴之一,第二步对该坐标轴进行旋转,第三步再将旋转轴变回到原来位置。
若旋转轴平行于某个坐标轴,可通过下列步骤得到所需的旋转矩阵:
1、平移对象使其旋转轴与平行于该轴的一个坐标轴重合;
2、绕该坐标轴完成指定的旋转;
3、平移对象将其旋转轴移回到原来的位置。
对象上的任意坐标点p经过一系列变换成为:
其中,旋转变换的复合矩阵是:
若对象绕与每个坐标轴均不平行的轴旋转,还需要进行使旋转轴与某一选定坐标轴对齐的旋转,最后再将此轴变回到原始位置。若给定旋转轴和旋转角,我们可以按照下面的5个步骤来完成旋转:
1、平移对象,使的旋转轴通过坐标原点;
2、旋转对象使得旋转轴与某一坐标轴重合;
3、绕该坐标轴完成指定的旋转;
4、利用逆旋转使旋转轴回到其原始位置;
5、利用逆平移使旋转轴回到其原始位置。
我们可以将旋转轴变换到三个坐标轴的任意一个。下面举例讨论下使用z轴旋转矩阵的变换。
任意旋转轴可以由两个坐标点确定(如图9.10),或通过一个坐标点和旋转轴与两个坐标轴间的方向角(或方向余弦)来确定。假设由两点确定旋转轴,若沿着从P2到P1的轴进行观察,并且旋转的方向为逆时针,则轴向量利用两点可以定义为:
则沿旋转轴的单位向量定义为:
其中,分量a、b、c是旋转轴的方向余弦:
为什么a、b、c是旋转轴的方向余弦?我学到这里的时候有点疑惑,所以推导了一遍,以x轴为例,推导过程如下:
取x轴上的单位向量:
由点乘的计算公式可知:
因为、都是单位向量,另由点乘计算公式:
所以可知a是旋转轴在x轴上的方向余弦。
若以相反方向旋转(当观察方向从P2到P1时,旋转方向为顺时针),则需要将轴向量和单位向量取反,使得它们的指向是从P2到P1。
5步中的第一步是建立使旋转轴通过原点的平移变换矩阵。由于需要一个从P2往P1看时的逆时针旋转(参见图9.10),我们将P1点移到原点(如果旋转方向指定为相反方向,则将P2移到原点)。该变换矩阵为:
通过平移实现了旋转轴和对象的重定位,如图9.11所示。
第二步是将旋转轴和z轴重合的变换。可以利用两次坐标轴旋转来完成这一对齐(有多种方法可以实现这两个步骤)。此例中,首先绕x轴旋转,将向量变换到xz平面上,然后绕y轴旋转,将变到z轴上,如图9.12所示。
由于旋转需要用到正弦和余弦函数。通过向量的点乘可以确定余弦,向量的叉乘可以得到正弦值。
计算出使变换到xz平面上的旋转角的正弦和余弦值,即可建立绕x轴旋转的变换矩阵。该旋转角是在yz平面上的投影与z轴正向的夹角(参见图9.13)。设在yz平面上的投影为向量,则旋转角α的余弦可以由和z轴上单位向量的点乘得到:
其中d是的模:
类似地,可以利用和 的叉积来给出的α的正弦。与坐标无关的叉乘形式是:
而且叉乘的笛卡尔形式为:
式(7)、(8)的右边相等,因为、则有:
至此得到了正弦、余弦,所以可以建立绕x轴将旋转到xz平面的旋转矩阵:
第三步,需要求旋转矩阵,将xz平面上的单位向量绕y轴逆时针旋转到z轴的正方向。绕x轴旋转轴,xz平面上单位向量的方向如图9.14所示。
该向量记为,因为绕x轴的旋转保持x分量不变,故其x分量值为a;因为向量旋转到z轴上,故其z分量为d(的模);因为在xz平面上,故的y分量为0。同样,由单位向量和的点乘可确定旋转角β的余弦:
因为 。比较叉乘与坐标无关的形式:
和笛卡尔形式:
所以可以得到:
现在可以得出 绕y轴的旋转矩阵为:
利用式(4)、(10)、(15) 这几个变换矩阵,可以将旋转轴对齐到z轴的正方向。给定的旋转角θ已经可以用于关于z轴的旋转:
为了实现对于给定轴的旋转,还需要将旋转轴变回到原来位置。可以通过使用(4)、(10)、(15) 中的变换矩阵的逆矩阵来完成。这样对于任意轴的旋转可以表示为上述7个变换的复合形式:
2.4、3D反射
三维反射可以相对于给定的反射轴,或者相对于给定的反射平面(reflection plane)来实现。反射矩阵可以参考二维反射矩阵。比如相对于xy平面的点反射矩阵为:
类似地,关于yz平面和xz平面的反射矩阵分别将x、y的值取反。相对于其他平面的反射可以由旋转及坐标平面反射组合得到。
2.5、3D错切
相对于x轴或y轴的错切变换同二维类似。
相对于一个选定参考位置的z轴错切变换矩阵为:
错切参数和可以为任何实数。该变换矩阵的效果是使用与离距离成比例的值改变x和y坐标而不改变z坐标。与z轴垂直的平面区域使用与等价的量移动。图9.20给出了在错切值为且参考位置时该错切矩阵应用于单位立方体的效果。
3、参考资料
1、GAMES101 计算机图形学基础 闫鹤翔
2、计算机图形学(第四版) 电子工业出版社 蔡士杰、杨若瑜