3D游戏与计算机图形学中的数学方法-变换

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

3D游戏与计算机图形学中的数学⽅法-变换
1变换
在3D游戏的整个开发过程中,通常需要以某种⽅式对⼀系列的向量进⾏变换。

通常⽤到的变换包括平移,缩放和旋转。

1.1通⽤变换
通常可将n x n可逆矩阵M看成是⼀个从坐标系到另⼀个坐标系的变换矩阵。

M的列给出了坐标系从原坐标系到新坐标系的映射。

例如M是⼀个n x n可逆矩阵,当M与向量(1,0,0),(0,1,0)和(0,0,1)相乘时,可以得到
类似地,M-1的列给出了坐标轴从新坐标轴系到原坐标轴系的映射。

这样对于任意给定的线性⽆关的向量U,V,W可以构造⼀个变换矩阵,该矩阵将这些向量映射到向量(1,0,0),(0,1,0)和(0,0,1)。

多个变换可以串联起来,并且可以将多个变换矩阵的乘积⽤⼀个矩阵来表⽰。

假设需要先⽤矩阵M后⽤矩阵G对⼀个对象进⾏变换,由于乘积满⾜结合律,对于任意向量P都有G(MP)=(GM)P,因此只需存储GM的乘积得到的矩阵,将该矩阵作为对象的变换矩阵即可。

这样就可以对定点进⾏多次变换,⽽存储空间不变。

正交矩阵是⼀种其转置矩阵等于其逆矩阵的矩阵。

正交矩阵只能⽤于表⽰旋转和反射的组合。

反射指在某⼀⽅向上将点进⾏镜像的⼀种运算。

例如,矩阵
以xy平⾯为对称⾯对⼀点的z坐标进⾏反射。

⼿向性
在三维空间中,有3D向量V1,V2,V3构成的坐标系的基&具有⼿向性。

对于右⼿基,有(V1*V2). V3>0。

也就是说,在⼀个右⼿坐标系中,v1,v2的叉积的⽅向与v3的⽅向形成⼀个锐⾓。

如果&是⼀个正交规范的右⼿基,则有v1*v2=v3。

若(v1*v2).v3<0,那么&是左⼿基。

进⾏奇数次反射操作就会改变⼿向性,偶数次反射相当于⼀次旋转。

通过观察3x3矩阵的⾏列式,就可以判定矩阵是否存在反射。

若M的⾏列式是负的,则存在反射,⽤M对任意基的向量进⾏变换操作后,基的⼿向性都会发⽣改变。

如果⾏列式是正的,那么M不改变⼿向性。

正交矩阵M的⾏列式的值只能是1或-1.若detM=1,矩阵M只存在旋转;如果为-1,那么M表⽰旋转之后再进⾏⼀次反射。

1.2缩放变换
简单来说,对于统⼀缩放可以理解为向量P乘以⼀个常数a,即P’ = aP。

在三维空间⾥可以⽤矩阵的乘积表⽰。

如果是在xyz轴以不同的值进⾏缩放向量,那么可以这种缩放为⾮统⼀缩放。

如果在3个任意轴上进⾏⾮统⼀缩放,就要⽤到复杂的缩放过程。

假设以系数a沿U轴⽅向,以系数b沿V轴⽅向,以系数c沿W轴⽅向进⾏缩放,可以先从坐标系(U,V,W)变换到坐标系(i,j,k),然后在(i,j,k)坐标系进⾏缩放运算,最后在还原到(U,V,W)坐标系。

1.3旋转变换
⾸先讲⼀下在⼆维平⾯上的旋转,也就是在平⾯直⾓坐标系上进⾏旋转。

假设⼀个向量P(Px,Py),要想求得相对于它⾃⾝旋转a度⾓后的向量P’。

我们就需要根据P逆时针旋转90度得到其正交的向量Q(-Py,Px)。

可以将P,Q看做该坐标系的⼀对正交基,则P’可以被P和Q表⽰为:
P’ = Pcosa + Qsina;(1)
可以确定P’的x,y分量为:
可以改写成矩阵的形式:
引申⼀下:将单位矩阵的第三⾏和第三列加⼊P’矩阵中可得:
,该矩阵是绕z轴的三维旋转。

同样可以得到绕x轴和y轴旋转⾓度的3x3旋转矩阵。

绕任意轴旋转
假设向量P绕⼀个任意轴旋转Θ⾓,这⾥的任意轴以单位向量A表⽰,可以将向量P分解为垂直于和平⾏于A的分量P1, P2。

由于平⾏分量
P2在平⾏于A,则在旋转过程中保持不变,主要求的是P1的旋转。

由于A是⼀个单位向量,对于P在A上的投影,可以表⽰为:proj A P = (A.P)A;
P垂直于A的分量可表⽰为:perp A P = P – (A.P)A;
现将垂直于A的分量进⾏旋转,然后加上proj A P就可以得到最终的旋转结果。

垂直分量的旋转是如何得到的呢?
垂直分量的旋转是在垂直于A轴的平⾯内进⾏的。

可以⽤perp A P与perp A P逆时针⽅向旋转90度所形成的向量的线性组合来表⽰旋转后的向量。

如上图所⽰,假设a是原向量P和A轴之间的夹⾓。

perp A P的长度等于||P||sina,那么perp A P绕A轴逆时针旋转90度的向量perp A P’就是A 与P的叉积。

那么perp A P旋转Θ⾓可以表⽰为:[P-(A.P)A]cosΘ + (A x P)sinΘ。

(2)
(2)式的推出可以参考(1)式。

加上proj A P = (A.P)A,就可以得到P绕A轴的旋转公式:
P’ = PcosΘ + (A x P)sinΘ + A(A.P)(1-cosΘ); (3)
将(3)式换成矩阵的表达形式:
合并公式中的相同项,令C=cosΘ,S=sinΘ,得到表⽰向量绕A轴旋转Θ⾓的旋转矩阵R A(Θ).
1.4齐次坐标
关于平移操作,不能⽤3 x 3矩阵表⽰,把点P从⼀个坐标系平移到另⼀个坐标系,只需要简单地添加偏移向量,不会影响到坐标轴的⽅向和尺度。

P’ = MP + T (4)
其中M为3 x 3可逆矩阵,T是3D平移向量。

利⽤(4)式进⾏两次操作可得到:
(5)
若是要进⾏n次操作时,必须知道每次变换过程中的矩阵分量M n M n-1和平移分量M n T n-1+T n。

我们利⽤四维变换可以将M和T统⼀起来,就可以建⽴⼀个四维4 x 4矩阵来表⽰平移操作。

⽅法是给3D点P增加⼀个坐标,并将这个扩展的第四个坐标称之为w坐标,其值设为1。

(6)
将矩阵F乘以向量(Px,Py,Pz,1),就等价于(4)式对向量的x,y,z坐标进⾏变换,同时保持w为1。

从公式(4)中可以解出 (7)
因此可以从公式(6)中得到4 x 4矩阵F的逆矩阵F-1为:
(8)可以验证(8)式的正确性:。

相关文档
最新文档