计算机图形学必备的数学知识
文章目录
- 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库
提供了类D3DXVECTOR2
和D3DXVECTOR4
分别用于表示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)=⎣⎢⎢⎡100px010py001pz0001⎦⎥⎥⎤
用于创建平移矩阵
的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−px010−py001−pz00010001⎦⎥⎥⎤
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(θ)=⎣⎢⎢⎡10000cosθ−sinθ00sinθcosθ00001⎦⎥⎥⎤
用于创建绕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θ00100−sinθ0cosθ00001⎦⎥⎥⎤
用于创建绕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θ00sinθcosθ0000100001⎦⎥⎥⎤
用于创建绕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)=⎣⎢⎢⎡qx0000qy0000qz00001⎦⎥⎥⎤
用于创建比例矩阵
的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库还提供了函数D3DXVec3TransformCoorArray
和D3DXVec3TransformNormalArray
,分别用于点数组
和向量数组
的变换
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、射线与平面的相交
计算机图形学必备的数学知识相关推荐
- 计算机内存知识txt,计算机新手必备内存实用知识.docx
在电脑硬件中,CPU和显卡.内存均是重中之重,因此我们在选择这些核心硬件一定要慎重考虑.下面就让小编带你去看看计算机新手必备内存实用知识,希望能帮助到大家! 内存总是不够?HBase&GeoM ...
- 机器学习必备的数学知识,一次学会
面对机器学习,初学者的阻塞点往往不在于机器学习本身,而是数学.机器学习是计算机技术,但它的底层是数学. 通常,在机器学习相关的教材中,通篇都是复杂的数学公式.初学者如果数学基础不牢固,面对满篇的数学公 ...
- YDOOK: 学习 AI 人工智能需要必备哪些数学知识?学AI需要学习的数学书与领域
学习 AI 人工智能需要必备哪些数学知识?学AI需要学习的数学书与领域 1 数学分析,较低要求为高等数学 2 高等线性代数,较低要求为线性代数,空间解析几何 3 概率论.数理统计 与 随机过程 4 张 ...
- 关于计算机图形学的3d数学
三维坐标系(3D Coordinate System) 三维坐标是把二维的平面坐标推广到三维空间中,在三维坐标中,点(x,y,z)的齐次坐标为(nx,ny,nz,n),其中n为任意不为0的数,规范化的 ...
- 计算机c语言与数学知识的联系,计算机数学基础知识
计算机数学基础是计算机专业必修的数学基础知识.以下是小编整理的关于计算机数学基础知识,希望大家认真阅读! 1.计算机数学基础 是计算机专业必修的数学基础知识.针对计算机专业的特点,加强了Mathema ...
- Paddle_程序员必备的数学知识_转发
程序员--必备数学知识 !!!Attention 本博客转发至百度aistudio的<深度学习7日入门-cv疫情检测>,课程非常棒!本人力推! 博客转发地址:https://aistudi ...
- 计算机图形数学知识,平面----计算机图形学的基础几何知识
平面在数学上的定义是,平面,是指面上任意两点的连线整个落在此面上. 在现实生活中你很容易一眼看出什么平面,但是在计算机的程序里,你将如何表示一个平面的呢? 又是怎么样求点到平面的距离? 判断点在平面的 ...
- 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. ...
- 数学之美--计算机图形学中的数学方法论
我的github: https://github.com/jackyblf 我的公众号: 早期研究3D程序开发的程序员最大的情怀就是从无到有,自己实现一个游戏引擎.当时的我也是充满着这种复古情怀!! ...
最新文章
- 第三课 查询指定id的单个对象
- python多线程网络编程_python之网络编程-多线程
- 开始→运行→输入的命令集锦 1
- String、StringBuffer、StringBuilder区别
- FPGA构造spi时序——AD7176为例(转)
- C++文档阅读笔记-STL中pair的初步解析
- Angularjs 中使用 layDate 日期控件
- win7系统修改启动项
- MySQL高级-内存管理及优化
- 树形数据深度排序处理示例(模拟单编号法).sql
- XP安装QQ提示安装包可能被非法改动无法安装
- 计算机大类专业学习c语言之重要性
- WebRoot 与 WEB-INF 相关问题学习整理
- 《码农翻身:用故事给技术加点料》的思维导图
- let , const , var , 的区别
- 生活污水处理厂工程脱水车间设计、果汁饮料厂工艺流程及车间平面布置CAD设计、水处理车间工艺图、氯乙烯分离车间平面布置图、乳品车间设备布置图、核桃乳饮料厂工艺流程及车间平面布置CAD设计……
- 上海职称不用考计算机和英语翻译,英语翻译专业资格考试替代职称评定
- Unity3d 5烘焙相关
- 凝胶渗透色谱的测试原理
- 密室内无人机悬停一天,受地球自转影响后,是否还在原地?