山大软件23年下半年计算机动画技术基础

这个课的实验很折磨,主要在项目导出配置上,但是ycl老师考试给分还是蛮慷慨的

只不过到现在我都不知道自己作业是做对了还是做错了

大纲

第一章 绪论

  • 图形图像

    凡是能够在人的视觉系统中形成视觉印象的客观对象都称为图形

    狭义上讲:

    1. 图形是指由点、线、面、体等几何要素和明暗、灰度(亮度)、色彩等非几何要素构成的,从现实世界中抽象出来的带有灰度、色彩及形状的图或形。
    2. 图像(光栅图形)是像素组成的点阵

    即图形通过光栅化变为数字图像

  • 动画的基本原理

    "帧"(Frame)是指动画或视频中的静止图像。它是时间的离散单元,用于描述连续动画或视频的每个瞬间。

    视觉暂留原理:人眼在观察景物时,光信号传入大脑神经,经过一段短暂的时间,光的作用结束后,视觉形象并未立即消失,形成一定的视觉残留。一般的,人眼在看到图像后0.05-0.1秒内不会消失。因此,在前一副画面还没消失前播放下一画面,可让人产生流畅的视觉变化感觉。电影24帧/秒,电视25帧/秒。

  • 计算机三维动画设计的一般流程

    Untitled

  • 动画的分类

    按绘制效果可以分为:真实感动画和非真实感动画

    按应用效果可以分为:影视动画片,影视特技动画,广告,游戏动画,数据可视化和仿真

    影片按制作方式可分为电影、木偶片和动画片三种。电影主要是通过对人或动物等真实物体或场景进行拍摄而得到的影片。木偶片是主要采用实物模型拍摄而得到的影片。动画片则是主要通过绘制画面而得到的影片。有时人们将木偶片与动画片统称为卡通片。

    按技术原理可以分为:

    1. 关键帧动画
    2. 路径动画
    3. 变形动画
    4. 角色动画
    5. 动力学动画

    其他分类:虚实结合的动画、有生命物体与非生命物体动画、群体动画

  • 计算机动画研究内容

    动画技术、建模技术、渲染技术

    建模技术:

    1. 主动式模型获取技术 激光扫描 结构光扫描 动作捕捉

    2. 基于图像的建模技术 面部复制 躯干复制

    3. 过程建模技术 分形技术

    4. 粒子技术

    5. 多边形建模技术

    6. 参数曲线曲面建模技术 Bezier曲面 B样条曲面 NURBS曲面 Coons曲面

    7. 细分曲面建模技术 Catmull-Clark方法 Doo-Sabin方法 Loop方法 Butterfly法

      Untitled

  • 方向和方位

    方位(Orientation)

    • 主要描述物体的朝向。
    • 方位是通过相对已知方位的旋转来描述的。旋转的量称为角位移。即,在数学上描述方位就等价于描述角位移

    方向(Direction)

    • 和方位并不完全一样向量有方向,没有方位;
    • 当一个向量指向特定方向时,可以让向量自转,但向量(或者说它的方向)却不会发生任何变化,因为向量只有“大小”而没有厚度和宽度
    • 然而,当一个物体朝向特定方向时,让它和上面的向量一样自转,就会发现物体的方位改变了。

第二章 基础知识

坐标系统

  • (1)坐标系分类:

    • 空间直角坐标系(x,y,z)

    Untitled

    • 笛卡儿坐标系(Cartesian坐标系)

    笛卡尔坐标系就是直角坐标系和斜角坐标系的统称,是最常用到的一种坐标系。相交于原点的两条数轴,构成了平面放射坐标系。

    • 极坐标系(r,θ)(二维)

    Untitled

    • 柱坐标系(r,θ,h )

    Untitled

    • 球坐标系(r,θ,φ )

    Untitled

    • 左、右手坐标系:

    左手坐标系是X轴向右、Y轴向上、Z轴向前,即Z轴指向屏幕里面(x,y轴在屏幕上);右手坐标系的Z轴正好相反,是指向屏幕外部。

  • (2)各种坐标系的作用(世界、局部、相机、屏幕、惯性)

    世界坐标系

    它是一个特殊的坐标系。它建立了描述其他坐标系所需要的参考框架。从另一方面说,能够用世界坐标系描述其他坐标系的位置,而不能用更大的、外部的坐标系来描述世界坐标系。

    物体坐标系

    物体坐标系则是局部坐标系。它是和特定物体相关联的坐标系。每个物体都有它们独立的坐标系。当物体移动或者改变方向时,和该物体相关联的坐标系将随之移动或者改变方向。

    局部坐标系:

    表示形式简洁;在同一几何场景中,一物体可能会多次出现,它们可以通过复制加变换得到:标准体素+变换=新的物体;局部坐标系便于进行几何操作等。局部坐标系好像固定在你自己身上一样,这个坐标系可以定位你自己身上的东西,但你走到哪里这个坐标系就带到哪里。

    摄像机坐标系:

    摄像机坐标系是和观察者密切相关的坐标系。摄像机坐标系和屏幕坐标系相似,差别在于摄像机坐标系处于三维空间中而屏幕坐标系在二维平面里。摄像机坐标系可被看作是一种特殊的“物体”坐标系,该“物体”坐标系就定义在摄像机的屏幕可视区域。摄像机坐标系中,摄像机在原点,x轴向右,z轴向前(朝向屏幕内或摄像机方向),y轴向上(不是世界的上方而是摄像机本身的上方),是左手系。

    屏幕坐标系:参考摄像机坐标系

    惯性坐标系:

    为了简化世界坐标系到物体坐标系的转换,人们引入了一种新的坐标系,称作惯性坐标系。

    惯性坐标系的原点和物体坐标系重合,但惯性坐标系的轴平行于世界坐标系的轴。绕物体坐标系的原点旋转,直到物体坐标系的轴和世界坐标系的轴平行就得到了惯性坐标系。最后把惯性坐标系的原点平移到世界坐标系的原点就完成了惯性坐标系到世界坐标系的转换。

  • (3)特殊的坐标系:

    Untitled

向量运算

(1)两个矢量点乘:描述两个矢量的“相似”程度:结果越大,越相近

1)面片的法向与视线方向的关系,决定了面片的可见性

2)两直线是否垂直或平行

(2)两个矢量叉乘:

计算表面法向

构造新的坐标系

面积计算(有正负)

思考:

给定一个多边形的定点序列,如何判断其是逆时针还是顺时针?判断其法线方向?如何计算其面积?

Untitled

这个方法比较简单,遍历所有点,找到x最大的点Pm(该点一定在最右端曲线的“凸起”部分上),然后取该点前后各一个点Pm-1、Pm+1,组成向量(Pm-1,Pm)、(Pm,Pm+1)。然后进行向量叉乘即可判断出顺时针或逆时针。

如图,规定向量叉乘使用“右手定则”

+表示该点Pm和前后两个点组成的两个向量(Pm-1,Pm)、(Pm,Pm+1),叉乘得到的向量指向z轴负方向;

-表示(Pm-1,Pm)x(Pm,Pm+1)得到的向量指向z轴方向。

NOTE:这里必须进行遍历寻找凸点,否则若多边形含有凹的部分,并且选取的点于凹部分中,会得到相反的结果

求面积: (叉乘出来的结果正好是三角形的面积的2倍(如果不关心正负))

Untitled

当三角形的面积为正,表示这部分是凸出去的,因为是正的,那么是加到多边形面积的一部分。若三角形的面积为负,表示这部分是凹进来的,那么相当于这部分的面积是需要少掉的,所以时需要从多表现面积中去掉的一部分。

Untitled

矩阵运算

矩阵运算主要用来描述两个坐标系统之间的关系  通过定义一种运算而将一个坐标系中的矢量转换到另一个坐标系

几何变换

两种不同变换方法:变换物体与变换坐标系

  • 方位表示与旋转的表示:

    物体的方位主要描述物体的朝向,然而方向和方位并不完全一样: 1)矢量有方向,没有方位; 2)当一个矢量指向特定方向时,可以让矢量自转,但矢量(或者说它的方向)却不会发 生任何变化,因为矢量只有“大小”,而没有“厚度”和“宽度”; 3)然而,当一个物体朝向特定方向时,让它和上面的矢量一样自转,就会发现物体的方 位改变了。

    方位是通过相对已知方位的旋转来描述的。旋转的量称为角位移。即在数学上描述方位就等价于描述角位移。

  • 几种旋转表示及相互关系讨论:

    方位的转换是通过旋转变换实现的,旋转变换可以通过矩阵、欧拉角、四元数等形式进 行表示

    (1)旋转变换及欧拉定理:

    三维空间中的任意一个旋转变换,都能表示为物体绕一条过原点的轴旋转一定的角度

    过原点的旋转轴用单位矢量𝑛=(𝑛𝑥,𝑛𝑦,𝑛𝑧)来表示,此外还需要指定旋转角度𝜃,即需要四个参数变量(𝑛𝑥,𝑛𝑦,𝑛𝑧,𝜃)来描述一个空间旋转变换(由于矢量n为单位向量,所以旋转轴-旋转角参数(𝑛𝑥,𝑛𝑦,𝑛𝑧,𝜃)只有3个自由度)

    (2)旋转矩阵

    称一个描述空间旋转变换的3×3矩阵为空间旋转矩阵,空间旋转矩阵𝑅含有9个数,但 空间旋转仅有三个自由度,因此一个3×3矩阵必须满足一定约束条件才能成为旋转矩阵,即旋转矩阵𝑅的三个行(列)向量构成了一个标准正交基底。

    空间旋转矩阵𝑹是一个行列式为1的正交矩阵

    优点:

    1)可以立即进行矢量的旋转。矩阵形式最重要的性质就是利用矩阵能在物体坐标系 和惯性坐标系间旋转矢量,这是其他方法做不到的。

    2)被图形API所使用。

    3)多个角位移连接。矩阵形式可以打破坐标系间的嵌套关系。

    4)矩阵的逆。用矩阵表达角位移时,逆矩阵就是“反”角位移。

    缺点:

    占用更多内存,并不直观,可能造成病态矩阵

    (3)欧拉角形式

    让物体开始与”标准”方位—就是物体的坐标轴和惯性坐标轴对齐,然后分别作Heading-pitch-bank 旋转,最后达到我们想要的物体方位( 左手系): 1)初始方位下,物体的坐标轴和惯性坐标轴重合,然后绕y轴旋转(向右为正); 2)绕新的物体坐标系x轴作pitch旋转(向下为正); 3)绕新的物体坐标系的z轴作bank旋转(从原点像+z方向看,逆时针为正)。

    优点:

    1)容易使用,最直观

    2)最简洁的表达,欧拉角用三个数表示方位

    3)没有非法的描述,任意三个数都可以描述欧拉角

    缺点:

    给定方位的表达方式不唯一,存在多个方位描述它,这称为别名问题,有万向锁现象

    插值存在问题

    之所以被称为万向锁,是因为在万向节装置中,当两个旋转轴重合时,万向节会损失一个方向的自由度

    Untitled

    (4)四元数形式(Quaternion)

    物体由一个方位变换到另一个方位也可以看作是物体绕一个轴进行旋转一定的角度达 到新的方位。因此,物体的方位变化也可以用旋转轴-旋转角形式(Angle and Axis)进行表示。常用四元组(n,$\theta$)表示,其中单位矢量n表示旋转轴,$\theta$是旋转的角度。

    四元数的优点:

    可平滑的球面线性插值(Slerp),比欧拉角方法的直接插值产生更平滑连续的旋转;可快速连接和角位移求逆;能和矩阵形式快速转换;仅用四个数表示。 四元数的缺点:

    比欧拉角的存储稍微大。

方位表示

方位表示

颜色空间

RGB 颜色模型

CMYK 颜色模型

HSV 颜色模型

CIE(国际照明委员会)颜色模型

中间有个颜色转换 看不了一点😒

不同的颜色模型,为什么打印不用RGB用CMYK?

Untitled

第三章 动画生成

3-1 关键帧动画

计算机动画的最基本技术,其他动画技术常结合该技术实现最终动画

基本思想就是映射和**插值 ,**不同的映射方式和不同的参数选择会得到不同的动画效果。

计算机生成关键帧动画的过程一般是先指定关键帧,然后指出插值函数的类型,再计算生成中间帧。在二维动画中,关键帧常常为一幅图像;在三维动画中,每一关键帧要插值的是一系列参数,包括诸如位置与方位,面部特征、光照与相机等信息。

(1)颜色插值:

对两幅图像F1,F2插值出中间的系列图像F(t),可以采用如下的线性插值公式:

$$ F(t)=(1-t)F_1+tF_2 \ \ t\in(0,1) $$

Untitled

(2)位置插值:

Untitled

(3)形状插值:

Untitled

(4)方位插值 对两个关键帧之间的方位发生变化。(可以直接插值变换矩阵,但存在问题(正负方向转回到原位,变换矩阵的插值不是单位矩阵)。固定角表示法,用物体角度固定旋转轴,存在万向锁问题。欧拉角方法和固定角方法的优缺点相同。)

对于关键帧的插值我们显然不能直接使用旋转矩阵进行插值

Untitled

对于欧拉角我们有一个避不开的问题:万向锁(当两个旋转轴重合时,会损失一个自由度)

Untitled

具体的我也看不明白:

Untitled

反正四元数可以完美解决球面插值

思考:

Untitled

3-2 路径动画

对于这类动画,我们

  1. **(路径生成)**首先需要给出物体运动的路径,即运动轨迹曲线;
  2. **(运动控制)**然后定义物体沿运动曲线的速度;
  3. **(方位计算)**再计算每一时刻物体在曲线上的位置和状态(如形状、颜色、方位等)
  • 路径生成

    有两种不同的方式:

    1. 通过交互输入系列关键点,然后合适的插值技术生成运动路径曲线。
    2. 指定源点和目标点,由计算机自动计算出物体的运动路径。(在计算几何中属于路径规划范畴)

    这里的路径可以最短路径,也可以是带有某些约束的路径,如offset曲线路径、骨架路径

    • 基于插值的路径生成

      对于物体运动路径的插值,常用的插值技术除了线性插值和双线性插值这种简单的技术,还包括 Hermite 插值、Catmull-Rom 样条插值、B-样条插值、Bezier插值、抛物线融合曲线(parabolic blending)等

      <aside> 💡 总结:其中提到的五种插值,最经常使用的是:

      • 过顶点的: Catmull-Rom样条(不需要额外信息)
      • 不过顶点的(逼近):Bezier曲线(不需要额外信息) 别忘了最简单的两种插值:线性插值和双线性插值

      </aside>

      这里主要介绍抛物线融合曲线方法,其他方法参见细分曲面建模方法

      对于每三个相邻的点$p_{i-1},p_{i},p_{i+1}$可以计算过他们的抛物线,而$p_{i},p_{i+1}$之间的曲线可由$p_{i-1},p_{i},p_{i+1}$生成的抛物线和$p_{i},p_{i+1},p_{i+2}$生成的抛物线进行线性插值融合得到。

      <aside> 💡 Hermite插值 需要给出每一个点处的切线,只给出关键点的位置信息,其无能为力 Catmull-Rom曲线根据相邻关键点信息构造出关键点处的切线,再进行插值

      </aside>

      1、逼近程度:

      通过所给的所有控制点Hermite 曲线和 Catmull-Rom 样条曲线
      是所给控制点所形成的控制多边形的近似描述B样条曲线和 Bezier 曲线

      2、复杂度:

      阶数越高,插值精度越高,光滑度越好,复杂度越高。分段的三次多项式是常用的插值函数(可以满足应用所需的平滑度,还能在满足一些约束条件有一定灵活度)

      3、光滑度:

      | 一阶连续 | Hermite 曲线, Catmull-Rom 曲线,抛物线融合曲线(parabolic blending)和组合的三次 Bezier 曲线 在连接处一阶连续 | | --- | --- | | 二阶连续 | B-样条函数本身是分段多项式,三次B-样条曲线在任意一处都是二阶连续 |

      4、全局或局部控制

      全局控制整条 Bezier曲线(移动一个控制点整条改变)
      局部控制几乎所有的组合曲线都提供局部控制功能
      如 Catmull-Rom,抛物线融合曲线和三次B-样条曲线

      局部控制可以使用户更灵活的控制曲线形状,更为常用。

      5、需要输入信息

      只有插值点的坐标信息Bezier曲线和B-样条可以构造出来
      插值点的坐标信息和每个插值点处的切向量信息Hermite曲线
      插值点的坐标信息和起点、终点处的切向量信息
      只有端点处(路径途径顶点)信息,没有内部控制点的信息等Catmull-Rom可以看成是特殊的Hermite,其内部控制点的切线可以由一个简单的几何程序产生

      总结:

      Hermite:控制顶点、导数值(切线) 两端Hermite曲线在连接点处是C1连续的,因为在连接点处的导数是相等的 由于需要输入切线导致其应用性变差

      Bezier:其具有很好的保凸性,保型性,曲线形状不依赖坐标系的选择,人机交互手段灵活;缺点:缺少局部性,修改一个控制点将影响整条曲线;曲线与控制多边形的逼近程度较差,次数越高,逼近程度越差;当表示复杂形状时,不论是高次曲线还是多端低次曲线拼接,都很复杂。 (md 说根本局限是 三次Bezier在连接处只有C0的连续性)

      反正是过起始点和终点

      B样条曲线:

      B-样条函数本身是分段多项式,三次B-样条曲线在任意一处都是二阶连续

    • Offset路径

      简单来讲多边形的offset路径类似于在多边形内部构建一条到多边形上的最短距离相等的路径?

      Untitled

    • 骨架路径

      在虚拟场景中,有些用户可能只是走马观花,在场景的中间走动观看两侧的展品,或穿过某个展室。这时,可提供基于Voronoi骨架的路径,简称骨架路径,使用户在场景中间走过。

      Untitled

    • 三维空间中的路径规划

      对于三角网格表示的物体表面

      如果要求起点和终点之间的最短路径必须过三角网格的顶点,一个直接的方法是把整个三角网格看作一个图,然后用 Dijkstra算法等图论中计算最短路径的算法进行计算。

      如果不要求最短路径必须过三角网格的顶点,一个简单、近似的办法是定义一个通过起点和终点的垂直平面,然后该平面与求出三角网格交线,即可得到起点和终点间的一条最短路径

    • 运动路径的 平滑处理

      一些应用中,运动路径的各控制点是通过数字化过程产的生,插值出的曲线由于噪声的原因导致太尖锐。这就需要对其进行一定的平滑处理。常用的技术有线性插值、三次插值以及卷积运算等

  • 运动控制

    给定一条参数化曲线,如何确定物体在该轨迹曲线上运动时在t时刻对应的位置点。解决这个问题的一般方法:

    1)给出时间-距离函数s = D(t) , 其中t为时间参数,st时间内所运动的距离D(t)。这里,需要给出速度、加速度等信息。

    2)计算时刻t对应的位置点p, 其中要满足曲线上从起点到p点间的弧长长度为s

    Untitled

    Untitled

    因此,计算时间t对应的曲线上点p的计算公式为:$p = P(U(D(t)))$

    • 时间-距离函数(速度控制)

      简单来讲就是初中物理里简单的运动学方法

      Ease-in/ease-out的实现方法:

      正弦曲线(Sinusoidal)

      分段的正弦曲线(Sinusoidal segmented)

      单调三次多项式曲线**(**Single Cubic Polynomial)

      固定加速度(Constant acceleration)

      一般的距离时间函数(General distance-time functions)

    • 弧长-参数函数

      通常情况下,对于任意曲线,参数的恒定变化不会导致恒定的行驶距离。

      两个需要解决的问题:

      1. 给定参数$u_1$和$u_2$,计算$LENGTH(u_1,u_2)$
      2. 给定弧长$s$和参数值$u_1$,找到这样的$u_2$,使其满足$LENGTH(u_1, u_2) = s$

      Untitled

      前向差分方法(Forward Differencing)

      创建一个参数值u和弧长s的表,建立us之间的关系

      查询表:近似的参数值,近似弧长

      Untitled

      具体查询时,根据数据精度,可能不能查询到正好的值,这时候可以使用最近邻方法(四舍五入),或者根据前后最近的进行线性插值计算一个较为精确的值,同时,加速查找时可以使用二分的方法

      优点:易于实现、直观、计算快

      缺点:有误差(解决方法:超采样提高精度,高阶插值拟合)

      生成这个表的时候可以采用自适应方法拟合,比如将曲线中点到拟合直线的距离作为是否继续细分的判断条件

      自适应方案:

      为了更好的控制误差,自适应前向差分技术可对包含较大误差的曲线区域投入更多计算。方案如下:

      考察当前的曲线的一部分,并检测线段长度的估计值是否在估算值求和后的误差范围内。如果大于误差,则均分该线段将各1/2 线段放入检测,直至符合

      缺陷:

      在处理过程的先期阶段,两个二分之一线段可能导致划分过程提前结束。因此,一类比较明智的做法是将细分过程设置成某个层次之后,随后使用自适应方案。

  • 方位计算

    路径动画考虑:Location位置Speed速度Orientation方位运动曲线上某点处,要计算物体的方位,建立物体的局部坐标系。坐标系的原点可由路径 P(s)上的点确定,该点可以是根据设定的帧数、弧长参数和淡入淡出控制来产生的。还需要确定 $u,v,w$ 轴,建立物体坐标系,其中令 w 表示视线方向(view vector),v 表示垂直 w 且向上的方向(up vector)

    • Frenet 帧方法(Frenet Frame)

      通过计算曲线的切线和曲率来计算

      Untitled

      Untitled

      Untitled

      通过这三个向量建立运动物体的局部坐标系,该方法在曲率间断时存在一些问题需要特殊解决:

      • 路径生成之后要做进一步平滑处理
      • 在frenet帧的公式中,矢量v仅仅指向$p’’(s)$不太合理
      • 需要考虑曲线路径存在曲率的问题或区域不连续的情况
    • 相机路径跟随:兴趣中心方法(Camera Path Following: Adding a Center of Interest)

      可以根据实际情况,设置不同的感兴趣区域或物体的中心 COI,来定义 w 方向

      $$ w=COI-POS,u=w\times y_{axis},v=u\times w $$

    • 方位插值

      不是很懂,但是好像用四元数插值会比较好

  • 思考:

    Untitled

    这里同样采取离散化的处理方案:

    将椭圆的弧长等分成99份,而不是角度等分

    定义椭圆的参数:
    
    a: 长轴的长度
    b: 短轴的长度
    center: 椭圆的中心点坐标 (x_c, y_c)
    speed: 小球的匀速运动速度
    计算椭圆的周长:
    
    circumference = 2 * π * sqrt((a^2 + b^2)/2)
    计算每一份的弧长:
    
    arc_length = circumference / 99
    初始化一个列表来存储离散化后的点的坐标:
    
    points = []
    对于每一份,计算小球的位置:
    
    对于第 i 份,计算小球在椭圆上的弧长位置:s = i * arc_length
    使用数值方法(如二分法)求解椭圆的参数方程 x(t) 和 y(t) 中的参数 t,使得从 t = 0
    到 t 的弧长为 s
    计算小球在该位置的时间:t = s / speed
    计算小球在该时间点的坐标:
    x = x_c + a * cos(t)
    y = y_c + b * sin(t)
    将坐标 (x, y) 加入到 points 列表中
    对于每两个相邻的点,使用插值方法计算它们之间的运动状态:
    
    对于相邻的点 p1(x1, y1) 和 p2(x2, y2),计算它们之间的插值点个数:n = 10(可以根据需要调整插值点个数)
    对于每个插值点的索引 i,计算插值参数:t = i / (n+1)
    计算插值点的坐标:
    xi = x1 + (x2 - x1) * t
    yi = y1 + (y2 - y1) * t
    将插值点的坐标加入到 points 列表中
    

3-3 变形动画

  • 1、直接变形

    我们可以用一个公式对物体进行直接变形:

    $$ p^,=M(p)p $$

    进行全局形变

    我们也可以直接拖动物体的一个或多个顶点局部改变物体的形状,如图4.32。 拖动一个点确定其目标位置后,需要在局部范围内调整其他顶点的位置。这里, 离拖动点越远,顶点的位移越少。

    Untitled

  • 2、间接变形

    空间变形(Spatial Deformations)空间变形是改变物体周围空间的形状,从而改变物体的形状,减少交互工作量。

    优点:

    由于空间变形操作的是物体控制顶点的位置,所以和物体的表示方式无关,通过局部或者全局的改变物体周围空间的大小和形状可以达到对物体进行局部或者全局变形的效果

    空间变形方法根据变形过程中变形工具的不同来可分为四类:基于体素的变形、基于曲面的变形、基于曲线的变形、基于点的变形。所有这些变形技术基本上都是通过对控制顶点进行重定位(放缩、旋转等操作)来达到物体变形目的。

    基本步骤(四大步):

    • 创建变形工具。 用户首先定义变形工具的初始控制顶点

    • 建立物体顶点与变形工具之间的约束关系

    • 移动变形工具的顶点来改变变形工具的形状。

    • 改变目标物体的形状。根据被改变之后的变形工具的控制顶点和物体顶点之间的约束关系,计算出目标物体顶点的新位置。

    • (1)基于体素变形

      1)基于网格变形

      使用2D网格例子进行说明:

      Untitled

      移动后的p点使用双线性插值得到。基于3D网格与之类似,三维体空间的Bezier 插值,拖动网格控制点( Bezier控制点),对象的顶点可用Bezier插值得到。

      其中的变与不变;

      变:控制网格顶点的位置改变

      不变:保持插值系数不变

      2)基于三角面片的变形

      • 创建一个由一系列三角形组成的具有任意拓扑几何结构的体素
      • 通过改变三角面片的控制顶点来进行物体的变形

      Untitled

    • (2)基于曲面变形

      首先建立一个或者多个平面或者曲面片作为变形工具(比如Bezier 曲面,NURBS 曲面等),然后用变形工具上的点来表示目标物体上的点,通过改变变形工具的形状来带动目标物体的变形。

      在建立映射关系时,难点在于如何将模型的采样点和曲面联系起来。3D模型如何投影在曲面上,投影建立后就和2D体素一模一样。

      Untitled

    • (3)基于曲线变形

      基于曲线的变形方法利用一条或者多条曲线作为变形工具。该方法比较适用于扭曲或者裁剪坐标轴,或者沿着骨架曲线变形物体。

      2D建立映射关系:

      简单来说就是过点做平行线 参数有两个 :

      $d(到曲线的距离)r(离左右分界线的比例)$

      Untitled

      3D情况:局部坐标系,Frenet标架

      已知物体上的点𝑣与曲线点𝑐_𝑣对应(最近点) 计算曲线点𝑐_𝑣 的Frenet标架的三个基向量𝑡,𝑛,𝑏 𝑣= 𝑐_𝑣+𝑥∗𝑡+𝑦∗𝑛+𝑧∗𝑏 坐标值(𝑥,𝑦,𝑧)就是点𝑣与曲线点𝑐_𝑣之间的约束关系

      Untitled

      缺点:

      直线段部分不存在法向量。 在曲线的拐点处法向量会发生反转,导致变形结果出现不合理扭曲 法向量会出现不合理的旋转,导致变形结果出现不合理扭曲

      采用最小旋转标架解决了这种情况

      • 基于骨架路径的变形:

        (1)柱状变形

        柱状变形通过在源图和目标图像空间中构造各自的坐标系统来建立映射关系。目标图像空间由路径以及用户指定的目标对象宽度决定

        Untitled

        (2)带状变形

        带状变形与柱状变形不同之处在于纵轴的定义方法。在带状变形中,纵轴方向不随路径而改变,而是始终取竖直方向

        Untitled

        Untitled

    • (4)基于点变形

      以一个或者多个点作为变形工具,通过改变点的位置来改变物体的形状

      虽然基于点的变形方法比基于曲线的变形方法维数更低,但是因为点不再限 制于一维的线状物体,所以它有更大的自由度。基于点的变形方法也在效率和可用性方面做出了牺牲。

  • 3、渐变技术

    Morphing 主要分为二维和三维渐变技术。

    二维渐变技术主要包括基于图像的渐变技术和基于几何的渐变技术。

    三维渐变技术主要包括两类:

    基于多边形表示(Polygonally-based Representation)模型

    基于体素表示(Volumetric Representation)模型

    • (1)基于控制网格的图像渐变(常用的基于图像的渐变技术)

      步骤:

      • 控制网格(control)
      • 变形(warping)
      • 交叉融合(cross dissolving)

      主要思想: 定义源图像和目标图像的所在平面网格$M_𝑆$及$M_𝑇$,由一系列控制定点组成,如 图4.56 所示。该方法首先对平面网格进行插值,获得中间插值网格M,然后运 用该网格和 $M_𝑆$及$M_𝑇$对原图像和目标图像进行变形得到插值后网格$𝐼_1$和$𝐼_2$,再对$𝐼_1$和$𝐼_2$进行插值,得到最终图像

      Untitled

      Untitled

      1. 定义初始图像和目标图像
         initial_image = load_image("initial_image.jpg")
         sneeze_image = load_image("sneeze_image.jpg")
      
      2. 定义初始网格和目标网格,并初始化为与图像特征位置相对应的网格点
         initial_grid = create_grid(initial_image)
         target_grid = create_grid(sneeze_image)
      
      3. 定义渐变动画的总帧数和当前帧数
         total_frames = 60
         current_frame = 0
      
      4. while current_frame <= total_frames:
            a. 计算当前帧对应的插值权重(0到1之间的值)
               interpolation_weight = current_frame / total_frames
      
            b. 创建中间网格,通过对初始网格和目标网格进行插值
               intermediate_grid = interpolate_grids(initial_grid, target_grid, interpolation_weight)
      
            c. 根据中间网格对初始图像和目标图像进行插值,得到中间图像
               intermediate_image = interpolate_images(initial_image, sneeze_image, intermediate_grid)
      
            d. 显示或保存中间图像
      
            e. 更新当前帧数
               current_frame += 1
      
      5. 结束循环
      
    • (2)基于特征的图像渐变

      假设用户在原物体和目标物体中定义了相对应的特征线,对源图像和目标图 像建立对应关系

      源(目标)图像到中间图像的变形是根据每个特征线,计算每个像素关于特征线的定位实现的

      Untitled

      该算法有如下优点:对于图像表示有着较好的表达能力;通过移动线段来改变图像可有着一个预期的效果。

      其缺点是:由于对于图像的操控属于全局变换,因此其计算速度较慢;控制较为麻烦--同样,这是由于其全局控制的原因;容易产生鬼影问题。

    • (3)基于星形多边形的三维渐变-轴向切片

      平面上

      对于两个星形多边形,分别从其核中选取一点,分别作为两多边形的中心点。将这两中心点重合,设为a,然后从a通过两个多边形的每个顶点pi作射线,每条射线会与另一个多边形的边界相交于qi。然后根据中间帧的参数,用线性插值技术对 pi和 qi插值。这样可得到该帧中的多边形。这样,可实现两多边形之间的渐变。

      Untitled

      可以首先计算一个轴,然后用垂直于该轴的平面切割物体,得到的是星形多边形,称为轴切片。对于每个轴切片,采用上面介绍的渐变技术生成中间结果。这样,可以实现两个物体之间的渐变。

      Untitled

3-4 角色动画

人和动物的形体通常采用层次关节结构表示:

关节链(Linkage)是由一系列依次相连的刚体连接而成的开链。

关节(joint):两个刚体的连接点

连杆(link):连接两相邻关节的刚体

关节链的起点为基结点,其自由末端为末端影响器(end effector)

Untitled

状态空间的每个向量(状态向量)定义了关节链结构的一种形态,可由一组独立的位置、朝向及关节旋转等参数确定。状态空间的维数等于关节链结构的自由度。自由度(degree of freedom,DOF)则是指完全确定关节链结构的状态所需的独立变量个数。

Untitled

层次关节结构可以利用树状结构来表示(对角色动画而言,常称为骨架树);树由节点和连接节点的弧组成:

弧(Arc)—— 对应关节

节点(Node)——对应连杆

Untitled

  • 1、Forward Kinematics (FK) 正向运动学

    动画师指定每个链杆变换参数,系统通过给定状态向量确定各关节的位置及末端影响器的位置,是正向求解过程。

    末端影响器位置坐标;

    • 单链杆关节:

    Untitled

    • 双链杆关节:

    Untitled

    • 三链杆关节:

    Untitled

    正向动力学法求解过程直观简单;但需要制作者清晰地定义关节结构中的每 个部件的所有运动,过程比较繁琐,太多的自由度使用户无所适从。

  • 2、Inverse Kinematics (IK)逆向运动学

    用户给定末端影响器(或其他链杆)的位置或方位,然后逆向求解关节链结构的状态向量,进而求得各关节的空间位置.

    逆向动力学方法求解时,如果关节较少则用分析求解,反之则用统计迭代求 解。

    而对于三维空间中的两个或者多个链杆连接的情况,则需要采用约束优化的 方法来求取关键帧中的姿势。最常见的是采用牛顿迭代法求解.

3-5 动力学动画

本节主要介绍粒子系统动画、刚体力学动画、柔体力学动画、流体力学动画等常见的动 力学动画

  • 1、粒子系统:

    粒子系统的基本思想是将许多简单形状的微小粒子作为基本元素聚集起来形成一个不规则的模糊物体,每个粒子均经历出生、成长、衰老和死亡的过程,与粒子有关的每一参数均将受到一个随机过程的控制。

    生成粒子系统某瞬间画面的基本步骤是: 1) 生成新的粒子并加入系统中; 2) 赋予每一新粒子以一定的属性; 3) 删除那些已经超过其生命周期的粒子; 4) 根据粒子的动态属性对粒子进行移动和变换; 5) 绘制并显示由有生命的粒子组成的图形。

    每个粒子有形状、颜色、位置、运动速度、大小、透明度和生命值等属性;

    其形状是一些简单形状;粒子不是静态的,可以随时间的改变而变;粒子常具有很大随机性,这些随机性可以覆盖粒子的全部生命周期和所有属性,如粒子的创建时机、颜色值、粒子出现的位置等。粒子不断被产生、消失,会涉及大量粒子,频繁申请、释放内存会降低运行效率。为此,建立活动粒子链表、死亡粒子链表,实现粒子重用。

  • 2**、刚体力学:**

    ppt上没找到 讲义中的刚体力学为自由落体运动仿真动画,竖直上抛仿真运动等

  • 3**、柔体力学:**

    当物体受到外力时,可能发生弯曲,压缩,折断,剪切等变形形式,对于物体的这些变形特征进行具有真实感的模拟,要考虑到物体的基本物理属性,如弹性特征,硬度指数等因素,以及物体所受的外力情况。

    基于物理情况的有限元法,边界元法
    基于非物理情况的变形样条,弹簧质量模型、链接体素、张量质量
    两者混合的结合启发式算法和连续介质模型的算法的优点,对变形物体进行建模

    柔性物体的仿真动画可以分为三类:基于物理的和非基于物理的,以及两类方法的混合。基于物理的方法以连续介质力学为基础,通过数值计算直接求解偏微分方程来得到精确的仿真结果。这些方法有:有限元法(FEM)与边界元法(BEM)等。非物理模型则采用直观的方法代替解偏微分方程,也称为启发式算法。该方法有:变形样条方法,弹簧质量模型方法,链接体素方法,张量质量模型等方法等。还有一种就是混合的方法,结合启发式算法和连续介质模型的算法的优点,对变形物体进行建模。

    Untitled

    (1)变形样条方法

    (2)弹簧质量模型方法

    弹簧质量模型就是由弹簧和质量点(质点)组成的网格模型。物体的轮廓被离散化为三角面片,其中边是由弹簧组成,点是质量点。

    Untitled

    优点:

    1)只是构建物体的表面,数据量小,数据结构简单

    2)网络结构 简单

    3)很容易利用显卡渲染,易于编程实现

    4)应用最为广泛

    缺点:

    1)弹簧质量模型的局部结构阻碍了变形的全局传播速度

    2)变形模型的结果易于摆动,很多参数基于具体实验

    3)物体切口处的模拟仿真不够理想

  • 4**、流体力学(不考 ctnn):**

往年大题

1、一辆小汽车沿着光滑曲线经过标记点行驶,写出所运用的动画技术和实现步骤:

(1)所用动画技术:关键帧动画,路径动画

(2)实现步骤:

  • 路径生成:在场景中确定标记点,这些点组成光滑曲线的控制点,使用Catmull-Rom样条曲线,根据端点生成曲线,然后做平滑处理
  • 运动控制:创建小汽车模型,确定小汽车的初始位置,朝向,速度等参数;
  • 方位计算:在每一帧的动画循环中,根据时间和速度等参数,用Frenet帧的形式计算小汽车在曲线上的位置和方位
  • 渲染场景:使用渲染引擎将场景中的模型,光照,材质等元素进行渲染
路径生成:
在场景中确定标记点,这些点将组成光滑曲线的控制点。
使用Catmull-Rom样条曲线算法,根据控制点生成光滑曲线的顶点坐标。

创建小汽车模型:
使用三维建模工具创建小汽车的3D模型。
进行纹理贴图等材质处理,使小汽车外观更逼真。

运动控制:
设置小汽车的初始位置、朝向和速度等参数。
定义动画循环的时间步长,例如每帧的时间间隔。

方位计算:
在每一帧的动画循环中,根据时间和速度参数,沿着光滑曲线计算小汽车在曲线上的位置。
使用Frenet框架或其他方法计算小汽车的方向(朝向)。

更新小汽车的变换矩阵:
根据计算得到的位置和方向,更新小汽车的变换矩阵。
将小汽车模型正确放置在曲线上,保持与曲线的位置和朝向一致。

渲染场景:
使用渲染引擎或图形库,将场景中的小汽车模型、光照、材质等元素进行渲染。
根据相机设置和其他环境参数,生成最终的渲染图像。

2、近期网络上流传一则视频谣言,视频中我国台北著名建筑101大楼不断摇晃,运用计算机动画的知识,造假者可能使用哪种计算机动画技术实现视频效果,并说明步骤(变形动画)

(1)大楼建模:

使用三维建模工具创建台北101大楼的3D模型,并设置合适的材质和纹理。

(2)曲线生成:

在场景中确定曲线路径,该路径将用于控制大楼的变形效果。 使用合适的曲线生成算法(如贝塞尔曲线)生成光滑的曲线。

(3)曲线变形控制:

将大楼模型与曲线路径关联起来,以便后续的变形控制。 在每一帧的动画循环中,根据时间和速度等参数,计算大楼模型上每个顶点的变形量。 将曲线路径上的控制点映射到大楼模型上的对应顶点,根据其位置进行曲线变形控制。 可以使用插值算法(如Catmull-Rom样条曲线)来平滑控制点之间的变形量。

(4)渲染场景:

使用渲染引擎或图形库,将场景中的大楼模型、光照、材质等元素进行渲染。 根据相机设置和其他环境参数,生成最终的渲染图像。

第四章 建模

4-1 表示方法

三维物体的表示主要分为以下几个层次:原始数据(Raw Data)、面表示、实体表示和高层表示。

原始数据表示点云(Point Cloud )、深度图像、多边形集合
面表示法多边形网络(Mesh)、参数化曲面、细分曲面、隐式表示
实体表示法体素表示法、构造实体几何(CSG)、Sweep法
高层表示法层次建模、场景图
  • (1)原始数据表示法:

    原始数据表示方法包括点云(Point Cloud)(图3.1)或深度图像(Range Image)、多边形集合(图3.2)等。

    三维扫描仪等设备能够测量物体表面离散点的三维坐标,这些大规模的离散测量点称为点云。每一次扫描得到的一组按照矩形顺序组织的点云数据,成为深度图像。**这种原始数据不适合于计算物理和几何属性,也不适合于显示,没有点与点之间的邻接关系,也没有面和体的信息。**一般需要通过曲面重建(surface reconstruction)算法产生一个三角形网格(triangular mesh)等。我们也可以利用三维交互建模系统构造一系列没有结构的多边形合,包含深度图。

    Untitled

  • (2)面表示法:

    面表示方法包括多边形网格(Mesh)(图3.3)、参数曲面片(parametric patches)(图3.4)、细分曲面(Subdivision Surface)(图 3.5)、隐式表示 (implicit representation) (图 3.6)等。

    Untitled

    1)多边形网络(Mesh)

    多边形网格是是计算机图形学最常用的模型表示。它 是三维计算机图形学中表示多面体 形状的顶点与多边形的集合。

    多边形网格的优势包括:容易表示;数据结构简单;容易变换;性质简单;每个面只有 一个法向量,容易确定内外侧;容易绘制;便于多边形填充和纹理映射,存在可以对其进行有效处理的算法和图形硬件支持等。

    多边形表示方法的不足之处是这种模型本质上是离散的,要求精度很高时会导致大量的数据,对物体做整体变形非常困难,人工地一个面、一个面地创建模型非常繁琐。

    2)参数化曲面

    参数曲面片表示法与多边形网格相似,只是各个多边形的表面变成了弯曲的。通过增加 约束条件,该方法可保证连接处的连续性。每一个曲面片都用一个数学公式来定义,根据这个公式能够产生曲面片表面上的每一个点。通过改变曲面片的数学定义就能够改变曲面片的位置及形状,具有很强的交互能力。

    这种表示方法存在的问题是:

    • 绘制曲面片的效率较低;
    • 如何从一个曲面片光滑地过渡到相邻的曲面片;
    • 一个曲面片不能表示任意拓扑的形状,一个物体需要很多个曲面片共同表示。

    这种表示方法在计算机辅助设计 CAD、制造CAM、工程CAE广泛应用。

    3)细分曲面

    细分曲面法是用低分辨率的控制网格和定义在控制网格上的细分规则来表示光滑曲面 的。由于细分曲面不但解决了计算机图形学中遇到的任意拓扑和一致性表示问题,而且还保留了传统参数化曲面表示所具有的局部性、仿射不变性等良好性质,因而近年来得到广泛的应用,正逐渐成为几何造型的有力工具。

    4)隐式表达

    隐式表示法用隐函数作为物体的表示形式。满足这个方程的点位于物体表面上。这种表 示可以看为是一种“测试”,把一个点的坐标代入函数式中,检测函数值是否为 0。如果函 数值等于0,表示这个点位于物体表面上,否则不属于物体表面。从绘制的角度看,这种表示法非常不方便。

  • (3)实体表示法

    实体表示法包括体素表示法(图3.7)、构造实体几何(CSG)法(图3.8)、Sweep运算法(图3.9)等。

    Untitled

    1)体素表示法

    体素表示法把物体的空间分解成基本的单元,如立方体,称为体素(voxel);再把每一个体素标记为空或含有物体的某部分。这种表示方法表示了物体占据的三维空间,是一种体表示法(volumetric models)。 其划分的单元越小,需要的存储空间就越多。体素中保存布尔值(1-内部,0-外部),也可以保存密度值。

    2)CSG法(构造实体几何):

    CSG法是以基本体素为叶节点,逐层进行线性变换和布尔运算(并、交、差)的结果,即用简单的几何物体组合出复杂的物体模型。这种方法也是一种体表示法。

    3)Sweep法:

    Sweep 法利用实体沿着一条曲线运动形成的轨迹生成模型。曲线可以是任意的,实体围着路径中心做放缩或者旋转等操作。

    4)BSP (Binary Space Partitioning) Tree (PPT上的)

    是一种使用超平面递归划分空间到凸集的一种方法。使用该方法划分空间可以得到表示空间中对象的一个树形数据结构。这个树形数据结构被我们叫做BSP树

    Untitled

  • (4)高层表示法:

    高层表示法包括层次模型(骨架模型)(图3.10)、场景图(Scene graph)(图3.11)等方法。

    Untitled

    层次模型法用树形结构描述各个组成部分及其之间的关系。在这种结构中,用节点表示 每一个组成部分,各部分之间的联系则用结点之间的有向线段来表示。 场景图是组织和管理三维虚拟场景的一种数据结构,用一个有向无环图(Directed Acyclic Graph,DAG)维护节点所含的信息。在场景图中,一个节点除了可以是3D模型以外,还可以是声音、光照、雾和其他的环境效果、视点以及事件触发器等。

4-2 分型造型-隐式曲面

  • (1)Sweeps

    Sweep 法利用实体沿着一条曲线运动形成的轨迹生成模型。曲线可以是任意的,实体围着路径中心做放缩或者旋转等操作。

  • (2)Fractals(分形)

    分形(fractal)就是过程建模中经常采用的一种技术,常用于产生地形图,也可用于生成云、植物、水纹和天空的纹理图像。

    分形最关键的概念是自相似。当一个物体的一部分放大后看起来仍与整个物体一样,那 这个物体就是自相似的。地形就是自相似的,一块岩石的锯齿状边缘与远处的山脊有类似的不规则形状。因此,可以用分形来生成地形,显示时不管怎么放大,看起来仍然像地形。

    确定性自相似分形(Deterministically self-similar fractals): 确定性自相似分形是指分形的各个部分是原始分形的缩放副本。这意味着通过对原始分形进行缩放操作,可以生成与原始分形结构相似但不同尺度的副本。确定性自相似分形的特征是整体结构的重复出现,其中每个部分都是原始分形的缩放版本。

    科赫曲线 Koch curve

    Untitled

    第一步:画一个等边三角形,并把每一边三等分;

    第二步:取三等分后的一边中间一段为边向外作正三角形,并把这“与主三角形靠近的一边”擦掉;

    第三步:重复上述步骤,画出更小的三角形;

    第四步:一直重复。

    chat 生成 看个乐子💩

    # 定义绘制科赫曲线的函数
    function draw_koch_curve(start_point, end_point, level):
        if level == 0:
            draw_line(start_point, end_point)  # 绘制直线段
        else:
            # 计算等分点
            p1 = start_point + (end_point - start_point) / 3
            p2 = start_point + (end_point - start_point) * 2 / 3
    
            # 计算中间点
            angle = 60  # 正三角形的内角
            length = distance(p1, p2) / 2
            offset = rotate(end_point - start_point, -angle)  # 旋转向量
    
            p3 = p1 + offset * length
    
            # 递归绘制科赫曲线的四个线段
            draw_koch_curve(start_point, p1, level - 1)
            draw_koch_curve(p1, p3, level - 1)
            draw_koch_curve(p3, p2, level - 1)
            draw_koch_curve(p2, end_point, level - 1)
    
    # 绘制科赫曲线
    start_point = (x1, y1)  # 起始点坐标
    end_point = (x2, y2)  # 终点坐标
    level = 4  # 科赫曲线的递归层数
    
    draw_koch_curve(start_point, end_point, level)
    

    谢尔宾斯基三角形 Sierpinski triangle

    Untitled

    第一步:取一个实心的三角形。(多数情况下使用等边三角形);

    第二步:沿三边中点的连线,将它分成四个小三角形;

    第三步:去掉中间的那一个小三角形;

    第四步:对其余三个小三角形重复步骤一。

    function draw_sierpinski_triangle(triangle, depth):
        if depth == 0:
            draw_triangle(triangle)  # 绘制三角形
        else:
            # 获取三角形的顶点坐标
            point1, point2, point3 = get_triangle_vertices(triangle)
    
            # 计算三角形的中点坐标
            mid_point1 = calculate_midpoint(point1, point2)
            mid_point2 = calculate_midpoint(point2, point3)
            mid_point3 = calculate_midpoint(point3, point1)
    
            # 构建新的三角形
            triangle1 = [point1, mid_point1, mid_point3]
            triangle2 = [mid_point1, point2, mid_point2]
            triangle3 = [mid_point3, mid_point2, point3]
    
            # 递归绘制三个子三角形
            draw_sierpinski_triangle(triangle1, depth - 1)
            draw_sierpinski_triangle(triangle2, depth - 1)
            draw_sierpinski_triangle(triangle3, depth - 1)
    
    # 绘制Sierpinski三角形
    initial_triangle = [point1, point2, point3]  # 初始三角形的顶点坐标
    depth = 5  # 递归深度
    
    draw_sierpinski_triangle(initial_triangle, depth)
    

    统计自相似分形(Statistically self-similar fractals): 统计自相似分形是指分形的各个部分具有与原始分形相同的统计特性。这意味着,无论是整个分形还是分形的任何部分,它们的统计特性(如平均值、方差等)都非常相似。统计自相似分形的特点是在统计上对分形的不同部分进行分析时,它们表现出与整体相似的统计性质。

    一维实例:基于分形模型生成山

    线段位于x轴,将线段在中点剖分,并将中点沿y方向移动一段距离,如此不断地剖分并且移动新得到的中点

    记$(x_i, y_i)、(x_{i+1}, y_{i+1})$为直线段的两个端点,则剖分后新生成的点$(x_{new}, y_{new})$为:

    Untitled

    $Random(•)$为[0, 1]之间的随机数,P(•)为一个控制随机量大小的函数,例如在第s步剖分中,$P(s)=2-s$

    Untitled

    最简单的分形技术就是按照一个算法把多边形的小平面细分,直到把每一个小平面划分 到所需要的精度,或细分次数达到某一预设值为止。细分时,可以取边的中点,并沿着此边的法向扰动,这样,原来的小平面就会细分为大量的更小的平面。每一个小平面相对于原始平面来说,都有一个随机的方向,物体的形状与原来不同,但保持一定程度的相似性。相似的程度由细分时扰动的大小决定

    Untitled

  • (3)Grammars

    使用产生规则生成几何模型的描述对于创建植物非常有用。

    产生规则是一种用于生成复杂模型的方法,它基于一组规则和初始条件。在创建植物的几何模型时,可以将产生规则应用于植物的分支、叶子、花朵等部分,以生成逼真的几何形状。

    举例来说,可以定义以下产生规则:

    1. 分支规则:从主干开始,根据一定的角度和长度生成分支。每个分支可以再次应用分支规则,形成更多分支,从而模拟植物的分支结构。
    2. 叶子规则:根据植物的类型和形态,定义叶子的形状和分布规律。可以使用几何参数(如叶片的长度、宽度、弯曲度等)来描述叶子的形态。
    3. 花朵规则:根据植物的特征,定义花朵的形状、颜色和排列方式。可以使用几何图形(如圆形、锥形、球形等)来表示花朵的形状,并结合颜色属性来增加逼真感。

    通过应用这些产生规则,可以生成各种植物的几何模型,包括树木、草丛和花朵等。可以根据需要调整规则的参数和条件,以获得不同种类和形态的植物模型。

4-3 多边形网络

  • 1、网格的存储与表示方法

    1)独立的面存储

    建立一个链表,链表中的每个元素为模型中的一个多边形,将模型中的所有多边形都存 储在这个链表中。每个面中存储该面所有的顶点及其坐标。图3.13给出了一个简单的例子。右图存储的是左图的信息。

    Untitled

    该方法的优点是存储简单。但其缺点较明显:一个顶点关联多个面,所以每个顶点的信 息会在多个面中存储多次,导致顶点信息冗余;在链表中没有存储任何点或者面的邻接信息。

    2)顶点和面存储

    这种存储方式首先建立一个顶点表格,将为每个顶点建立索引并将每个顶点的信息存储 在其索引对应的位置中;然后建立一个存储面的表格,每个面中只存储该面包含的顶点的索引

    Untitled

    在大型网格中通常每一个顶点大概被6个三角形共享。n个三角形,大概只有n/2 个顶点,减少了冗余信息的存储。但仍然没有存储任何邻接信息。

    3)邻接链表存储

    ①翼边数据结构

    以边为中心组织结构,用指针记录每一个边的两个邻面(左侧面和右侧面)、两个顶点,两侧各自相邻的两条邻边

    Untitled

    翼边数据结构还需要其他两个表格:

    • 一个存储顶点信息:存储和每个顶点关联的一条边
    • 一个存储面信息:每个面片包含的一条边即可

    Untitled

    Untitled

    ②半边结构

    半边是一条连接两个顶点并具有一个固定方向的线段,优点:几何元素之间的互相查询十分方便

    Untitled

    每个顶点:

    • 三维坐标
    • 包含一个指向以该顶点为起始顶点的指针

    每条半边:

    • 相关联的顶点
    • 相关联的面
    • 逆时针方向与其邻接的下一条半边
    • 与其方向相反的另一条半边
    • (可选)逆时针与其邻接的前一条半边

    每个面:

    • 其边界的一条半边

    Untitled

  • 2、多边形网格总结

    多边形网格的优势包括:容易表示;数据结构简单;容易变换;性质简单;每个面只有一个法向量,容易确定内外侧;容易绘制;便于多边形填充和纹理映射,存在可以对其进行有效处理的算法和图形硬件支持等。

    多边形表示方法的不足之处是这种模型本质上是离散的,要求精度很高时会导致大量的数据,对物体做整体变形非常困难,人工地一个面、一个面地创建模型非常繁琐。

    (1)最常见的表面表示方法之一,用于表示三维几何物体的表面结构。它由一系列多边形(通常是三角形或四边形)以及与多边形相关的顶点和边组成。

    (2)快速渲染(Fast rendering): 多边形网格的结构和拓扑关系使其能够进行快速而高效的渲染,以生成逼真的图像。

    (3)处理操作(Processing operations): 多边形网格可用于执行各种几何处理操作,如细分、简化、变形等。这些操作可以改变网格的形状、分辨率或拓扑结构。

    (4)必须考虑不规则顶点采样(Must consider irregular vertex sampling): 由于多边形网格的顶点不规则分布,对其进行采样和处理时需要考虑顶点之间的不规则性,以确保准确性和一致性。

    (5)必须处理/避免拓扑退化(Must handle/avoid topological degeneracies): 拓扑退化是指多边形网格在某些区域出现异常或不一致的拓扑结构,如孤立的顶点、奇异的边或面片。在处理多边形网格时,需要注意并处理或避免这些问题。

    (6)表示(Representation): 多边形网格可以使用各种数据结构进行表示,如顶点数组、面片数组和边数组等。选择适当的表示方法取决于所需的操作效率和性能要求。

4-4 细分曲面

细分曲面(Subdivision surface),又翻译为子分曲面,可基于任意网格创建光滑曲面。 细分曲面定义为一个无穷细化过程的极限。

最基本的概念是细化。通过反复细化初始的多边形网格,可以产生一系列网格趋向于最终的细分曲面。每个新的子分步骤产生一个新的有更多多边形元素并且更光滑的网格。

细分方法有效处理了传统方法难以解决的问题,其主要特点可归纳为:对任意拓扑的适应性(arbitrary topology);可伸缩性(scalability);表示的一致性(uniformity of representation);数值稳定性(numerical stability);实现简单性(code simplicity)

  • (1)Catmull-Clark 细分

    开始时,初始的网格是一个多面体,称为控制网格 $M_0$,与所需的极限曲面有相同的拓 扑结构,细分规则是顶点和边的替代运算。经过一次细分,得到网格 $M_1,M_0$中一个有 n条边的面分裂成 $M_1$中的n个面,M1中的顶点是通过加权平均计算的。同样的细分规则作用到 $M_1$上,得到网格$M_2$,细分曲面就是不断应用细分规则,得到的网格序列$M_1,M_2,…,$极限

    面点:原来面上所有顶点位置的平均来计算:

    $$ V_f=(v_1+v_2+v_3+v_4)/4 $$

    新边点:

    内部边的边点:设内部边的端点为$v_0,v_1$,共享此边的两个四边形面分别为 $(v_0,v_1,v_2,v_3)和(v_0,v_1,v_4,v_5)$,那么此内部边对应的边点为: $V_e = \frac3 8 (v_0+v_1)+\frac1 {16} (v_2+v_3+v_4+v_5)$

    边界边的边点:设边界边为$(v_1,v_2)$,对于边点为中点

    新顶点:

    Untitled

    Untitled

    新的网格生成方法:将每个新的面点与原表面边的新边点连接起来;将每个新顶点与包围原顶点的所有原始边的新边点连接起来。这样就形成了四边形(不一定是平面四边形)。

  • (2)Doo-Sabin细分

    Doo-Sabin细分和Catmull-Clark细分方法均是由张量积的B样条曲面推广而来的,因此它 们主要是应用于四边形网格的细分。

    1978年,Doo和Sabin将Chaikin的二次B样条曲线的离散生成方法推广到任意网格上, 提出了Doo-Sabin细分方法,这是一种逼近的点分裂型方法,该方法在规则网格情况下,细分极限曲面就是均匀的双二次B样条曲面。

  • (3)Loop 细分方法

    对于三角形网格的细分,最早是由Loop在1987年提出的,称为Loop细分方法,它属于逼近的面分裂型方法。对于任意网格,可以通过三角化将该网格转变为三角网格后应用Loop方法进行细分。

  • (4)Butterfly 方法

    Butterfly方法是由Dyn,Gregory和Levin[Dyn1990]首先提出的一种定义在三角网格上的 细分方法,属于插值的面分裂型方法,即一次细分后,上一层网格的顶点均保持不变,只对每条边生成新边点(E-vertex)。与基于样条的逼近型细分方法不同,这种方法并不能生成分片多项式形式的极限曲面。虽然其细分极限曲面虽然在规则网格上是Cl连续的,但在度不为6的奇异点处却不能达到Cl连续。后来,zorin提出了改进的Butterfly方法,可以在任意三角形网格上生成e,连续的曲面。

注意前两个是对四边形网络的细分,后两个是对三角网络的细分。

Untitled

Untitled

第五章 真实感渲染

5-1 渲染的基本概念

计算机渲染的本质是将三维虚拟场景转化为二维图片。“虚拟场景”包括场景中的几何物体及其附着材质、光源、摄像机。“转化”则对应渲染方法,描述如何从摄像机看到虚拟场景,及虚拟场景如何在摄像机上成像。

Untitled

  • (1)渲染方法(光栅化与光线追踪)

    1)光栅化:

    对于虚拟场景中的每个面,依次进行四个步骤的计算:

    • 顶点着色:对面上的每个顶点计算其施加光照后的颜色
    • 投影:完成三维顶点到二维摄像面的投影变换
    • 光栅化:将投影后的几何图形变成光栅像素点阵形式的面片(fragment)
    • 面片计算:该面片像素与已计算的其他面片像素进行计算,典型的例如前后遮挡关系、融合等。

    光栅化优点:

    • 不考虑物体之间的相互关系,计算量小,利于高度并行,并获得主流GPU支持(实时渲染的代表)
    • 在游戏等场景应用广泛
    • 众多面向影视创作的真实感渲染引擎也普遍支持光栅化流程

    2)光线追踪:

    光线跟踪方法是动漫及影视特效真实感渲染的基础方法,该方法由摄像机(眼睛)发射光线,逆向跟踪光线在三维场景中的反射、折射传播过程, 主要涉及的步骤包括:光线生成,光线求交以及交点着色。

    • 步骤:

      (1)光线生成:

      • 主采样光线(primary ray):摄像机连接屏幕像素点
      • 计算光滑表面光照时的反射光线
      • 计算半透明物体光照时的折射光线
      • 计算阴影所需的阴影光线(shadow ray)

      (2)光线求交:

      • 计算一条或者一组光线与三维空间中面的交点
      • 建立空间八叉树、KD树或BVH树结构,加速求交过程

      (3)交点着色:

      • 使用某种着色模型计算交点的光照及颜色
      • 着色模型的描述方法较为经典的包括(BRDF或Shader)

    光线跟踪优点: 是一种全局光照方法,计算了物体间的相互影响,可以完美的渲染出镜面物体的反射、半透明物体的折射、面积光产生的软影等效果,渲染结果比光栅化方法更真实 光线跟踪缺点: 光线跟踪方法计算量较大。 随着图形加速卡性能的提升以及技术的进步,为光线跟踪方法应用到未来三维交互渲染领域中开辟了道路。

5-2 着色模型

无论是光栅化方法还是光线跟踪方法,都需要着色,即计算三维空间中点的光照与颜色 着色过程涉及到光源、物体的几何及物理属性以及着色模型

着色模型:

  • 双向反射分布函数(BRDF,Bidirectional Reflectance Distribution Function)
  • 可编程着色器(Shader)。

(1)BRDF

BRDF是一种物理的方法,通过物理公式计算光照,其中的一些参数值可以通过实际测量的方式获取,从而得到与真实场景一致的光照效果

Lambert光照模型--最为常见的BRDF模型

Phong模型--基于经验的模型 Lambert模型对高光现象无法模拟。因此,在Lambert模型的基础上设计了,来实现这种效果

在游戏等需要实时渲染的应用领域,BRDF着色模型的选择除了考虑实现效果外,还需要考虑更高的计算效率,以及能否简化计算并充分利用GPU架构实现;考虑直观简单的参数,支持美工方便地对BRDF材质的参数进行设置,提高BRDF设计使用效率。 在影视创作等对渲染真实度要求较高,对渲染时间没有实时性要求的领域,则需要对物体表面几何、物理属性仿真程度更高的BRDF函数 当难以找到数学形式描述的BRDF时,基于物理测量获得BRDF提供了另外一种途径。

(2)Shader:

Shader 支持设计人员通过编程的方式设计着色模型,其中Shader是一段小程序,可嵌入到渲染流程中,被渲染引擎解释执行。利用Shader方法可以实现BRDF简化模型,产生真实感效果,也可以交互的自行添加反射、折射等效果,根据需要调节光照。相比较BRDF,Shader 的着色效果依赖于设计人员的经验及编程能力,为设计人员提供了更多的自由,有经验的设计人员往往可以设计出视觉上更真实或更符合要求的效果。

典型的着色器语言包括

Renderman渲染器的支持的RSL(Renderman Shading Language)

Open GL着色器语言GLSL---可实时渲染

Direct 3D着色器语言HLSL--可实时渲染

Nvidia着色器语言cg等---可实时渲染

全局光照通常实现几类效果:

颜色渗透:颜色渗透是指在邻居的物体间颜色传递的现象,主要来自于多次间接反射。

环境遮挡:通过计算场景物体对当前计算点的遮挡程度来模拟光的衰减, 从而形成类似环境光照明的效果。

焦散:焦散线是凸形的透明物体或凹形的高反射物体表面对光线产生的聚焦现象,动荡的水面、玻璃球、陶瓷杯等,都会产生这种现象。

次表面散射:次表面散射是指光从物体表面某点进入物体,经内部散射,最终从物体表面其他顶点出射的光线传递过程

5-3 渲染方法

  • 1、蒙特卡洛光线跟踪

    蒙特卡洛光线跟踪是一种逆向光线跟踪方法,又称为光路跟踪(Path Tracing)

    该方法可以描述为

    (1)从视点出发,经过投影屏幕上的某个像素向场景发射一根虚拟的光线.

    (2)求光线与场景最近的交点。

    (3)递归跟踪:按照俄罗斯轮盘赌规则决定光线反射跟踪方向。

    (4)递归异常结束条件:光线与场景中的物体没有交点;跟踪层数达到设定的最大深度。

    (5)递归正常结束条件:光线与光源相交,取得亮度值.

    (6)重复前面的过程,把每次渲染出来的像素叠加混合,直到渲染出的结果达到满意程度。

    蒙特卡洛光线跟踪方法的主要优点是:

    基于物理的方法,光照细节上可以产生真实度很高的图像,无偏(无差错);

    算法简单,不需要分类处理反射、折射、阴影等光线;

    渐进优化:随着跟踪光路的增加,结果逐渐变好,可以随时中止;

    不需要点缓存、光子图等额外的缓存空间,适合处理带有面积光的复杂光照场景。

    蒙特卡洛光线跟踪方法的主要缺点包括:

    采样光线较少时,容易产生走样,通常影视作品对每个像素需要采样 4 千条以上光路, 计算时间非常长。

    使用蒙特卡洛光线跟踪方法不容易计算焦散现象,不容易计算由镜面反射或者规则透射引起的漫反射。

  • 2、光子图方法

    利用光子图缓存,实现反射、折射、焦散等效果

    发射光子: 由光源发射光子(10万以上),跟踪记录光子弹射路径

    **生成光子图:**利用空间八叉树或BVH树组织光子

    **利用光子图渲染:**由视点反向光线跟踪,计算交点光照时,利用光子图计算该点邻域光子信息,作为该点入射光

    优点:

    计算速度快,特别适合焦散效果

    缺点:

    需要额外的存储空间存储光子图

    在光子收集阶段,收集临近点的光子,引入偏差(下图)

    光子图在生成焦散特效时,需要为半透明材质生成焦散光子图,依赖人工经验

  • 3、基于点缓存的渲染方法-PBGI

    • 直接光照渲染,将渲染结果中;

      烘焙到三维点云

    (2)将邻近的点聚合成一个更大的点或球谐函数表示,将点云数据组织到八叉树加速结构中;

    • 最终渲染,在着色过程中,。

      利用点云烘焙数据计算环境对着色点的影响

    优点:

    非常适合表现色溢及环境遮挡效果,适合处理漫反射面之间的相互散射

    另外,PBGI 作为一种烘焙方法,在任意形状面积光、环境光照、光子映射的最终聚集、体渲染等方面都可以进行扩展应用。

    缺点:

    但 PBGI 对于有高光、半透明介质的场景难以适用,难以渲染焦散效果。

  • 4、基于图像的渲染

    利用照片和生成的图像,计算新视点,利用新视点计算结果图像

    建模简单 ,渲染速度快,很多时候可以获得较强的真实感

    IBR-阴影图

    优点:

    光源和物体的相互位置关系不变时,阴影图可重用,处理大量的静态物体

    缺点:

    因为需要为每个光源计算阴影图,不适合多光源场景

    阴影图精度不足时,会产生走样

5-4 真实感渲染引擎应用

实现真实感渲染功能的软件称为真实感渲染引擎 典型的渲染引擎产品包括:PRMan、3DeLight、mental ray、Vray、Arnold等 Maya、3ds Max等创作软件也提供了内置渲染引擎。

Untitled

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值