1、计算机图形学数学基础
坐标系
坐标系是一种用于确定空间中点的位置的数学工具。它由一组坐标轴和一个原点组成。坐标轴通常是相互垂直的直线,用于测量点在不同方向上的距离。原点是坐标轴的交点,通常被标记为(0,0)或(0,0,0),具体取决于坐标系的维度。
![]() ![]() |
---|
坐标系用途
- 准确描述位置
- 方便计算和分析,如使用坐标系来计算两个点之间的距离、向量的长度和方向等
- 统一标准:在地理信息系统中,不同的地图和数据通常使用相同的坐标系,以便更好地进行数据的整合和分析
坐标系种类
直角坐标系(笛卡尔)
二维
直角坐标系也称为笛卡尔坐标系,是最常见的二维坐标系。它由两条相互垂直的坐标轴组成,通常分别标记为 x 轴和 y 轴。

三维
常见的三维坐标系。它由三条相互垂直的坐标轴组成,通常分别标记为 x 轴、y 轴和 z 轴。
左右手坐标系
在众多的图形技术应用中,DiectX
采用的是左手坐标系,而OpenGL
则使用右手坐标系。需知,无论最终选用哪种坐标系其实都不存在根本性的问题,关键在于整个体系的统一。只有确保坐标系的统一,才能在各种计算和图形处理中保持一致性,避免因坐标系的混乱而导致的错误和不准确性。无论是进行复杂的三维建模,还是进行精确的图形渲染,统一的坐标系都是至关重要的基础。
极坐标
极坐标系是一种用角度和距离来表示点位置的坐标系。它由一个极点和一条极轴组成。在极坐标系中,一个点的位置可以用一个有序对(r,θ)
来表示,其中 r 表示点到极点的距离,θ 表示点与极轴的夹角。球坐标
球坐标系是一种用半径、角度和方位角来表示点位置的坐标系。它由一个原点、一个半径轴和两个角度轴组成。在球坐标系中,一个点的位置可以用一个有序三元组(r,θ,φ)
来表示,其中 r 表示点到原点的距离,θ 表示点与 z 轴的夹角,φ 表示点在 x-y 平面上的方位角。

多坐标系的使用
在三维空间中,经常需要使用多个坐标系来描述不同的物体或现象。例如,在机器人运动学中,我们需要使用世界坐标系、机器人坐标系和工具坐标系来描述机器人的位置和姿态。
世界坐标系:世界坐标系是一个固定的坐标系,用于描述整个三维空间中的物体和现象。它通常被定义为一个直角坐标系,其原点和坐标轴的方向可以根据具体的应用场景进行选择。
**局部坐标系:**局部坐标系是相对于某个物体或参考系的坐标系。它通常用于描述物体的内部结构或相对位置。
颜色
RGB颜色模型
RGB 颜色模型是一种基于三原色(红、绿、蓝)的颜色模型。在 RGB 颜色模型中,每种颜色都由三个分量组成,分别表示红色、绿色和蓝色的强度。
HSV(HSB)颜色模型
HSV 颜色模型是一种基于色调(Hue)、饱和度(Saturation)和明度(Value)的颜色模型。色调表示颜色的种类,如红色、蓝色、绿色等;饱和度表示颜色的纯度,即颜色的鲜艳程度;明度表示颜色的明亮程度。通过调整这三个分量的值,可以得到各种不同的颜色。
OpenGL中颜色的应用
在许多老旧的图形接口或数据格式中,颜色分量常常使用8位无符号整数(即byte)表示,范围是0到255,
在OpenGL中,颜色通常通过四个组成部分表示:红色(R)、绿色(G)、蓝色(B)、透明度(A),这四个值一起决定了一个颜色的最终显示效果。在大多数OpenGL应用中,每个颜色分量的值范围从0.0到1.0,其中0.0意味着该分量没有贡献,1.0意味着该分量的最大贡献。
使用0-1的原因
标准化处理:使用0到1的浮点数区间可以在不同的硬件和软件环境中保持颜色表示的一致性。这种表示方法不依赖于特定的色深(比如8位、16位或32位),使得颜色处理在不同的平台和设备上更加标准化和兼容。
精度和灵活性:浮点数提供了比整数更高的精度,这使得色彩之间的过渡更加平滑,可以实现更细腻的渲染效果。同时,浮点数的表示范围更广,使得超出传统0到255范围的色彩值(例如高动态范围图像)可以被方便地表示和处理。
简化计算:在图形渲染过程中,颜色需要经过各种计算,比如混合、调制、光照计算等。使用0到1的浮点数可以使这些计算更加直接和高效。例如,颜色的混合可以直接通过浮点数的加权平均来实现,而无需额外的缩放步骤。
着色器编程:现代图形接口广泛采用着色器来实现高级渲染效果。在着色器语言中,使用0到1的浮点数表示颜色可以简化编程模型,使得开发者能够更容易地编写和优化颜色处理相关的算法。
与物理现实的对应:在一些高级渲染技术中,如物理渲染、光线追踪等,颜色的表示通常需要反映真实世界的光照和颜色混合行为。使用0到1的浮点数区间方便与物理单位(如光照强度)进行换算,从而实现更加真实的渲染效果。
向量
直角坐标系中,我们可以通过三个坐标轴上的坐标来确定一个三维向量。一个向量在 x 轴上的分量为 a,y 轴上的分量为 b,z 轴上的分量为 c,那么这个向量就可以表示为(a,b,c)
向量基本运算
加法
向量加法:向量加法的定义是将两个向量的对应分量相加。例如,向量(a,b,c)
和向量(d,e,f)
相加,结果就是(a+d,b+e,c+f)
减法
向量减法是将两个向量的对应分量相减。比如,向量(a,b,c)减去向量(d,e,f),结果是(a-d,b-e,c-f)。
数乘
数乘向量就是用一个标量乘以向量的每个分量。例如,k 乘以向量(a,b,c),结果是(ka,kb,kc)
叉乘
对于两个三维向量 A = (a₁, a₂, a₃) 和 B = (b₁, b₂, b₃),它们的叉乘记作 A×B,结果是一个新的三维向量 C = (c₁, c₂, c₃),其中:c₁ = a₂b₃ - a₃b₂
;c₂ = a₃b₁ - a₁b₃
;c₃ = a₁b₂ - a₂b₁
。
向量叉乘的几何意义:向量叉乘的结果向量垂直于原来的两个向量,在计算机图形学中有重要应用,经常用来确定平面的法向量等
点乘
向量的长度(模):
单位向量:单位向量是指模为 1 的向量。对于一个非零向量,我们可以通过将它除以它的模来得到一个单位向量。
两个向量分别为(a,b,c)
和(d,e,f)
,点积是,它们的夹角可以通过
来计算。夹角θ在判断向量方向关系中很重要,比如当夹角为 0 时,两个向量平行;当夹角为 90 度时,两个向量垂直。
矩阵
一个物体在空间中进行复杂的旋转、缩放和平移,这些效果的实现都离不开矩阵,矩阵是由若干行和若干列的数字组成的矩形数组。比如一个 3×3 (3行x3列)的矩阵可以写成:
常见的矩阵类型有
- 方阵,行数和列数相等
- 单位矩阵,主对角线元素都是 1,其余元素都是 0 的矩阵
- 零矩阵,所有元素都是 0 的矩阵
矩阵基本运算
加减法
矩阵的加法和减法是对应元素相加减
那么 A+B 的结果就是:
乘法
只有在第一个矩阵的列数和第二个矩阵的行数相同时才有意义
在三维图形学中,矩阵乘法常常用于组合多个变换。比如先进行旋转,再进行平移,就可以通过矩阵乘法把两个变换矩阵组合起来。
矩阵的逆
如果一个矩阵 A 存在一个矩阵 B,使得 A×B = B×A = 单位矩阵,那么矩阵 B 就是矩阵 A 的逆矩阵,记作,并非所有矩阵都有逆矩阵,只有方阵且行列式不为 0 的矩阵才有逆矩阵。
在图形变换中,逆矩阵可以用来实现逆变换。
例如,如果对一个物体进行了一系列的变换,想要恢复到原来的状态,就可以使用逆矩阵进行逆变换。
再比如已知两个三维物体A、B,他们的世界矩阵为AM
,BM
此时将物体A变换到物体B坐标系下,只需要将物体A乘BM的逆即可,反之物体B变换到物体A坐标系下,只需要将物体B乘AM的逆即可
矩阵转置
对于一个矩阵 A,将其行和列互换得到的新矩阵称为 A 的转置矩阵
向量与矩阵相乘
计算过程如下:
注意矩阵乘法不符合交换律,左乘右乘意义结果不同
DiectX
使用的是行向量,OpenGL
使用的是列向量
矩阵的三维变换
缩放矩阵
创建一个物体、向量、坐标,可以创建一个缩放矩阵,在(X,Y,Z)三个方向上的缩放
X,Y,Z方向都缩放1
X,Y,Z方向都缩放5
设置XYZ方向缩放比例不同
旋转矩阵
- 欧拉角方式
绕X,Y,Z轴的旋转公式如下:
如果不是绕着一个周旋转,则可以将三个轴向相乘,得到完整的旋转向量,不过一定注意顺序,并且单位均为弧度制
这种方式非常直观,通常用于交互输入,缺点是有万向锁等问题,
- 轴角方式
任意轴的旋转角θ,单位均为弧度制,优点是可以绕任意的轴
平移矩阵
旋转、缩放矩阵都是3x3的矩阵,我们可以直接在后面增加一行和一列,形成4x4的矩阵(齐次坐标),可以形成一个完整的矩阵,包含旋转、缩放和平移。
投影矩阵
投影矩阵的目的是将场景中物体投影到近端修剪平面上(转换成二维) 用于屏幕显示
- 正交投影
- 透视投影
四元数
四元数由一个实数分量和三个虚数分量组成,记作:
w 是实数部分(标量部分),x,y,z 是虚数部分(向量部分)
i,j,k 是虚数单位,满足以下乘法规则
乘法不满足交换律(如 ij
不等于ji
),这是四元数与复数的重要区别
叉乘(旋转的叠加)
四元数的叉乘与向量的叉乘在计算方式上有一定相似之处,但要注意四元数叉乘不满足交换律。
在三维图形学中,四元数的叉乘可以实现旋转的叠加。例如,有两个四元数分别表示两个旋转,通过叉乘操作可以得到一个新的四元数,它代表了这两个旋转的组合效果。具体计算过程相对复杂,但可以类比向量叉乘的计算,从四元数的乘法规则出发,结合四元数的特殊性质来进行。这种旋转叠加的特性在处理复杂的物体旋转和动画效果时非常有用,可以方便地组合多个旋转操作,实现更加丰富的图形变换。
点乘(判断相似性)
四元数的点乘与向量的点乘计算方式一致。四元数的点乘可以用来判断两个四元数所表示的旋转的相似性。
当两个四元数的点乘结果接近 1 时,说明它们所表示的旋转非常相似;当点乘结果接近 -1 时,说明它们所表示的旋转几乎相反。
通过四元数的点乘,我们可以在图形学中进行一些优化操作,例如判断物体的旋转状态是否接近某个目标旋转,以便进行相应的调整和动画过渡。
四元数的共轭
四元数的共轭等于四元数[-X,-Y,-Z,W]模长为1的四元数,其共轭就是其逆
逆(反方向旋转)
四元数的逆等于四元数的共轭除以四元数的模。
四元数的模可以通过来计算。在图形学中,四元数的逆可以用来实现反方向的旋转。例如,如果我们有一个表示某个旋转的四元数,通过求它的逆四元数,可以得到一个表示反方向旋转的四元数。这在实现物体的反向旋转、撤销旋转操作或者进行对称变换等方面非常有用。
单位四元数
单位四元数的集合在四元数乘法下是封闭的。也就是说,两个单位四元数相乘的结果仍然是一个单位四元数,这使得我们可以通过组合多个单位四元数来实现复杂的旋转操作。
单位四元数的逆也是一个单位四元数[X,Y,Z,W]。对于单位四元数,它的逆为[-X,-Y,-Z,W] 。逆四元数可以用来实现反方向的旋转操作。
四元数与向量相乘
在计算机图形学中,我们可以将一个三维向量看作是一个纯虚四元数,即形式为[X,Y,Z,0]。四元数与向量相乘的结果是一个新的向量,这个过程实际上是通过四元数乘法规则来实现的。
假设向量u与四元数q相乘首先将向量u转换为纯虚四元数形式:u [X,Y,Z,0] 。然后进行四元数乘法运算:q * u * q -1其中* q -1是q的逆四元数。
四元数在图形学中的应用
动画中的旋转插值:在动画中,我们常常需要在两个旋转之间进行平滑过渡。使用四元数插值可以实现非常自然的旋转效果。比如,球线性插值(Slerp)就是一种常用的四元数插值方法。与线性插值相比,四元数插值能够避免旋转过程中的不自然跳跃,使动画更加流畅。
物体的旋转操作:在三维图形学中,我们可以用四元数来控制物体在三维空间中的旋转。通过调整四元数的参数,可以实现物体的各种旋转动作。
组合旋转:多个四元数旋转可以通过依次相乘来实现组合。这样可以方便地实现复杂的旋转效果。
1、计算机图形学数学基础