基础数学知识

左手系和右手系

左手坐标系就是x轴的正方向指向右,y轴正方向指向上,z轴的正方向指向里面。当伸出左手,让四个手指指着x轴的正方向,大母指指向z轴的正方向,牚心指向y轴的正方向。符合这样规则的坐标系,就叫做左手坐标系。

向量

程序中可使用D3DXVECTOR3数据结构来代表向量,该结构需要添加#include <d3dx9math.h>头文件

计算向量的长度:向量的模就是有向线段的长度,{\left \| u \right \|=\sqrt{​{u_{x}}^{2}+{u_{y}}^{2}+{u_{z}}^{2}}}

D3DX库中可以使用D3DXVec3Length来计算向量的模

int main()
{
	D3DXVECTOR3 v(1.0f, 2.0f, 3.0f);
	float length = D3DXVec3Length(&v);
	std::cout << length << std::endl;
}

向量规范化:使向量的模变为1,可以通过将向量的每个分量都除以该向量的模来实现向量的规范化 {\hat{u}=\frac{u}{\left \| u \right \|}=\left ( \frac{u_{x}}{\left \| u \right \|},\frac{u_{y}}{\left \| u \right \|},\frac{u_{z}}{\left \| u \right \|} \right )}

D3DX库中可以使用D3DXVec3Normalize来计算,该函数返回指向变换结果的指针,所以该函数可以作为另一个函数的参数来使用,在大部分情况下,除非特别声明,一个D3DX数学函数均返回一个指向结果的指针

D3DXVECTOR3* WINAPI D3DXVec3Normalize
    ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV );

向量加法:向量的加法定义为俩个向量对应分量的分别相加,只有维数相同的俩个向量才能进行加法运算,程序中实现向量加法,可以使用重载后的加法运算符(+)

向量减法:规则同加法一致

 数乘:标量可以与向量相乘,该运算可以对向量进行缩放,与正数相乘不改变向量方向,与负数相乘后方向与原来相反 {ku=\left ( ku_{x},ku_{y},ku_{z} \right )}

点积:是向量代数所定义的俩种乘法之一,结果为一个标量 {u\cdot v=u_{x}v_{x}+u_{y}v_{y}+u_{z}v_{z}}     上述公式并不具有明显几何意义,但由余弦定理可知{u\cdot v=\left \| u \right \|\cdot \left \| v \right \|cos\theta }  即俩向量的点积为二者夹角的余弦乘以俩个向量的模的乘积。可使用D3DXVec3Dot来计算点积
性质:若u·v=0则u\perpv,u·v>0则俩向量之间夹角<90^{\circ},u·v<0则俩向量之前夹角>90^{\circ}

叉积:与点积不同,叉积的结果是另一个向量,如果取向量u和v的叉积,运算所得向量p与u、v彼此正交,{p=u\times v=\left [ \left (u_{y}v_{z}-u_{z}v_{y} \right ) ,\left (u_{z}v_{x}-u_{x}v_{z} \right ) ,\left (u_{x}v_{y}-u_{y}v_{x} \right ) \right ]}  可使用D3DXVec3Cross计算,由图可知向量-p也是与向量u、v正交,叉积运算的次序决定了结果是p还是-p,换言之{u\times v=-(v\times u{ })}  ,这表明叉积不具备交换性,可以借助左右手法则来判断,目前使用的为左手坐标系,则使用左右法则判断,左手四指朝向第一个向量u,然后四指朝着手心的方向弯曲到第二个向量v的方向,拇指的指向就是这俩个向量叉积的方向

矩阵

一个mxn矩阵是一个m行、n列的矩形数组,行数和列数指定了矩阵的维数,有时一个矩阵包含单行或单列,这样的矩阵称为行向量或列向量,如果俩个矩阵维数相同且对应元素也相同,则二者相等,俩个矩阵只有维数相同时才能进行加法、减法运算

 矩阵乘法:为了计算矩阵乘积AB,矩阵A的列数必须等于B的行数,矩阵的乘法一般不具有交换性,若A为m\times n矩阵,B为n\times p矩阵,则乘积AB有意义,且等于一个m\times p矩阵C,其中乘积C的第ij个元素的值等于A的第i个行向量与B的第j个列向量的点积  { c_{ij}=a_{i}\cdot b_{j} }

{ AB=\begin{bmatrix} a_{11} &a_{12} &a_{13} \\ a_{21} &a_{22} &a_{23} \end{bmatrix}\begin{bmatrix} b_{11} &b_{12} \\ b_{21} &b_{22} \\ b_{31} &b_{32} \end{bmatrix}=\begin{bmatrix} c_{11} &c_{12} \\ c_{21} &c_{22} \end{bmatrix}=\begin{bmatrix} a_{11}b_{11}+a_{12}b_{21}+a_{13}b_{31} &a_{11}b_{12}+a_{12}b_{22}+a_{13}b_{32} \\a_{21}b_{11}+a_{22}b_{21}+a_{23}b_{31} &a_{21}b_{12}+a_{22}b_{22}+a_{23}b_{32} \end{bmatrix}}

 单位矩阵:单位矩阵的特点是除主对角线上元素为1外,其余元素均为0,而且是方阵,用一个单位矩阵和某个矩阵相乘,不改变该矩阵,单位矩阵对于标量可认为是矩阵中的"1" MI=IM=M

 逆矩阵:矩阵数学中没有类似于标量除法的运算,但是有一种乘法逆运算,只有方阵才可能有逆矩阵,一个n\times n矩阵M的逆矩阵也是一个n\times n矩阵,用符号M^{-1}表示,并非所有方阵都有逆矩阵,一个矩阵与其逆矩阵的乘积为单位阵:{ MM^{-1}=M^{-1}M=I} ,另一个关于矩阵乘积的逆的有用性质:{(AB)^{-1}=B^{-1}A^{-1}} 该性质的前提是矩阵A、B均可逆,且均为维数相同的方阵

矩阵的转置:矩阵的转置可通过交换矩阵的行和列来实现,一个M\times N的矩阵转置是一个N\times M矩阵,用符号M^{T}来表示矩阵M的的转置A=\begin{bmatrix} 2 &-1 & 8\\ 3 &6 &-4 \end{bmatrix} A^{T}=\begin{bmatrix} 2 &3 \\ -1&6 \\ 8 &-4 \end{bmatrix}

 D3DX矩阵:在D3DX中表示4x4的矩阵,可使用类D3DXMATRIX,它的一个重要的运算符是括号运算符,利用该运算符可以方便的访问矩阵中每一个元素,索引应像C语言中数组一样,下标从0开始D3DX库对于D3DXMATRIX类型的矩阵,提供了转为单位矩阵、取转置以及求逆的函数,如果传入D3DXMatrixInverse函数的矩阵不可逆,则返回一个NULL值,本书中一般忽略第二个参数,调用时设置为0

矩阵的访问1.使用括号运算符"()"(对于D3DXMATRIX类型)   2.使用索引运算符"[]"(对于D3DXMATRIX*)

//括号运算符访问
D3DXMATRIX M;
M(0,0) = 5.0f;

//索引运算符访问
D3DXMATRIX* M;
M[0][0] = 5.0f;


D3DXMatrixIdentity  //转化单位矩阵
D3DXMatrixTranspose //取转置
D3DXMatrixInverse   //求逆

D3DXMATRIX A(...);
D3DXMATRIX B;
D3DXMatrixInverse(&B, 0, &A);

基本变换:使用Direct3D编程时,我们使用4x4的矩阵表示一个变化,思路如下,设置一个4x4的矩阵中元素的值,使其表示一具体变化,然后将某一点的坐标或某一向量的分向量放入一个1x4的的行向量v中,乘积vX就生成了一个新的经过变化的向量{v}',之所以使用4x4矩阵,是因为这种特定维数的矩阵有能力表征所需要的所有变换,至于我们所关心的点和向量都是3D的,为什么要使用1x4的行向量,是为了使向量-矩阵乘积有意义(1x4行向量与4x4矩阵乘积)。

行向量w分量表示: 行向量的第四个分量用w表示,将点放入1x4的行向量时,我们将w分量设为1,这能够保证点的平移变换正确进行,因为向量不含位置信息,所以没有对向量定义平移变换,将1x3向量置入1x4向量时,将w分量置为0(防止对向量实施平移变换),例如点p=(p_{1},p_{2},p_{3})置入行向量后应为\begin{bmatrix} p_{1} & p_{2} & p_{3} & 1 \end{bmatrix},向量v=(v_{1},v_{2},v_{3})置入行向量后应为\begin{bmatrix} p_{1} & p_{2} & p_{3} & 0 \end{bmatrix}

齐次向量、齐次空间:扩展后的4D向量称为齐次向量(可表示点和向量),当一个行向量的w分量不为0,不为1(w\neq 0, w\neq 1)时,我们称该向量处于齐次空间中,以区别与3D空间,将齐次空间中向量映射回3D房间的方法是,用w分量去除该齐次向量的每一个分量,进行3D图形编程时,如果涉及到透视投影,则经常需要将向量由齐次空间映射到3D空间

平移矩阵:将向量(x,y,z,1)(一个点)进行平移操作时,可以使用D3DXMatrixTranslation创建一个平移矩阵,并将向量与该矩阵进行相乘,乘积后为平移之后的向量

旋转矩阵:用于创建绕x、y、z轴旋转的旋转矩阵函数为  D3DXMatrixRotationX    D3DXMatrixRotationY  D3DXMatrixRotationZ

比例变换矩阵:如果想让一个向量沿x、y、z轴分别放大,则可以使用D3DXMatrixScaling来创建比例矩阵,如果将比例矩阵的各个缩放因子取倒数,就得到该矩阵的逆矩阵

向量变换D3DXVec3TransformCoord 用于对点进行变换,并假定向量的第4个分量为1,D3DXVec3TransformNormal 用于对向量的变换,并假定向量的第4个分量为0,D3DXVec3TransformCoordArray用于点数组变换  D3DXVec3TransformNormalArray用于向量数组变换

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值