图形与游戏中3D数学基础的说明

1.左手坐标系与右手坐标系没有好坏之分,不同的研究领域和不同的背景下,选择不同的坐标系;传统计算机图形学采用“左手坐标系”,线性代数则倾向于使用右手坐标系

  坐标系坐标轴坐标原点组成。原点定义坐标系的位置,轴定义了坐标系的方向。

  •  “世界坐标系”被广泛称为全局坐标系或者宇宙坐标系;
  •  “物体坐标系”被称为模型坐标系,或者“身体坐标系”
  •  “摄像机坐标系”,与观察者密切相关,摄像机坐标系与屏幕坐标系相似,区别是,摄像机坐标系在3D空间中,而屏幕坐标系在2D平面里。

  “摄像机坐标系”被认为是一种特殊的“物体坐标系”,只不过是该物体坐标系定义在摄像机的可视区域。在“摄像机坐标系”中,摄像机在原点,X轴向右,Z轴向前(朝向屏幕内,摄像机的镜头朝向),Y轴向上(是摄像机本身的上方,不是世界坐标系的上方)。“摄像机坐标系”采用的是【左手坐标系】标定法

图形与游戏中3D数学基础的说明

  •  "惯性坐标系":是为了简化“世界坐标系”到物体坐标系的转换,即在世界坐标系到物体坐标系的“半过渡”坐标系。惯性坐标系与物体坐标系原点重合,但是,惯性坐标系的坐标轴与“世界坐标系”的轴平行。

引入惯性坐标系的原因,从“物体坐标系”到“惯性坐标系”的转换只需要“旋转操作”,从惯性坐标系到世界坐标系的转换只需要“平移”操作。

分开考虑两件事比把两件事柔和在一起容易的多

  •  “嵌套坐标系”:方便在世界坐标系中计算物体之间的关系,如物体坐标系模型视为一个质点,在世界坐标系中只需要考虑位置与方向即可,节省资源。

物体坐标系中的模型在世界坐标系中运动,可以将世界坐标系看做“父”空间,而将物体坐标系看做“子”空间。后者可以将物体打散成子块,独立的定义控制,这样可以形成嵌套的、按照层次结构组织的对象序列,这样每个动作很容易独立计算,并通过线性变换工具(矩阵,向量组合)弃疗。

层次化的嵌套坐标系是动态的,且能够以最方便表达重要信息。

  "描述坐标系”

2. 坐标变换:指导坐标系A中的空间一点P,怎样在另一个坐标系中描述改点。即坐标变换。把“物体坐标系”与“世界坐标系”进行相互转换,不同的应用场景下。

  以“物体坐标系”为参考坐标系,如果达到与操作“物体坐标系”,实现相同的效果,则“世界坐标系”的操作相对于“物体坐标系”都是相反的。即如果you 向右转,或者,you不动,世界坐标系向左转,效果一样

3. 向量,由数学含义,也有几何含义。

  • 几何:有大小与方向的有向线段。
  • (Axially Aligned Bounding  Box, AABB),轴对齐包围盒
  • 理论上,能够建立一个包容一切的参考系,并选择一个点作为这个空间的原点,然后定义“绝对”坐标系(假设可以克服相互影响,即空间扭曲,事实上,相对论的一个重要观点就是不存在绝对参考系),一般情况下,也没有必要知道绝对参考系,如在宇宙中没必要知道绝对位置,但是,可以通过绝对参考系,以不同的方式来“透视”不同的关系(如距离,等)

4. 向量运算与几何意义

  数学中专门研究向量的分支成为《线性代数》。向量在线性代数中只是一个数组。在《线性代数》中,可以用n维向量和矩阵解有n个未知数的向量方程组。

  《线性代数》是一个非常有趣且应用广泛的研究领域,但是与3D数学关注的领域并不相同。

  3D数学中,主要关注的是向量和向量运算的几何意义。所以,对《线性代数》的学习的另一方面,也要直观的理解其几何意义。《线性代数》只讲解了“向量和矩阵乘法”的与运算步骤。3D数学中,还需要指导3X3矩阵的几何意义,以及向量乘以矩阵可以实现空间变换。

  符号表示:

  标量:a,b,c

  向量:a,b,c

  矩阵:A,B,C

  负向量:(几何解释)大小相等,方向相反的向量。与向量的位置无关紧要,只要“大小和方向”才是重要的。

  向量大小:(几何解释)称为向量的“模或者长度” 

表示:||v|| ,

计算:向量的各个分量的平方和的平方根

说明:是“非负标量”

  标量与向量乘法:结果与元向量平行,且长度不同或方向相反。

(几何意义):标量K,称为“缩放因子K”,即向量以因子|k|缩放向量的长度。如果k<0,则向量倒转。

  向量标准化:即单位向量,单位向量的模为1的向量,即我们只关心向量的方向,而不关心大小。单位向量称为“标准化向量”,后者“法线”

计算:向量除以向量的模

几何解释:2D中存在单位向量区域是一个圆,3D中单位向量预期是单位球面。

  向量加法和减法:(几何解释)三角形法则。向量可以被解释为与轴平行的位移序列

  a - b ,代表了空间从b 到 a的向量。

 距离公式:d = a - b, 距离为两点之间线段的长度,向量是有向线段,(几何解释),从一个点到另一个点的向量的长度(模)

  向量点乘:又称为向量(内积),即 a·b,不能省略中间的点·号。

计算:两向量对应分量乘积的和,其结果是一个标量,满足交换律
几何解释:一般来说,点乘结果描述了两个向量的相似程度,点积越大,两向量越接近。

a · b = |a||b| cos(θ), 即量向量的模与向量夹角的cos的乘积。

1. 用点积求取两项将的夹角θ

2. 0向量与任意向量都垂直

3. 点积判定两个向量的夹角类型, 如果a · b >0 方向基本相同, a · b  < 0方向基本相反, a · b  = 0 正交

4. 向量的投影,用点积可以计算投影问题。且向量可以分解为平行于垂直于其他向量的两个分量。

  向量叉乘:又称为“叉积”, 即 a X b, 得到一个向量,且不满足交换律

叉积与点积在一起时,叉积优先;因为叉积还是一个向量,标量和向量之间是点积。但是标量和向量之间不能叉积

计算:

方向:叉积的向量垂直于原来的两个向量,且满足a -> b 的右手定则,结果向量的方向。

长度:叉积的长度等于向量的大小(模)与向量夹角的sin值的乘积,即 |a X b| = |a||b| sin(θ),即以 两向量为平行四边形的面积。地边 *高 = 平行四边形面积

如果 两向量平行,或者 任意一个为0向量,则 aXb = 0向量。解释为,平行于任意其他向量。但是点积的解释为垂直于任意向量。

  线性代数公式

  基本的运算

  编程原则:

1. 多使用const成员函数,这样,韩硕对调用者可以不修改对象,且能够在编译器层面上进行保证。这可以保证代码没有副作用的好办法。

2. 使用const 的引用类型参数,素有向量为参数的函数都接受向量const&,即const&的形式。以传值的方式传递参数会调用一次构造函数。但是传递const&引用在形式上传值(引用的值,地址值),实际上传递的是传址,即“传递的引用(地址)”,避免了调用构造函数,有助于提高效率。

3. 如果函数不是内敛inline类型的函数,传值方式比传址方式需要更多的堆栈空间和更长的压栈时间。

4. 如果把vector作为实参,传递给接受const & 的函数时,则实参的地址(引用)被传递。且在函数体内的修改可以影响到实参本身。

5. 成员函数VS非成员函数:成员函数由this隐式指针,非成员函数则没有。一般非成员函数比成员函数更容易懂。

6. 大多数情况下,信息屏蔽是明智的选择。但是也要权衡便捷与效率。

7. 一个著名的编程原则“95%的时间消耗在了5%的代码上”。所以为了提高执行速度,必须找到瓶颈并优化它。

8. 另一个编程原则是“过早的优化是一切罪恶的根源”,是指优化那些非瓶颈的代码,使代码变得复杂,却没有得到相应的汇报。

5. 矩阵

  矩阵是3D数学的基础,主要用来描述两个坐标系统之间的关系,通过定义一种运算,将一个坐标系统的向量转换到另一个坐标系中。

向量是“标量”的数组,矩阵是“向量”的数组。

矩阵不一定是方阵(行列相等),方阵一定是矩阵。

矩阵没有0行0列之说,所有都第一行,第一列,开始。

  单位矩阵,对角矩阵(非对角元素都为0).

  转置矩阵:沿着矩阵的对角线翻折。行列互换。

  标量与矩阵的乘法:即用标量K乘以矩阵中的每一个元素。

  矩阵与矩阵的乘法:

  向量与矩阵的乘法:

1. 结果向量中的每个元素都是原向量与矩阵中单独列或行的点积

2. 矩阵中的元素决定了输入向量在输出向量中所占的比重。  

  行向量VS列向量

基本广泛使用行向量,

1. 文字属性方便

2. DirectX使用行向量。

偏向列向量:

1. 等式使用列向量形式更好。

2. 线性代数多使用列向量;

3. 计算机图形学基本使用“列向量”

4. OpenGL使用列向量

说明:

当阅读使用别人的源码或者公式时,要检查采用的是行向量或者列向量。

6. 矩阵的几何解释:

  一般来说,方阵能描述任意的"线性变换”  , 线性变换可能拉伸坐标系,但是不会弯曲坐标系。最常见的:旋转,缩放,投影,镜像,仿射

  向量与矩阵之间的变换

1. 向量在几何解释上,可以由一系列与轴平行的位移,且作为向量的各个分量。即为向量的“扩展”形式。

  将向量表示为基向量的线性组合

  v = xp + yq + zr;

  向量p,q,r 是基向量。且称为:向量v可以表示成向量p,q,r的线性变换。

2.  将矩阵解释为基向量集合

   把矩阵的行解释为坐标系的基向量,乘以该矩阵就相当于执行了一次坐标变换。如, aM = b,则,可以说 矩阵M将a 转换到b。

3. 矩阵表达“坐标变换”

  当我们再观察矩阵时,我们是在观察“变换”,观察新的坐标系。

  矩阵的9个元素与不同的3D转换(旋转,平移,等)有着对应关系

4. 矩阵的每一行都能解释为转换后的基向量。因为坐标系对应的三个行分量(基向量)与矩阵想成,都分别得到相应行分量对应的矩阵行向量,即基向量。

  则给出一个期望的变换(旋转,平移,缩放等),可以构造一个矩阵代表此变换。所要处理的是,计算基向量的变换,然后将变换后的基向量填入矩阵。

7 矩阵和线性变换

  多模型进行线性变换,既可以针对模型做变换,也可以针对坐标系做变换,两种方便方法性效果上是等价的,但是在某些情况下,模型可能含有大量的顶点和三角形,计算量太大,往往直接对坐标系进行线性变换更合适。

  针对模型变换一个量等价于将坐标系变换一个相反的量

1. 即变换物体相当于一相反的量变换描述物体所在的坐标系。

2. 当有多个变幻时,需要以相反的顺序变换相反的量。

  各种模型的变换矩阵,一般指的是直接对“模型”进行变换的“变换矩阵”。

1. 一般来说,投影,意味着降维操作。

2. 可以将多个变换矩阵按照次序组合一个矩阵,新矩阵代表依次执行元变换的累加效果。非常适合渲染处理。

3. 把从a 到 b 的F映射记做 F(a) = b。 F即为映射或者函数, 在3D数学中,则表示为矩阵表示。

4. 仿射变换,即 线性变换  + 平移变换。

  矩阵的行列式

  方阵M的行列式记做 |M| 或者 det M,

行列式的性质:

  • 矩阵积的行列式等于矩阵行列式的积 |AB| = |A||B|;
  • 矩阵的任意行或者任意列全为0,则全部行列式等于0;
  • 交换矩阵任意两行或者两列,则行列式变为负值;

行列式几何解释:

  矩阵的逆;

  正交矩阵;

  4X4齐次矩阵:即空间点P(x,y,z,w)其中w=1,则为标准3D空间点,w!=0将4D投影到标准3D上(x/w,y/w,z/w),当w=0,表示,无穷远点,表示一个方向,而不是一个位置。

  • “齐次坐标系”只不过是一种数学上的技巧,目的是使我们能够在变换中包含平移。一般情况下 w总是非0.
  • 3D中的透视投影仍然有一个投影平面2D。但是投影线不平行,投影线相较于一点,即为“投影中心”。
  • 透视投影在图形学中非常重要,它是人类视觉系统的模型。
  • 小孔成像,是因为物体模型的光线已经在小孔处汇聚,然后在盒子的另一端倒视投射显示
  • 4X4齐次矩阵表示“透视投影”

8 3D中的方位与角位移

  方位主要描述物体的朝向。“向量”只有方向而没有方位,区别是,一个向量指向特定方面时,可以让向量自传。

  确定一个方位,需要3个参数:空间位置,空间方向,角位移。

  

  直线方程:

2D直线:

隐式定义:ax +by = d

向量隐士定义: p·n = d, n为垂直直线方向的单位向量,d给出了原点到直线的有符号距离。。

斜截式: y = mx +b , 竖  直线x = b; 水平线,m = 0(斜率), y = b;

  平面方程:

3D空间隐式定义:

ax + by + cz = d

p · n = d :其中n = 【a, b,c】,向量n成为平面的法向量。垂直于平面,且指向平面的正面,且n为单位向量,则计算方便。其中d是平面相的任意向量与法相单位向量的乘积d(无几何意义)

空间三点定义平面:

形成相邻的两条有向边:e1= p3 -p2,e3 = p2 - p1, 即边,P1->P2, P2->P3.则平面法相:利用向量叉积获得法相n。然后确定d,可通过一个点p 与n点乘后的标量d。

点到平面的距离

不在平面的点q到一个已知平面s的距离a公式:

  a = q·n - d; 其中,n是S的单位法线,且d是S平面方程的d值。且a是点到平面s的有符号距离。

9 三角形性质

  图形与游戏中3D数学基础的说明

  正弦公式:在任意一个平面三角形中,各边和它所对角的正弦值的比相等且等于外接圆的直径”

图形与游戏中3D数学基础的说明

图形与游戏中3D数学基础的说明

  余弦定理:对于任意三角形,任何一边的平方等于其他两边平方的和减去这两边与它们夹角的余弦的两倍积

  图形与游戏中3D数学基础的说明

 面积公式:

  1. 面积=底×高÷2

图形与游戏中3D数学基础的说明
 
(面积=底×高÷2。其中,a是三角形的底,h是底所对应的高)注释:三边均可为底,应理解为:三边与之对应的高的积的一半是三角形的面积。这是面积法求线段长度的基础。

  2.

图形与游戏中3D数学基础的说明

  3.海伦公式:海伦公式非常有用,在数学3D中非常有用。

  图形与游戏中3D数学基础的说明

  4外接圆半径R

  图形与游戏中3D数学基础的说明

  5. 定点坐标直接计算面积:

    说明,在数学3D中,有时候可以直接指导的是三角形的三个定点的空间坐标,p1,p2, p3.如果可以通过空间定点直接计算出面积公式,则可以非常方便,效率高。

  (1)平面的顶点坐标直接计算

平面2D中的三个点:P1(x1,y1)P2(x2,y2)P3(x3,y3)

则  S  =  [(y1-y3)(x2 - x3) + (y2 - y3)(x3 -x1)]/2

  (2)空间的定点坐标直接计算

    利用叉积公式,计算出相连两边的向量的叉积的一半。因为叉积的几何解释是由原来两个向量围城的平行四面性的面积。

重心坐标空间

   在3D空间中使用三角形,但是空间中的三点组成的三角形是一个平面,即可以直接看做2D的平面处理问题。可以解决类似,在三角形表面上(三角形重心空间)任意移动的问题。

  重心坐标空间就是与三角形表面相关联且独立于三角形所在的3D笛卡尔坐标空间。

  三角形所在平面的任意点都能表示为三个顶点坐标的加权平均。

  这个权就是“重心坐标”. 权重坐标(b1,b2,b3)。且重心坐标的和总是1, 即: b1+b2+b3 = 1.

  b1,b2,b3代表每个顶点坐标对该点的贡献或者权重。

  重心坐标计算3D点坐标,即三个顶点的权重坐标(b1,b2,b3),即 b1V1 + b2V2 + b3V3;

  • 可以表示三角形面空间中的任意一点,不单单是三角形内的点
  • 三角形的三个顶点的重心坐标可以视为单位向量:v1(1.0.0), V2(0.1.0), V3(0.0.1)
  • 任意顶点对边所在的“重心空间”坐标相应的重心分量都是0,即V1对边即V1->V3边的重心坐标是(0,X, X)
  • 重心坐标系不同于笛卡尔3D坐标系,因为重心坐标系是2D的,但是却用了笛卡尔空间的三个变量表示。因为所有重心分量的权重和为1,所以,必然只有2个变量,形成2D重心平面空间。
  • 重心坐标空间仅有2个*度,有一个分量是冗余的。

  如果知道三个定点V1,v2v3, 和重心空间(三角形平面)任意一点P的笛卡尔坐标。则计算p点所在的重心空间坐标P(b1,b2,b3)?

 计算方法1:

则如下方程组:

Px = b1x1 + b2X2 +  b3X3;

Py = b1y1 + b2Y2 + b3Y3;

(Pz 等式没有必要,因为三个未知数,三个方程就可以了)

b1 + b2 + b3 = 1

解得方程组:

b1 = [()() + ()()] / []

b2 = [()() + ()()] / []

b3 = [()() + ()()] / []

图形与游戏中3D数学基础的说明

观察公式,有如下结论:

设三角形面积为T, v0对角的子三角形面积为T0, v1对角的子三角形面积为T1,v2对角的子三角形面积为T2;

b1 = T0/T

b2 = T1/T

b3 = T2/T

重心坐标公式为对应子三角形与大三角形对应的面积比

计算方法2:

叉乘计算出不同区域的三角形面积,然后计算出重心空间的坐标。因为叉乘的大小只能够计算出三角形内的重心区域,不适合三角形外的区域。

技巧:

  通过采用法相向量(单位)的点成形式来计算“有符号面积”, 即叉乘的结果与面单位法相的点乘的结果即可作为有符号的面积公式。

  因为三个顶点v1,v2v3,以及三角形平面任意一点P的笛卡尔坐标都知道,则可以计算出平面的单位法向量n,以及各个区域的叉乘形式。

特殊点:重心,内心,外心计算。

  重心:三角形的最佳平衡点。是三角形三条中心的交点(从顶点到对边中点连线),不一定是角平分线的交点

三角形重心也被称为“质心”

重心是三角形三个顶点的几何均质:c = (v1+v2+v3)/3

  内心:三角形到三边距离相等的点。是三角形内切圆的圆心,内心是角平分线的交点。

三角形的周长: p  = l1 + l2 + l3

内心的计算:Cin = (l1V1 + l2V2 + l3V3)/p

三角形内切圆的半径 Rin = S / p

解决了寻找与三条直线相切的圆的问题。

  外心:三角形到各个定点距离相等的点,是三角形外接圆的圆心。外心是各边垂直平分线的交点。

临时变量:

 d1 = -e2e3; d2 =-e3e1;d3=-e1e2;

c1=d2d3;c2=d3d1;c3=d1d2;

c = c1+c2+c3;

则外心的“重心坐标”计算公式:(b1,b2,b3)

b1 = (c2+c3)/(2c)

b2 = (c3+c1)/(2c)

b3 = (c1+c2)/(2c)

则外心的坐标计算公式: Cout = b1V1 + b2V2 + b3V3

外接圆半径为: Rout = [(d1 + d2)(d3+d3)(d3+d1)/c]开方/2

  多变形凸凹性判定:

   如果多边形没有凹点,则为凸多边形。利用边向量的叉乘。

  检查每一个多边形每个顶点。用该顶点相邻的两个边计算法向量,然后用多边形的法向量与顶点的法向量点成。检测他们的方向是否相反,如果<0,则反向,则出现凹点。则此多边形为凹多边形。因为只要出现凹点,则定点的叉乘方向必然与面的法向量反向。

10几何检测

  最近的点

  隐式直线上最近的点,

  参数直线上最近的点,(点成法)

  平面上最近的点:

   相交性检测

  2D两直线相交:解方程组,后判定分母情况

  3D两直线相交:两直线向量的叉积判定,

  射线与平面的相交:直线法向量,与面法向量点乘判定:

  射线和球的相交性:几何勾股与点成计算

  两个球的相交性:分为静止求解,与运动相交求解。

11 三角网格

  三角网格为一个三角形列表。因为在网格中,每个三角形与其他三角形共享边。则三角网格需要存储拓扑信息:

  顶点:顶点数组

  边:边两端的定点索引

  面:面的三个边的索引

  高效率的做法:

  (1)数据结构层面

  显示维护一个边的列表,包含边两端的顶点索引,其次维护一个共享该边的三角形列表(索引),这样,三角形视为三条边组成,边由两个定点组成。则三角形和边都可以快速定位“顶点索引”,常数时间访问定点。

  (2)渲染层面

  1, 顶点换曾,底层的优化方式,一般API结合显卡考虑

  2. 三角带

    三角带可以用(n + 2)个定点存储n个面。发送顶点数最少的系统,在特定平台上速度最快。

    生成三角带的策略:t + 2s。其中,t为三角面总的数量,s为三角带个数。如果最小化发送到“显卡”的顶点数量最小,三角带越长越好。其次,三角带建立需要一定的开销,应该最小化三角带的建立。所以实际中,采用“退化”的方法,将整个网格置于一个连续的三角带中。退化即“面积”为0,退化产生的三角形面积为0.

  三角形顶点可以保存额外信息

1. 纹理映射坐标、

  将2D纹理贴到多边形上。顶点保存纹理映射坐标,则三角形面中的区域中的点可以通过差值进行计算。

2. “表面法向量”,该定点所在局部位置的“面法向量”

  • 计算光照
  • 进行背面剔除
  • 模拟粒子在表面“弹跳”
  • 只考虑正面加速碰撞检测

  “面法向量”可保存在三角形面级别,后者定点级别。

  真正有意义的是“连续表面的法向量”。三角形网格对连续表面逼近。

  (1)如果是参数曲面,则可以直接获取法向量。

  (2)其次,可以通过“平均相邻三角形表面法向量”重新计算计算,并将其单位化。但是,对于模型“不连续”的特征,如盒子的边界,则不能采用“平均化处理”,这种特征需要被保留,可以采用“拆分面”来解决问题。

12,图形数学管线

  图形管道数据流一般按照如下的过程处理:

(1)设置场景的;

  在显然之前,设定整个场景有效的选项。如摄像机位置,进行渲染的视点,渲染输出的视图。设定光照,雾化等选项,同时准备Z缓冲内容。

(2)可见性检测

  选好设置相机之后,必须对场景中物体的可见性处理,对实时渲染很重要。只需要渲染可见的部分即可。

(3)设置物体级别的渲染状态:

  每个可以显示的物体的渲染状态是不一样的,在物体级别之上。在渲染不同的可见物体之前,需要设置该物体的渲染状态选项。一般是“纹理映射”处理内容

(4)几何体的生成与提交

  实际向“显卡” API提交几何体,即三角形带,或者三角形,或是不同形式的三角形。

(5)变换与光照

  渲染显卡API得到三角形数据后,模拟空间向“摄像机空间”进行坐标变换,然后计算光照。

(6)背景剔除和裁剪

  背对摄像机的物体(背面三角形)去除,即“背面剔除”。三角形如果在可视椎体之外,也被剔除,即“裁剪”处理

(7)投影到屏幕空间:

  在上一步的背景剔除与裁剪之后,产生的模型被投影到输出窗口的2D投影空间。“透视投影”,“正交投影”,两种类型处理

(8)光栅化,

  上一步之后,进行光栅化处理,即将三角形面中进行哪些像素化处理,并未下一步的“像素着色”提供差值参数等,如(光照和纹理映射坐标)

(9)像素着色,

  在管道的最后阶段,计算三角形的色彩,然后把颜色写到屏幕上,可能需要alpha 混合以及Z缓冲。

  “帧缓冲”:一般指用来保存我们蒸菜渲染图形的那块内存。

  “视口的横纵”比要与“输出窗口”的横纵比相对应,否则,二者比例不协调,则图像就会被拉伸处理。

  “渲染管道”过程中的坐标空间:

1. 模型建模阶段: 物体坐标系(右手坐标系)

2. 世界坐标系,(右手坐标系)

3. 摄像机空间,(左手坐标系,Z轴正向面向屏幕向内),且约定,摄像机朝向Z轴正向,+X指向右侧, +y指向上方,

4. 裁剪空间,(与摄像机坐标系相同):裁剪矩阵,计算正确的w值,然后得到正确的“投影”

  裁剪空间3D,左手坐标系,且Y向上,Z向内,X向右

5.屏幕2D空间:需要完成一次3D到2D的映射,得到2D坐标。注意“输出窗口 ”不一定占有整个屏幕,不过,通常情况,希望屏幕坐标系与“设备坐标系”一致。

  注意:

  (1)屏幕坐标X向右,Y向下,定点再坐上角。

  (2)此时的z坐标还保留,且其次化分量w也保留,并不能简单的丢弃,在Z缓存中和透视矫正还会使用。  

13, 光照和雾化

  光源

  点光源,

  平型光

  聚光灯

  环境光

  标准光照模型

  标准光照方程(颜色向量): Clit = Cspec + Cdiff + Camb

  其中:Clit是打开光照下计算颜色值的结果。计算机图形学中的光照是“关闭光源”下的纹理颜色值的计算。一般计算结果比原来纹理计算值(关闭光源)暗。

  Cspec 是镜面反射下的颜色矢量, Cdiff是散射光下的颜色矢量, Camb是环境光下的颜色矢量。

  • 镜面反射分量:是模型有光泽

  物体的外观影响因素:

  • 物体表面材质属性
  • 表面的方位和朝向
  • 照射来的各个光源性质
  • 观察者的位置

  着色方式

  如果对实时渲染(渲染速度)没有要求,可以逐像素来计算光照和雾化处理。但是,这样模型的计算量很大。一般实际中采用以下方式处理:

  (1)flat着色,即以多边形为单位进行着色,整个三角形只计算一次光照,光照的位置以三角形中心,且三角形法向量为表面法向量。

  (2)Gourand着色, 即顶点为单位进行着色,可以保证模型表面的光滑性效果。

14 缓存技术

  缓存指示一个简单的存有像素数据的矩形内存块。最终要的是“帧缓存”和“深度缓存”

  帧缓存

  一般在“显卡”内存中,即显存。一般显卡都采用双缓存技术,即一个缓存放当前显示的图像,另一个,则离线换攒正在渲染的图像。

  深度缓存,z-buffer,或者成为Z缓存

  深度缓存,则存储像素的深度信息。一般反应物体到摄像机的距离。如果在渲染之前,如果有新的模型像素比深度缓存中的值比较,如果比之前的更近,则“更新”深度缓存中的值,否则不处理。

  一般没有z-buffer的双缓存。

15纹理映射

  纹理示一个贴在模型表面的位图。一般由不同的映射方式,如“平面映射”“球形映射”、“柱形映射”、““立方体映射””

  无论何种映射方式,每个网格的顶点都要设置一个纹理映射坐标。就是位图的2D笛卡尔坐标。通常称为u,v坐标,取值一般归格化为[0-1]之间的值。

  因为每个三角形可以独立的映射,则纹理的不同部分可以任意映射到物体的不同的部分。即,“纹理位图”不一定要是非常连续的图案。

  三角形的三个定点都有纹理的映射坐标(u,v),则三角形面中的点可以使用“插值计算”的方式来求取其纹理坐标,然后读取纹理的值。

16 光栅化

  在裁剪操作后,就可以投影到输出的屏幕坐标中。每个像素保证只处理一次,则一个像素基本上需要经过一下过程:

1, 着色:为像素计算颜色过程,即光照,然后雾化, 输出RGB + alpha(混合)

2. 测试,需要通过3种测试,(1)检测在渲染窗口外的像素,(2)深度测试检测,去除被遮挡的像素,(3)alpha测试,去除“过分透明”的像素,即不需要写入深度缓存;

3. 写入,如果像素通过了深度测试,以及alpha测试,则更新“帧缓存”和“深度缓存”

endl;

上一篇:用shell求两个文件的差集


下一篇:python return 返回多个值