• 基础数学知识


    左手系和右手系

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

    向量

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

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

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

    1. int main()
    2. {
    3. D3DXVECTOR3 v(1.0f, 2.0f, 3.0f);
    4. float length = D3DXVec3Length(&v);
    5. std::cout << length << std::endl;
    6. }

    向量规范化:使向量的模变为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数学函数均返回一个指向结果的指针

    1. D3DXVECTOR3* WINAPI D3DXVec3Normalize
    2. ( 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 M;
    2. M(0,0) = 5.0f;
    3. D3DXMatrixIdentity //转化单位矩阵
    4. D3DXMatrixTranspose //取转置
    5. D3DXMatrixInverse //求逆
    6. D3DXMATRIX A(...);
    7. D3DXMATRIX B;
    8. 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用于向量数组变换

  • 相关阅读:
    数据结构——线性表作业
    Django第三章(模版系统全局变量-if判断-for循环-过滤器-模版继承/引用-引用静态文件)
    《数据结构、算法与应用C++语言描述》使用C++语言实现链表队列
    oracle数据库中job和dbms_job比较
    《安富莱嵌入式周报》第279期:强劲的代码片段搜索工具,卡内基梅隆大学安全可靠C编码标准,Nordic发布双频WiFi6 nRF7002芯片
    SAP UI5 SmartTable 控件的使用介绍试读版
    A-Level数学例题解析及练习Natural logarithms
    【opencv图像处理】--1. 图像,视频,鼠标,trackbar控件简单使用
    【kali-信息收集】(1.2)SNMP枚举:Snmpwalk、Snmpcheck;SMTP枚举:smtp-user-enum
    华为18级工程师一年心血终成Liunx教程,入门到高级附手册
  • 原文地址:https://blog.csdn.net/SwordArcher/article/details/126752763