本博文为博主原创,转载请注明出处: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