文章目录

  • 1、3D空间中的向量
    • 1.1、向量相等
    • 1.2、计算向量的长度
    • 1.3、向量的规范化
    • 1.4、向量加法
    • 1.5、向量减法
    • 1.6、数乘
    • 1.7、点积
    • 1.8、叉积
  • 2、矩阵
    • 2.1、矩阵相等、矩阵数乘和矩阵加法
    • 2.2、矩阵乘法
    • 2.3、单位矩阵
    • 2.4、逆矩阵
    • 2.5、矩阵的转置
    • 2.6、D3DX矩阵
  • 3、基本变换
    • 3.1、平移矩阵
    • 3.2、旋转矩阵
    • 3.3、比例变换矩阵
    • 3.4、几何变换的组合
    • 3.5、向量变换的一些函数
  • 4、平面
    • 4.1、D3DXPLANE
    • 4.2、点和平面的空间关系
    • 4.3、平面的创建
    • 4.4、平面的规范化
    • 4.5、平面的变换
    • 4.6、平面中到某一点的最近点
  • 5、射线
    • 5.1、射线
    • 5.2、射线与平面的相交

1、3D空间中的向量

向量的起点不重要

讨论vector时可独立于具体的坐标系,即与具体坐标系无关

计算机图形学中的坐标系和数学中的坐标系不太一样:左手坐标系右手坐标系

UE4中使用左手坐标系

当某一向量的起始端与坐标原点重合时,称该向量处于标准位置

对于处于标准位置的向量,我们可用向量的终点坐标来描该向量。用于描述向量的坐标称为分量(component)

注意区分点和向量

四个特殊的3D向量:

  • 1、零向量(zero vecotr)
  • 2、3D空间的标准基向量

长度为1的向量称为单位向量(unit vector)

3D图形学中会使用2D、3D和4D向量D3DX库提供了类D3DXVECTOR2D3DXVECTOR4分别用于表示2D和4D向量

维数不同的向量都具有相同的属性,即长度和方向,只是维数不同。此外,向量的数学运算除了cross product外都可以推广至任意维数的向量cross product只在3D空间中有定义


1.1、向量相等

可以直接使用类中的已重载的比较运算符来进行比较操作。该比较运算符已经处理好了浮点值比较所存在的问题

1.2、计算向量的长度

使用下面这个函数来计算向量的模

FLOAT D3DXVec3Length(CONST D3DXVECTOR3 *pV);

1.3、向量的规范化

向量的规范化(normalizing)就是使向量的模变为1

使用下面的函数对向量进行规范化

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

在大部分情况下,除非特别声明,一个D3DX数学函数均返回一个指向结果的指针

1.4、向量加法

使用重载后的加法运算符

1.5、向量减法

使用重载后的减法运算符

1.6、数乘

使用重载后的数乘运算符

1.7、点积

点积(dot product)就是向量的对应分量相乘后相加,也可以表示为两个向量的模和夹角余弦值的乘积

正交(orthogonal)垂直(perpendicular)

1.8、叉积

两个向量叉积(cross product)的结果还是一个向量

叉积不具备交换性;交换后,结果反向。

对于向量的叉积运算,使用什么坐标系,就用哪一个手来判断结果向量的方向


2、矩阵

有时一个矩阵仅包含单行或单列。这样的矩阵称为行向量或列向量

2.1、矩阵相等、矩阵数乘和矩阵加法

如你所想

2.2、矩阵乘法

矩阵乘法是矩阵在3D图形学中最重要的运算。借助矩阵乘法,我们能够对向量实施变换,也可将几个变换进行组合

为了计算矩阵乘积AB,矩阵A的列数必须等于矩阵B的行数

矩阵乘法一般不具有交换性

2.3、单位矩阵

单位矩阵(Identity Matrix)的特点是除了主对角线上元素为1外,其余元素均为0,而且是方阵(square matrix)

单位矩阵对于标量可认为是矩阵中的1

2.4、逆矩阵

逆矩阵(inverse matrix)

  • 1、只有方阵才可能有逆矩阵
  • 2、并非所有的方阵都有逆矩阵
  • 3、一个矩阵与其逆矩阵的乘积为单位阵。当一个矩阵与其单位阵相乘时,可交换相乘次序

逆矩阵在求矩阵方程中的其他矩阵时非常有用

(AB)−1=B−1A−1(AB)^{-1}=B^{-1}A^{-1}(AB)−1=B−1A−1,该性质的前提时,矩阵A和B均可逆,且均为维数相同的方阵

2.5、矩阵的转置

矩阵的转置(transpose)可通过交换矩阵的行和列来实现

2.6、D3DX矩阵

编写Direct3D应用程序时,我们通常只使用4x4的矩阵1x4的行向量

  • 1、向量-矩阵乘法
  • 2、矩阵-矩阵乘法:矩阵乘法不具有交换性

对于矩阵,可使用括号运算符(parenthesis operator)来访问矩阵中的每一个元素,索引从零开始,使用圆括号

//基础矩阵
typedef struct D3DMATRIX{union {struct {float 11, 12, 13, 14;float 21, 22, 23, 24;float 31, 32, 33, 34;float 41, 42, 43, 44;};float m[4][4];};
} D3DMATRIX;

关于Union的用法已忘记

单位矩阵、取转置以及求逆都有相应的Direct3D函数来实现


3、基本变换

在3D图形学中,用向量-矩阵乘法来实现各种变换

使用Direct3D编程时,我们使用4x4的矩阵表示一个变换

我们之所以使用4x4矩阵是因为这种特定维数的矩阵有能力表征我们所需要的所有变换

3x3矩阵无法描述平移(translation)透视投影(perspective)以及反射(reflection,对称变换或镜像变换)

为了使向量-矩阵乘积有意义,我们必须将3D的点或向量扩展为4D行向量,因为1x3的行向量和一个4x4的矩阵是无法定义乘法运算的

为了保证点的平移变换能够正确进行,在将放入1x4的行向量时,我们将w分量设为1;为了防止对向量进行平移变换,在我们将向量放入1x4的行向量时,将w分量置为0

扩展后的4D向量称为齐次(homogenous)向量

如果经过变换后的向量的w分量不为0也不为1,则称该向量处于齐次空间(homogenous space)中,以区别于3D空间

将处于齐次空间中的向量映射回3D空间的方法是:用w分量去除该齐次向量的每一个分量

进行3D图形编程时,如果涉及到透视投影,则经常需要将向量由齐次空间映射到3D空间p20

3.1、平移矩阵

Translation matrix

要想对点(x,y,z,1)\begin{pmatrix} x, & y, & z, & 1 \end{pmatrix}(x,​y,​z,​1​)分别沿坐标轴平移px、py、pzp_x、p_y、p_zpx​、py​、pz​个单位,则只需要将该向量与下面的平移矩阵相乘即可(p为平移向量):

T(p)=[100001000010pxpypz1]T(p)=\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ p_x & p_y & p_z & 1 \\ \end{bmatrix}T(p)=⎣⎢⎢⎡​100px​​010py​​001pz​​0001​⎦⎥⎥⎤​

用于创建平移矩阵的D3DX函数为:

D3DXMATRIX *D3DXMatrixTranslation(D3DXMATRIX *pOut,FLOAT x,FLOAT y,FLOAT z
);

平移矩阵的逆矩阵为(将平移向量取负即可):
T−1=T(−p)=[100000100000100−px−py−pz11]T^{-1}=T(-p)=\begin{bmatrix} 1 & 0 & 0 & 0 & 0\\ 0 & 1 & 0 & 0 & 0\\ 0 & 0 & 1 & 0 & 0\\ -p_x & -p_y & -p_z & 1 & 1\\ \end{bmatrix}T−1=T(−p)=⎣⎢⎢⎡​100−px​​010−py​​001−pz​​0001​0001​⎦⎥⎥⎤​

3.2、旋转矩阵

Rotation matrix

方向:当沿着旋转轴指向原点的方向观察时,角度是按顺时针方向度量的

x轴旋转θ\thetaθ度时,所需要的旋转矩阵:
X(θ)=[10000cos⁡θsin⁡θ00−sin⁡θcos⁡θ00001]X(\theta)=\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & \cos\theta & \sin\theta & 0 \\ 0 & -\sin\theta & \cos\theta & 0 \\ 0 & 0 & 0 & 1 \\ \end{bmatrix}X(θ)=⎣⎢⎢⎡​1000​0cosθ−sinθ0​0sinθcosθ0​0001​⎦⎥⎥⎤​

用于创建绕x轴旋转的旋转矩阵的D3DX函数为:

D3DXMATRIX *D3DXMatrixRotationX(D3DXMATRIX *pOut,FLOAT Angle
);

y轴旋转θ\thetaθ度时,所需要的旋转矩阵:
Y(θ)=[cos⁡θ0−sin⁡θ00100sin⁡θ0cos⁡θ00001]Y(\theta)=\begin{bmatrix} \cos\theta & 0 & -\sin\theta & 0 \\ 0 & 1 & 0 & 0 \\ \sin\theta & 0 & \cos\theta & 0 \\ 0 & 0 & 0 & 1 \\ \end{bmatrix}Y(θ)=⎣⎢⎢⎡​cosθ0sinθ0​0100​−sinθ0cosθ0​0001​⎦⎥⎥⎤​

用于创建绕y轴旋转的旋转矩阵的D3DX函数为:

D3DXMATRIX *D3DXMatrixRotationY(D3DXMATRIX *pOut,FLOAT Angle
);

z轴旋转θ\thetaθ度时,所需要的旋转矩阵:
Z(θ)=[cos⁡θsin⁡θ00−sin⁡θcos⁡θ0000100001]Z(\theta)=\begin{bmatrix} \cos\theta & \sin\theta & 0 & 0 \\ -\sin\theta & \cos\theta & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ \end{bmatrix}Z(θ)=⎣⎢⎢⎡​cosθ−sinθ00​sinθcosθ00​0010​0001​⎦⎥⎥⎤​

用于创建绕z轴旋转的旋转矩阵的D3DX函数为:

D3DXMATRIX *D3DXMatrixRotationZ(D3DXMATRIX *pOut,FLOAT Angle
);

旋转矩阵R的逆矩阵与其转置相等,具备这样特点的矩阵称为正交矩阵

3.3、比例变换矩阵

Scaling Matrix

让一个向量沿x、y、z轴分别放大qx、qyq_x、q_yqx​、qy​和qzq_zqz​倍,比例变换矩阵如下:

S(q)=[qx0000qy0000qz00001]S(q)=\begin{bmatrix} q_x & 0 & 0 & 0 \\ 0 & q_y & 0 & 0 \\ 0 & 0 & q_z & 0 \\ 0 & 0 & 0 & 1 \\ \end{bmatrix}S(q)=⎣⎢⎢⎡​qx​000​0qy​00​00qz​0​0001​⎦⎥⎥⎤​

用于创建比例矩阵的D3DX函数为:

D3DXMATRIX *D3DXMatrixScaling(D3DXMATRIX *pOut,FLOAT sx,FLOAT sy,FLOAT sz
)

如果将比例矩阵的各个缩放因子取倒数,就得到该矩阵的逆矩阵

3.4、几何变换的组合

矩阵的一个最关键的优点是:可借助矩阵乘法将几种变换组合为一个变换矩阵。各变换矩阵相乘的次序应与实施变换的次序相同

矩阵的这种整合多种变换的能力对于性能的提高颇有意义

3.5、向量变换的一些函数

  • 1、对进行变换的D3DX函数,假定向量的w分量为1
D3DXVECTOR3 *D3DXVec3TransformCoord(D3DXVECTOR3 *pOut,CONST D3DXVECTOR3 *pV,CONST D3DXVECTOR3 *pM
);
  • 2、对向量进行变换的D3DX函数,假定向量的w分量为0
D3DXVECTOR3 *D3DXVec3TransformNormal(D3DXVECTOR3 *pOut,CONST D3DXVECTOR3 *pV,CONST D3DXVECTOR3 *pM
);

D3DX库还提供了函数D3DXVec3TransformCoorArrayD3DXVec3TransformNormalArray,分别用于点数组向量数组的变换


4、平面

法向量(normal vector)

n⃗⋅(p−p0)=0\vec{n}\sdot(p-p_0)=0n⋅(p−p0​)=0

n⃗⋅p−n⃗⋅p0=0\vec{n}\sdot p - \vec{n}\sdot p_0=0n⋅p−n⋅p0​=0

n⃗⋅p+d=0,d=−n⃗⋅p0\vec{n}\sdot p + d=0,d=-\vec{n}\sdot p_0n⋅p+d=0,d=−n⋅p0​

如果平面法向量的模为1,则d给出了坐标原点到该平面最短的有符号距离(signed distance);当点p不在该平面上时,如果平面法向量的模为1,则n⃗⋅p+d\vec{n}\sdot p + dn⋅p+d给出了该平面到点p的最短的有符号距离(signed distance)

4.1、D3DXPLANE

在代码中表示平面时,仅存储法向量n⃗\vec nn和常量d已经足够了。将平面看成一个4D向量非常有用,可记为(n⃗,d)(\vec n,d)(n,d)

给定一个平面和一个点,D3DX库中用来计算n⃗⋅p+d\vec{n}\sdot p + dn⋅p+d的函数:

//还有一些其他的函数
FLOAT D3DXPlaneDotCoord(CONST D3DXPLANE *pP,CONST D3DXVECTOR3 *pV
);

4.2、点和平面的空间关系

  • 1、点在平面上:
  • 2、点在平面的前方:
  • 3、点在平面的后方:

4.3、平面的创建

用到时再详细研究

一共有三种创建平面的方法:

  • 1、直接指定法向量有向距离
  • 2、用平面上一点法向量来求取有向距离
  • 3、其实大同小异

4.4、平面的规范化

法向量和d都除以法向量的模

D3DXPLANE *D3DXPlaneNormalize(D3DXPLANE *pOut,CONST D3DXPLANE *pP
);

4.5、平面的变换

规范化后的平面与它所期望的变换矩阵的逆转置相乘来实施所期望的变换

都有相应的D3DX库函数来完成相应操作

4.6、平面中到某一点的最近点

利用任意点p到平面的最短有符号距离来进行计算


5、射线

外接球(bounding sphere)

5.1、射线

5.2、射线与平面的相交

计算机图形学必备的数学知识相关推荐

  1. 计算机内存知识txt,计算机新手必备内存实用知识.docx

    在电脑硬件中,CPU和显卡.内存均是重中之重,因此我们在选择这些核心硬件一定要慎重考虑.下面就让小编带你去看看计算机新手必备内存实用知识,希望能帮助到大家! 内存总是不够?HBase&GeoM ...

  2. 机器学习必备的数学知识,一次学会

    面对机器学习,初学者的阻塞点往往不在于机器学习本身,而是数学.机器学习是计算机技术,但它的底层是数学. 通常,在机器学习相关的教材中,通篇都是复杂的数学公式.初学者如果数学基础不牢固,面对满篇的数学公 ...

  3. YDOOK: 学习 AI 人工智能需要必备哪些数学知识?学AI需要学习的数学书与领域

    学习 AI 人工智能需要必备哪些数学知识?学AI需要学习的数学书与领域 1 数学分析,较低要求为高等数学 2 高等线性代数,较低要求为线性代数,空间解析几何 3 概率论.数理统计 与 随机过程 4 张 ...

  4. 关于计算机图形学的3d数学

    三维坐标系(3D Coordinate System) 三维坐标是把二维的平面坐标推广到三维空间中,在三维坐标中,点(x,y,z)的齐次坐标为(nx,ny,nz,n),其中n为任意不为0的数,规范化的 ...

  5. 计算机c语言与数学知识的联系,计算机数学基础知识

    计算机数学基础是计算机专业必修的数学基础知识.以下是小编整理的关于计算机数学基础知识,希望大家认真阅读! 1.计算机数学基础 是计算机专业必修的数学基础知识.针对计算机专业的特点,加强了Mathema ...

  6. Paddle_程序员必备的数学知识_转发

    程序员--必备数学知识 !!!Attention 本博客转发至百度aistudio的<深度学习7日入门-cv疫情检测>,课程非常棒!本人力推! 博客转发地址:https://aistudi ...

  7. 计算机图形数学知识,平面----计算机图形学的基础几何知识

    平面在数学上的定义是,平面,是指面上任意两点的连线整个落在此面上. 在现实生活中你很容易一眼看出什么平面,但是在计算机的程序里,你将如何表示一个平面的呢? 又是怎么样求点到平面的距离? 判断点在平面的 ...

  8. C#(Sharp)GDI plus与图形编程(计算机图形学必备知识)

    文章目录 9.1 GDI+与图形编程 9.1.0 GDI概念 9.1.1 GDI+绘图命名空间 9.1.2 坐标系统 9.1.3 Graphics类 9.2 绘图工具类 9.2.1 Pen类 9.2. ...

  9. 数学之美--计算机图形学中的数学方法论

    我的github: https://github.com/jackyblf 我的公众号: 早期研究3D程序开发的程序员最大的情怀就是从无到有,自己实现一个游戏引擎.当时的我也是充满着这种复古情怀!! ...

最新文章

  1. 第三课 查询指定id的单个对象
  2. python多线程网络编程_python之网络编程-多线程
  3. 开始→运行→输入的命令集锦 1
  4. String、StringBuffer、StringBuilder区别
  5. FPGA构造spi时序——AD7176为例(转)
  6. C++文档阅读笔记-STL中pair的初步解析
  7. Angularjs 中使用 layDate 日期控件
  8. win7系统修改启动项
  9. MySQL高级-内存管理及优化
  10. 树形数据深度排序处理示例(模拟单编号法).sql
  11. XP安装QQ提示安装包可能被非法改动无法安装
  12. 计算机大类专业学习c语言之重要性
  13. WebRoot 与 WEB-INF 相关问题学习整理
  14. 《码农翻身:用故事给技术加点料》的思维导图
  15. let , const , var , 的区别
  16. 生活污水处理厂工程脱水车间设计、果汁饮料厂工艺流程及车间平面布置CAD设计、水处理车间工艺图、氯乙烯分离车间平面布置图、乳品车间设备布置图、核桃乳饮料厂工艺流程及车间平面布置CAD设计……
  17. 上海职称不用考计算机和英语翻译,英语翻译专业资格考试替代职称评定
  18. Unity3d 5烘焙相关
  19. 凝胶渗透色谱的测试原理
  20. 密室内无人机悬停一天,受地球自转影响后,是否还在原地?

热门文章

  1. 传奇登录器打不开的四种原因
  2. 基于jsp+mysql+ssm妇女联合会管理系统-计算机毕业设计
  3. Skywalking极简入门
  4. 智能插座 一Homekit智能家居
  5. [Excel表格]单元格内换行
  6. php扩展库后门,编写基于PHP扩展库的后门
  7. 思维导图与概念图的区别是什么?
  8. “桃李争春 答谢师恩”王老吉药业携手海王星辰开展感恩教师节活动
  9. 量化金融论文:Astock
  10. 关键词搜图、截图小助手——有了它妈妈再也不用担心我数据集啦