3D图形数学
文章平均质量分 77
gogoda
这个作者很懒,什么都没留下…
展开
-
3D中的方位和角位移的C++实现(1)
数学理论基础请参阅3D中的方位和角位移。处理变换是一件非常令人头疼的事,矩阵更是棘手。如果你曾经编写过关于矩阵的代码并且没有用设计良好的类,你会发现经常要处理负号、转置矩阵或翻转连接顺序以使其能正常工作。下面这几个类正是为了消除在编程中经常遇到的这类问题而设计的。例如,很少需要直接访问矩阵或四元数中的元素,因此特意限制了可用操作的数目以避免产生迷惑,再如,对cRotationMatrix类转载 2009-06-21 22:35:00 · 1125 阅读 · 0 评论 -
3D中的方位和角位移(3)
四元数记法 一个四元数包含一个标量和一个3D向量分量,经常记标量分量为w,记向量分量为单一的 v 或分开的x、y、z。两种记法分别如下:[w v ][w, (x, y, z)]在某些情况下,用 v 这样的短记法更方便,但在另一些情况下,"扩展"的记法会更清楚。也可以将四元数竖着写,有时这会使等式的格式一目了然,"行"或"列"四元数没有明显的区别。 四元数和复数 复数转载 2009-06-21 22:28:00 · 1501 阅读 · 0 评论 -
3D数学 ---- 矩阵的更多知识(2)
矩阵的逆另外一种重要的矩阵运算是矩阵的求逆,这个运算只能用于方阵。 运算法则方阵M的逆,记作M-1,也是一个矩阵。当M与M-1相乘时,结果是单位矩阵。表示为公式9.6的形式:并非所有的矩阵都有逆。一个明显的例子是若矩阵的某一行或列上的元素都为0,用任何矩阵乘以该矩阵,结果都是一个零矩阵。如果一个矩阵有逆矩阵,那么称它为可逆的或非奇异的。如果一个矩阵没有逆矩阵,则称它为不可逆转载 2009-06-21 22:15:00 · 1072 阅读 · 0 评论 -
三角网格(1)
最简单的情形,多边形网格不过是一个多边形列表;三角网格就是全部由三角形组成的多边形网格。多边形和三角网格在图形学和建模中广泛使用,用来模拟复杂物体的表面,如建筑、车辆、人体,当然还有茶壶等。图14.1给出一些例子:当然,任意多边形网格都能转换成三角网格,三角网格以其简单性而吸引人,相对于一般多边形网格,许多操作对三角网格更容易。 表示网格三角网格为一个三角形列表,所以最直接的表转载 2009-06-21 21:59:00 · 1258 阅读 · 0 评论 -
三角网格(4)
逐片操作三角网格是顶点和三角形的列表。三角网格的一系列基本操作都是逐点和逐三角形应用基本操作的结果。最明显的,渲染和转换都属于这种操作。为渲染三角网格,我们逐个三角形渲染,如要向三角网格应用转换,如旋转和缩放等,应逐顶点进行。 焊接顶点当两个或更多顶点(也许有误差)时,将它们焊接在一起是有益处的。更加准确地说,删除其余的,只剩一个。例如,我们要焊接图14.9中的A和B,有两个步骤:转载 2009-06-21 21:53:00 · 1779 阅读 · 2 评论 -
3D图形数学(4)
镜面反射分量标准光照方程的镜面反射分量指由光源直接经物体表面反射入眼睛的光线,如图 15.10:n为表面法向量v指向观察者l指向光源,对方向光源,l为定值r为镜像向量,即l对n镜像之结果θ为r和v的夹角,由r.v给出,描述镜像的方向性。镜面反射使物体看上去有光泽,粗糙表面因反射率不高,所以缺乏此类效果。镜面反射的强度取决于物体、光源和观察者。所有向量均为单位向量原创 2009-06-21 21:44:00 · 820 阅读 · 0 评论 -
3D图形数学(2)
模型与世界空间物体最开始由物体空间(和物体相连的坐标空间)来描述,其中常见的信息包括顶点位置和表面法向量。物体空间又称作模型空间或局部空间。可将坐标从模型空间中转换到世界空间中,此过程称作模型变换。通常,光照计算使用世界空间,但其实使用什么坐标空间无所谓,只要确保几何体与光线在同一空间即可。 摄像机空间通过视变换,顶点从世界空间变换到摄像机空间,此空间也称作眼睛空间。摄像机空间转载 2009-06-21 21:42:00 · 1350 阅读 · 0 评论 -
3D几何图元(7)
一般来说,多边形是由顶点和边构成的平面物体。 简单多边形与复杂多边形简单多边形不包含"洞",复杂多边形可能包含"洞"(图12.26)。简单多边形可以通过沿多边形列出的所有顶点来描述(左手坐标系中,通常以从多边形正面看时的顺时针方向列出所有点)。简单多边形的使用频率比复杂多边形高得多。通过添加一对"接缝"边,能将任意复杂多边形转化成简单多边形,如图12.27所示。见右边的放大图,转载 2009-06-21 22:36:00 · 1556 阅读 · 0 评论 -
3D中的方位和角位移(2)
另一种描述方位的常用方法是欧拉角,这项技术以著名的数学家Leonhard Euler(1707 - 1783)的名字命名,他证明了角位移序列等价于单个角位移。 什么是欧拉角欧拉角的基本思想是将角位移分解为绕三个互相垂直轴的三个旋转组成的序列。这听起来很复杂,其实它是非常直观的(事实上,易于使用正是它的主要优点之一)。之所以有"角位移"的说法正是因为欧拉角能用来描述任意旋转。欧拉角将转载 2009-06-21 22:29:00 · 1922 阅读 · 0 评论 -
3D几何图元(5)
三角形三角形在建模和图形学中有着极其重要的位置。复杂3D物体的表面,如车或人体,都是用三角形模拟的,像这样一组相连的三角形称作三角网格。 基本性质三角形是通过列出它的三个顶点来定义的。这些点的顺序是非常重要的,在左手坐标系中,当从三角形"正面"看时,经常以顺时针方向列出这些点,设这三个顶点为v1、v2、v3。三角形位于一个平面中,这个平面的方程(法向量n和到原点的距离d)在很多应用转载 2009-06-21 22:38:00 · 852 阅读 · 0 评论 -
3D几何图元(4)
在3D中,平面是到两个点的距离相等的点的集合。平面完全是平的,没有厚度,且无限延伸。 平面方程 ---- 隐式定义可以用类似于定义直线的方法来定义平面,平面的隐式定义由所有满足平面方程的点p=(x, y, z)给出,平面方程的两种记法如公式12.11所示:ax + by + cz = dp . n = d公式12.11 平面方程注意第二种形式中,n = [a, b,转载 2009-06-21 22:39:00 · 894 阅读 · 0 评论 -
3D中的方位和角位移的C++实现(2)
cQuaternion类用来以四元数形式保存方位或角位移,在能应用到四元数上的完整数学运算集合中,只有那些对单位四元数有意义的运算才对保存角位移有用,这里没有提供四元数的求负、加减、标量乘、对数操作。Quaternion.h:Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHigh转载 2009-06-21 22:34:00 · 1124 阅读 · 0 评论 -
3D中的方位和角位移(5)
四元数的对数、指数和标量乘运算 首先,让我们重写四元数的定义,引入一个新的变量α,等于半角θ/2:α = θ/2|| n || = 1q = [cosα n sinα] = [cosα xsinα ysinα zsinα]q 的对数定义为公式10.15:log q = log([cosα n sinα]) ≡ [0 α n ]公式10.15 四转载 2009-06-21 22:27:00 · 1677 阅读 · 0 评论 -
3D中的方位和角位移(7)
从四元数转换到矩阵为了将角位移从四元数转换到矩阵形式,可以利用旋转矩阵,它能计算绕任意轴的旋转:这个矩阵是用n和θ表示的,但四元数的分量是:w = cos(θ/2)x = nx sin(θ/2)y = ny sin(θ/2)z = nz sin(θ/2)让我们看看能否将矩阵变形以代入w、x、y、z,矩阵的9个元素都必须这样做。幸运的是,这个矩阵的结构非常好,一旦解出转载 2009-06-21 22:24:00 · 1104 阅读 · 0 评论 -
3D数学 ---- 矩阵的更多知识(5)
一般仿射变换3x3矩阵仅能表达3D中的线性变换,不能包含平移。经过4x4矩阵的武装后,现在我们可以构造包含平移在内的一般仿射变换矩阵了。例如:(1)绕不通过原点的轴旋转。(2)沿不穿过原点的平面缩放。(3)沿不穿过原点的平面镜像。(4)向不穿过原点的平面正交投影。它们的基本思想是将变换的"中心点"平移到原点,接着进行线性变换,然后再将"中心点"平移回原来的位置。开始使用平移转载 2009-06-21 22:13:00 · 1507 阅读 · 0 评论 -
3D数学 ---- 矩阵和线性变换(2)
我们可以通过让比例因子k按比例放大或缩小来缩放物体。如果在各方向应用同比例的缩放,并且沿原点“膨胀”物体,那么就是均匀缩放。均匀缩放可以保持物体的角度和比例不变。如果长度增加或减小因子k,则面积增加或减小k^2。在3D中,体积将增加或减小 k^3。如果需要“挤压”或"拉伸"物体,在不同的方向应用不同的因子即可,这称作非均匀缩放。非均匀缩放时,物体角度将发生变化。视各方向缩放因子的不同,长度、面转载 2009-06-21 22:08:00 · 1487 阅读 · 0 评论 -
三角网格(2)
三角带三角带是一个三角形列表,其中每个三角形都与前一个三角形共享一边,图14.2显示了一个三角带的例子。注意顶点列出的顺序使得每三个连续的点都能构成一个三角形。例如:(1)顶点1、2、3构成第一个三角形。(2)顶点2、3、4构成第二个三角形。(3)顶点3、4、5构成第三个三角形。在图14.2中,顶点以构成三角形带的顺序编号。"索引"信息不再需要,因为顶点顺序已经隐式定义转载 2009-06-21 21:58:00 · 1173 阅读 · 0 评论 -
三角网格(3)
三角网可在三角形或顶点级保存额外信息。 纹理映射坐标纹理映射是将位图(称作"纹理图"或简称"纹理")贴到多边形表面的过程。这里只给出一个高度简化的解释:我们希望将2D纹理贴到多边形表面上,同时考虑多边形在摄像机空间的方向。对多边形中每个需要渲染的像素都要计算2D纹理映射坐标,这些坐标用以索引纹理图,从而为相应像素着色。通常,在顶点保存纹理映射坐标,三角形面中其余各点的坐标通过插值进转载 2009-06-21 21:57:00 · 1604 阅读 · 0 评论 -
3D图形数学(7)
几何体的生成与提交一旦知道哪些物体可见(或至少潜在可见),即可将其生成并提交到图形处理器。该阶段完成以下任务:(1)细节层次(LOD)选择(2)渐进式生成几何体(3)向图形API提交数据 LOD选择和渐进式生成一般我们希望以最大可能的三角形数量描绘物体以求得最佳的视觉效果,但不幸的是,较多的三角形一般意味着低帧率。我们必须在可接受的外表和帧率间做出折中选择。LOD在一定转载 2009-06-21 21:48:00 · 894 阅读 · 0 评论 -
3D中的方位和角位移的C++实现(3)
cRotationMatrix类的目的就是处理非常特殊的(也是极其常用的)物体和惯性坐标空间之间的旋转。这个矩阵类不是一般的变换类,我们假定这个类只包含旋转,因此,它是正交的。换句话说,该矩阵表达的是方位,而不是角位移。当你创建这样的矩阵时,不必指定变换的方向(物体坐标空间到惯性坐标空间或是惯性坐标空间到物体坐标空间)。变换的方向在实际执行变换时指定,每个方向对应一个函数。RotationMa转载 2009-06-21 22:33:00 · 682 阅读 · 0 评论 -
3D中的方位和角位移(4)
四元数乘法(叉乘)四元数能根据复数乘法解释来相乘,如下:这导出了四元数乘法的标准定义,下面以两种四元数记法给出,见公式10.9:不用为四元数叉乘使用乘号,"行"或 "列"四元数也没有什么区别。四元数叉乘满足结合律,但不满足交换律,如公式10.10所示:现在看看两个四元数叉乘的模:展开合并同类项:最后应用四元数模的定义得到公式 10.11:因此转载 2009-06-21 22:27:00 · 2061 阅读 · 0 评论 -
3D中的方位和角位移(6)
四元数样条 ---- “squad”Slerp提供了两个方位间的插值,当有多于两个的方位序列(它描述了我们想要经过的插值“路径”)时怎么办?我们可以在”控制点“之间使用slerp。类似于基本几何学中的线性插值,控制点之间是以直线连接的。显然,控制点上会有不连续性 ---- 这是我们想要避免的,我们给出squad(Spherical and Quadrangle)的公式,用来描绘控制点间的路径。转载 2009-06-21 22:26:00 · 2075 阅读 · 2 评论 -
3D数学 ---- 矩阵的更多知识(4)
4D向量和4x4矩阵不过是对3D运算的一种方便的记忆而已。 4D齐次空间4D向量有4个分量,前3个是标准的x,y和z分量,第4个是w,有时称作齐次坐标。为了理解标准3D坐标是怎样扩展到4D坐标的,让我们先看一下2D中的齐次坐标,它的形式为(x, y, w)。想象在3D中w=1处的标准2D平面,实际的2D点(x, y)用齐次坐标表示为(x, y, 1),对于那些不在w=1平面上的点,转载 2009-06-21 22:14:00 · 1319 阅读 · 0 评论 -
3D数学 ---- 矩阵和线性变换(1)
包含平移的线性变换称作仿射变换,3D中的仿射变换不能用 3 x 3 矩阵表达,必须使用4 x 4矩阵。一般来说,变换物体相当于以相反的量变换描述这个物体的坐标系。当有多个变换时,则需要以相反的顺序变换相反的量。例如,将物体顺时针旋转20度,扩大200%,等价于将坐标系缩小200%,再逆时针旋转20度。 2D中的旋转在2D环境中,物体只能绕某个点旋转,因为现在暂不考虑平移。这里我们进转载 2009-06-21 22:08:00 · 2166 阅读 · 0 评论 -
3D数学 ---- 矩阵和线性变换(4)
变换的组合设想世界中有一个任意方向、任意位置的物体,我们要把它渲染到任意方向、任意位置的摄像机中。为了做到这一点,必须将物体的所有顶点从物体坐标系变换到世界坐标系,接着再从世界坐标系变换到摄像机坐标系。其中的数学变换总结如下:矩阵乘法满足结合律,所以我们能用一个矩阵直接从物体坐标系变换到摄像机坐标系:这样就能在渲染的循环外先将所有矩阵组合起来,使循环内作矩阵乘法的时候只需要和一转载 2009-06-21 22:06:00 · 1446 阅读 · 0 评论 -
3D数学 --- 矩阵篇
矩阵是3D数学的重要基础,它主要用来描述两个坐标系间的关系,通过定义一种运算而将一个坐标系中的向量转换到另一个坐标系中。在线性代数中,矩阵就是以行和列形式组织的矩形数字块,向量是标量的数组,矩阵是向量的数组。 矩阵的维度和记法矩阵的维度被定义为它包含了多少行多少列,一个 r x c 矩阵有r行c列。用黑体大写字母表示矩阵,如:M、A、R。需要引用矩阵的分量时,采用下标法,常使用对应的斜转载 2009-06-21 22:02:00 · 1645 阅读 · 0 评论 -
一个3D向量类
提供以下基本操作:1. 存取向量的各分量(x, y , z) 2. 向量间的赋值操作3. 比较两向量是否相同4. 将向量置为零向量5. 向量求负6. 求向量的模7. 向量与标量的乘除法8. 向量标准化9. 向量加减法10. 计算两点(点用向量表示)间距离11. 向量点乘12. 向量叉乘该向量的操作运算对3D点同样适合。Code highlighting pr转载 2009-06-21 22:01:00 · 785 阅读 · 0 评论 -
3D图形数学(8)
当三角形的顶点转换到裁剪空间后,我们对三角形做两个重要测试。注意,这里讨论的顺序并不一定是硬件执行的顺序。 背面剔除第一个测试称作背面剔除,其目的是去除背面摄像机的三角形。在标准三角网格中,我们永远看不到三角形背面,除非进入那些多面体内部。去除这些三角形并非必要,画出它们依然得到正确的图像,因为它们会被前方的三角形盖住。但我们不想浪费时间去绘制任何看不见的物体,所以我们常做背面剔除,特转载 2009-06-21 21:50:00 · 1042 阅读 · 0 评论 -
3D图形数学(5)
光的衰减光随距离衰减,所以远离光源的物体会变暗一些。现实世界里,光强度反比于物体和光源距离的平方。i1 / i2 = d22 / d12公式15.12 实际光线衰减反比于距离的平方此处i为光强,d为距离。实践中,公式15.12并不方便。我们常用另一个简单的基于辐射衰减距离的模型替代,在辐射衰减距离之外,光线将完全衰减为0。通常,可在光线有效射程内使用线性插值表现光随距离d转载 2009-06-21 21:46:00 · 2607 阅读 · 0 评论 -
3D图形数学(3)
光照与雾化标准光照模型是局部模型中的一种----即当处理一个物体时,不考虑其他物体的影响。物体也不向别的物体投下影子,实际上,物体自身无法生成影子,影子是使用全局光照模型生成的。 色彩的数学计算机中的色彩常用RGB色彩模型表示,这里R表示红,G表示绿,B表示蓝,其精度因平台与渲染状态而异。我们视RGB为0至1间的值,并且也不考虑其中各分量到底占用多少二进制位。在计算机图形学中,色彩转载 2009-06-21 21:44:00 · 791 阅读 · 0 评论 -
3D数学 ---- 矩阵的更多知识(3)
正交矩阵的运算法则若方阵M是正交的,则当且仅当M与它转置矩阵MT的乘积等于单位矩阵,见公式9.8:矩阵乘以它的逆等于单位矩阵:M M-1 = I所以,如果一个矩阵是正交的,那么它的转置等于它的逆:这是一条非常有用的性质,因为在实际应用中经常需要计算矩阵的逆,而3D图形计算中正交矩阵出现又是如此频繁。比如旋转和镜像矩阵是正交的,如果知道矩阵是正交的,就可以完全避免计算逆矩阵了转载 2009-06-21 22:14:00 · 1022 阅读 · 0 评论 -
3D数学 ---- 矩阵的更多知识(1)
矩阵的行列式在任意方阵中都存在一个标量,称作该方阵的行列式。 线性运算法则方阵M的行列式记作|M|或“det M”,非方阵矩阵的行列式是未定义的。n x n阶矩阵的行列式定义非常复杂,让我们先从2 x 2,3 x 3矩阵开始。公式9.1给出了2 x 2阶矩阵行列式的定义:注意,在书写行列式时,两边用竖线将数字块围起来,省略方括号。下面的示意图能帮助记忆公式9.1,将转载 2009-06-21 22:16:00 · 1431 阅读 · 1 评论 -
3D中的方位和角位移(1)
什么是方位直观地说,我们知道物体的“方位”主要描述的是物体的朝向。然而“方向”和“方位”并不完全一样。向量有“方向”但没有“方位”,区别在于,当一个向量指向特定方向时,可以让向量自转(如图10.1所示),但向量(或者说它的方向)却不会有任何变化,因为向量的属性只有“大小”,而没有“厚度”和“宽度”。然而,当一个物体朝向特定的方向时,让它和上面的向量一样自转,你会发现物体的方位改变了,如转载 2009-06-21 22:30:00 · 2360 阅读 · 1 评论 -
3D中的方位和角位移(8)
从欧拉角转换到四元数为了将角位移从欧拉角转换到四元数,可以使用从欧拉角构造矩阵类似的方法。先将这三个旋转分别转换为四元数,这是一个简单的运算。再将这三个四元数连接成一个四元数。和矩阵一样,有两种情况需要考虑,第一种是惯性 -- 物体四元数,第二种是物体-- 惯性四元数。因为它们互为共轭关系,所以我们只推导惯性--物体四元数。设欧拉角为变量h、p、b,设h、p、b分别绕轴y、x、z旋转的四元转载 2009-06-21 22:20:00 · 940 阅读 · 0 评论 -
3D数学 ---- 矩阵和线性变换(3)
一般来说,投影意味着降维操作,有一种投影方法是在某个方向上用0作为缩放因子。这种情况下,所有点都被拉平至垂直的轴(2D)或平面(3D)上。这种类型的投影称作正交投影(或者平行投影),因为从原来的点到投影点的直线相互平行。 向坐标轴或平面投影最简单的投影方式是向坐标轴(2D)或平面(3D)投影,如图8.15所示:向坐标轴或平面投影在实际变换中不常发生,大多数情况是向低维的变换赋值转载 2009-06-21 22:07:00 · 1271 阅读 · 0 评论 -
3D数学 ---- 矩阵的几何解释
一般来说,方阵能描述任意线性变换。线性变换保留了直线和平行线,但原点没有移动。线性变换保留直线的同时,其他的几何性质如长度、角度、面积和体积可能被变换改变了。从非技术意义上说,线性变换可能“拉伸”坐标系,但不会“弯曲”或“卷折”坐标系。 矩阵是怎样变换向量的向量在几何上能被解释成一系列与轴平行的位移,一般来说,任意向量v都能写成“扩展”形式:另一种略有差别的形式为:注意转载 2009-06-21 22:04:00 · 1472 阅读 · 0 评论 -
3D图形数学(6)
flat着色和Gourand着色若渲染速度并不重要,我们可以逐像素地计算光照和雾化。(对于光照,这项技术称作Phong着色模型----不要和镜面反射的Phong模型混淆。)然而这样做计算量过于巨大,所以我们折中并减少计算的频率。有两个选择:逐多边形或逐顶点计算,这两项技术分别称作flat着色和Gourand着色。使用flat着色,对整个三角形只计算一次光照值。通常计算光照的位置为三角形中心转载 2009-06-21 21:46:00 · 1034 阅读 · 0 评论 -
3D几何图元(1)
隐式表示通过定义一个布尔函数f(x, y , z),我们能够隐式表示一个图元。如果所指定的点在这个图元上,这个布尔函数就为真;对于其他的点,这个布尔函数为假。例如等式:x2+y2+z2 = 1对中心在原点的单位球表面上的所有点为真,隐式表示法用于测试图元是否包含某点时非常有用。 参数形式表示图元也能以参数形式表示。我们从一个简单的2D例子开始,定义如下两个关于t的函数:转载 2009-06-21 22:44:00 · 1394 阅读 · 0 评论 -
3D几何图元(2)
特殊的2D直线表示方法2D中,可以使用公式12.3隐式表示直线:ax + by = d公式12.3 2D直线的隐式定义另一种表示方法为,设向量n = [a, b],用向量记法将公式12.3写为公式12.4的形式:p . n = d公式12.4 用向量记法的2D直线的隐式定义当等式两边同乘以常数k时,n和d会发生变化但这并不会改变直线的定义。如果n为单位向量,大多转载 2009-06-21 22:41:00 · 1392 阅读 · 1 评论 -
3D几何图元(3)
矩形边界框另一种常见的用来界定物体的几何图元是矩形边界框,矩形边界框可以是与轴对齐的或是任意方向的。轴对齐矩形边界框有一个限制,就是它的边必须垂直于坐标轴。缩写AABB常用来表示axially aligned bounding box(轴对齐矩形边界框),OBB用来表示oriented bounding box(方向矩形边界框)。轴对齐矩形边界框不仅容易创建,而且易于使用。一个3D的AAB转载 2009-06-21 22:40:00 · 769 阅读 · 0 评论