1.基本概念
向量:有向线段,长度和方向是2个重要属性。DirectX中,Vector可以表示点坐标、方向等信息。
坐标系:DirectX中使用的是左手坐标系。
单位向量(unit vector):模为1的向量称为单位向量。
2.DirectX中与向量有关的类——D3DXVECTOR3(一般是3D的,还有2D和4D的向量)
D3DXVECTOR3类定义如下:
可以看到,D3DXVECTOR3类实际上定义了一个结构体,这个结构体有float型的3个数据成员,分别表示3维向量的3个分量,此外,还有一些个运算符重载是用于向量的计算的。
3.向量的计算
略过求模,规范化(求单位向量),向量加减,数乘。。。只讲点积、叉积
记住,点积是两个向量的对应分量相乘(component-wise multiply)再相加。
如上所述,当u、v都是单位向量时,它们的点积就等于向量夹角的余弦值。(这可以用来计算light和plane的夹角,从而根据不同的角度计算光照量)
3.矩阵
忽略矩阵加减、数乘,只讲逆矩阵和转置矩阵。逆矩阵主要是用于逆变换,即还原为变换前的状态;而引出转置矩阵主要就是为了计算逆矩阵,因为计算逆矩阵需要用到转置矩阵。另外,记住一点,对于规范化的矩阵,它的逆矩阵和转置矩阵相等。这就提供了一个快速计算逆矩阵的方法,因为转置矩阵不就是转了一下而已,根本不用计算。
矩阵的叉积:
为帮助记忆,可写成行列式的形式,即:
DirectX中矩阵的表示:
可见,DirectX中的矩阵都是4x4的。
通过括号运算符可访问到矩阵的任一元素,如M(2, 3)=1.0f;
单位矩阵是除了对角线上全为1其它元素均为0的方阵。
4.因为我们的变换矩阵都是4x4的,但是我们的向量是3D的,那么就涉及到一个向量从3D扩展到4D的问题。我们通过给一个3D向量增加一个分量u,并且规定当u=0时,表示这个向量是不可平移的;
当u=1时,表示这个向量是可以平移的(这个向量存放的可能是一个点的坐标,点是可以平移的)。
5.变换矩阵
#平移变换
通过指定沿x、y、z轴的偏移量,我们可以用这个函数”构造“出一个平移变换矩阵。
例如,要变换一个点P(x, y, z, 1),经过P=P*T的平移变换后,新的P=(x+px, y+py, z+pz, 1)
#旋转变换
绕y轴、z轴旋转的函数于此类似。
#缩放变换
6.补充知识
平面
D3DXPLANE结构体略。。。
其中,n为平面的法向量,而d为常数=>由 n`(p-po)=0,得n`p-n`po=0,那么d=-n`po.其中po是平面内的确定的某一点。
点面关系的确定:在平面上,在平面的前方or在平面的后方。
其中,函数D3DXPlaneDotCoord()的功能(Remark:Given a plane (a, b, c, d) and a 3D vector (x, y, z) the return value of this function is a*x + b*y + c*z + d*1. The D3DXPlaneDotCoord function is useful for determining the plane's relationship with a coordinate in 3D space. )就是计算n.p+d的值,从而根据这个值的正负或零确定点面的关系。记住D3DXPlane结构的四个分量中,前三个分量a,b,c是平面的法向量n,第四个分量d是常量-n.po.
#平面的其它创建方法:指定法向量和一个点,用D3DXPlaneFromPointNormal(); 指定三个点,用D3DXPlaneFromPoints().
#平面法向量的规范化
#变换一个平面
注意,原来的平面的法向量一定先要规范化。一个平面可以通过与一个变换矩阵的逆转置矩阵相乘实施变换。
#找出平面上到某一给定点的最近点
即将已知点p平移-kn,就得到了平面上离p最近的点q
射线