本博文为博主原创,转载请注明出处:http://blog.csdn.net/xiemotongye/article/details/9052165
接触OpenGL和计算机图形学有一段时间了,一直想写一点东西,记录自己的学习历程,或许也能够为有意愿向计算机图形学发展的菜鸟们提供一条捷径。
闲话不多说,本章主要介绍计算机图形学中三维数学的一些基础知识,主要包括2D、3D笛卡尔坐标系,向量、矩阵的数学和几何意义以及公式。由于篇幅限制,其中的推导过程本文不作叙述,感兴趣的读者可以去看《3D数学基础+图形与游戏开发》,已上传,链接地址在本文末尾。
一、计算机图形学
计算机图形学(Computer Graphics)是一种使用数学算法将二维或三维图形转化为计算机显示器的栅格形式的科学。其广泛应用于游戏、动画、仿真、虚拟现实(VR)、增强现实(AR)等领域。
在数学之中,研究自然数和整数的领域称为离散数学,研究实数的领域称作连续数学。
在计算机图形学中,为虚拟世界选择度量单位的关键是选择离散的精度。一种错误的观点认为short、int是离散的,而float、double是连续的,而事实上,这些数据类型都是离散的。于是,计算机图形学有如下准则:
计算机图形学第一准则:近似原则——如果它看上去是对的,它就是对的。
二、笛卡尔坐标系
2D笛卡尔坐标系是一个精确定位点的框架。2D坐标的标准表示法是(x,y),相信大家初中都学过。一般,标准的笛卡尔坐标系是x轴向右,y轴向上。而计算机图形学中的屏幕坐标往往是x轴向右,y轴向下。如图1所示。
图1:2D笛卡尔坐标系和2D屏幕坐标系
3D笛卡尔坐标系类似,增加了第三个维度,z轴。3D坐标系分为完全不同的2种坐标系,左手坐标系和右手坐标系。判断方法为,左手坐标系:伸出左手,让拇指和食指成“L”形,大拇指向右,食指向上,其余手指指向前方。此时,拇指、食指和其余三指分别代表x、y、z轴的正方向。右手坐标系,相同,只是把左手换成右手。如图2所示。
图2:左手坐标系与右手坐标系
其中左手坐标系广泛应用于计算机图形学、D3D之中,而右手坐标系广泛应用于OpenGL、线性代数、3DSMax之中。
三、多坐标系
任何一个3D坐标系都是可以无限延伸的,可以包含空间中所有的点,因此,只需要一个坐标系,就能描述所有的点。但是,人们发现,不同情况下使用不同的坐标系会更为方便。
1.世界坐标系
世界坐标系是一个特殊的坐标系,它描述了其他坐标系所需要的参考框架。它是一个坐标系系统中最大的、最外部的坐标系。“向东”、“向南”这些概念只有在世界坐标系中才有。
2.物体坐标系
物体坐标系是和特定物体相关的坐标系。每个物体都有独立的坐标系。“前”、“后”、“左”、“右”这些概念只有在物体坐标系中才有意义。
3.摄像机坐标系
摄像机坐标系是于观察者密切相关的坐标系,它是一种特殊的物体坐标系,被定义在摄像机的屏幕可视区域。摄像机坐标系中,摄像机在原点,x轴向右,z轴向前(朝向屏幕内或摄像机方向),y轴向上(不是世界的上方而是摄像机本身的上方)。
4.惯性坐标系
惯性坐标系简化了世界坐标系到物体坐标系的转换。其原点与物体坐标系重合,而坐标轴与世界坐标系平行。
引入惯性坐标系的意义在于:物体坐标系转换到惯性坐标系只需要旋转,从惯性坐标系转换到世界坐标系只需要平移。
四、向量
对程序猿而言,向量就是一个数组。数组包含的“数”的数目就是向量的维度。一般计算机图形学中的向量主要讨论2维、3维和4维向量。前两者一般用于2维、3维空间中位置和位移的表示,4维向量一般用于颜色(RGB和透明度alpha)。
任意一个点都可以用从原点开始的向量来表示。
下面就是本章重点之一,向量运算法则(示例皆为3维向量):
1.负向量
- [ x y z ] = [ -x -y -z ]
几何意义:向量变负,将得到一个与原向量大小相等,方向相反的向量。
2.向量的模
|| v || = sqrt( x ^ 2 + y ^ 2 + z ^ 2 )
上公式中sqrt表示开方。
几何意义:向量的长度
3.标量与向量的乘法
k [ x y z ] = [ kx ky kz ]
几何意义:以因子|k|缩放向量的长度,如果k < 0则向量的方向被倒转。
4.向量的加减法
[ x1 y1 z1 ] + [ x2 y2 z2 ] = [ x1+x2 y1+y2 z1+z2 ]
[ x1 y1 z1 ] - [ x2 y2 z2 ] = [ x1-x2 y1-y2 z1-z2 ]
几何意义:向量a和b相加的几何解释为:平移向量,使向量a的头连接向量b的尾,接着从a的尾向b的头画一个向量,这就是向量加法的“三角形法则”。减法与之类似。
5.向量点乘
术语“点乘”来自记法a·b中的点号,点乘中的点乘号不可省略。其优先级高于加法和减法。
[ x1 y1 z1 ] · [ x2 y2 z2 ] = x1x2 + y1y2 + z1z2
几何意义:点乘结果越大,2个向量越接近。
a·b = || a || || b || cosθ
θ为两向量夹角
6.向量叉乘
术语“叉乘”来自于记法aXb中的叉号。叉乘号不能省略。叉乘优先级高于点乘。
[ x1 y1 z1 ] X [ x2 y2 z2 ] = [ y1z2-z1y2 z1x2-x1z2 x1y2-y1x2 ]
叉乘不满足结合律。满足反交换律:aXb = -(bXa)
几何意义:aXb垂直于a、b,指向a、b所在平面的正上方,大小为以a、b为两边的平行四边形的面积,即为||a|| ||b|| sinθ。
五、矩阵
对程序猿来说,向量是一维数组,矩阵就是二维数组。向量是标量的数组,矩阵是向量的数组。
矩阵的运算法则如下:
1.标量与矩阵相乘
| m11 m12 m13 | | km11 km12 km13 |
kM = k | m21 m22 m23 | = | km21 km22 km23 |
| m31 m32 m33 | | km31 km32 km33 |
2.矩阵乘法
只有满足特定情况,两个矩阵才能相乘,一个rXn的矩阵A可以和nXc的矩阵B相乘,结果为一个rXc的矩阵,记为AB。矩阵乘法满足结合律,不满足交换律。
三维矩阵相乘的情况:
| a11 a12 a13 | | b11 b12 b13 |
AB = | a21 a22 a23 | | b21 b22 b23 |
| a31 a32 a33 | | b31 b32 b33 |
| a11b11+a12b21+a13b31 a11b12+a12b22+a13b32 a11b13+a12b23+a13b33 |
= | a21b11+a22b21+a23b31 a21b12+a22b22+a23b32 a21b13+a22b23+a23b33 |
| a31b11+a32b21+a33b31 a31b12+a32b22+a33b32 a31b13+a32b23+a33b33 |
矩阵的几何意义:矩阵很抽象,一般来说,方阵(行列数相等的矩阵)能描述任意线性变换。下面将具体讲述矩阵和线性变换的公式。
六、矩阵和线性变换
1.旋转
绕单位向量n旋转θ角度的旋转矩阵为:
| nx^2(1 - cosθ)+cosθ nxny(1 - cosθ) + nzsinθ nxnz(1 - cosθ) - nysinθ |
R(n,θ) = | nxny(1 - cosθ)-nzsinθ ny^2(1 - cosθ) + cosθ nynz(1 - cosθ) + nxsinθ |
| nxnz(1 - cosθ)+nysinθ nynz(1 - cosθ) - nxsinθ nz^2(1 - cosθ) + cosθ |
2.缩放
以单位向量n为缩放方向,k为因子的缩放矩阵为:
| 1+(k - 1)nx^2 (k - 1)nxny (k - 1)nxnz |
S(n, k) = | (k - 1)nxny 1+(k - 1)ny^2 (k - 1)nynz |
| (k - 1)nxnz (k - 1)nzny 1+(k - 1)nz^2|
3.正交投影
向垂直于单位向量n的平面的投影矩阵为:
| 1-nx^2 -nxny -nxnz |
P(n) = | -nxny 1-ny^2 -nynz |
| -nxnz -nzny 1-nz^2 |
4.镜像
通过原点且垂直于n的平面的镜像变换矩阵为:
| 1-2nx^2 -2nxny -2nxnz |
S(n, -1) = | -2nxny 1-2ny^2 -2nynz |
| -2nxnz -2nzny 1-2nz^2 |
5.变换的组合
变换组合在渲染中非常普遍,设想世界中有一任意方向、任意位置的物体,我们要把他渲染到任意方向、任意位置的摄像机中。为了做到这一点,我们必须将物体的所有顶点从物体坐标系变换到世界坐标系,接着再从世界坐标系变换到摄像机坐标系。
其中数学变换如下:
P世界 =P物体M物体->世界
P相机 =P世界M世界->相机=(P物体 M物体->世界)M世界->相机=P物体(M物体->世界M世界->相机)
这样就能在渲染的循环外先将所有矩阵组合起来,使循环内作矩阵乘法时只需要和一个矩阵相乘即可(省一次矩阵乘法,效率可提高不少)。
三维图形学中的坐标系,向量、矩阵的数学和几何意义以及公式就到此为止,本文涵盖了《3D数学基础+图形与游戏开发》前八章的大部分内容。单纯的理论知识是枯燥乏味的,但三维虚拟世界是丰富多彩的,希望阅读本文的读者将其作为三维图形学基础知识的笔记来看待。
参考资料:《3D数学基础+图形与游戏开发》
资料地址:http://download.csdn.net/detail/xiemotongye/5306709