Presentation is loading. Please wait.

Presentation is loading. Please wait.

计算机动画 于金辉 CAD&CG国家重点实验室 2018/11/24 浙江大学.

Similar presentations


Presentation on theme: "计算机动画 于金辉 CAD&CG国家重点实验室 2018/11/24 浙江大学."— Presentation transcript:

1 计算机动画 于金辉 CAD&CG国家重点实验室 2018/11/24 浙江大学

2 用柏林噪声生成的云彩动画 2018/11/24 浙江大学

3 三维噪声函数 三维噪声函数noise()是一个被广泛使用的过程纹理函数,Ken Perlin曾用其生成了许多逼真的自然纹理。
三维噪声函数noise(x,y,z)是以三维空间点作为输入,以一标量作为输出的函数。 一个良好的噪声函数要满足以下三个性质: (1)旋转统计不变性 (2)平移统计不变性 (3)其频率带宽很窄 2018/11/24 浙江大学

4 实现方法 三维噪声函数noise()可以由多种方法生成,一种常用的方法是用傅里叶变换,该方法缺点是计算量较大。
85年Perlin提出一个方法,采用三维整数网格来定义噪声,在每一整数网格点(i,j,k)上定义一随机灰度值(0~255)作为该函数的值。非整数网格点出的函数值则通过三线性插值与该点相邻的8个整数网格点出的函数值得到。 2018/11/24 浙江大学

5 柏林噪声 噪声函数是一个用种子控制的随机数生成器,它以整数作为输入,基于该输入种子输出一个随机数.
如果输入同样的种子数两次,则生成两次同样的随机数.这一点对柏林噪声很重要,否则生成的柏林噪声无意义. 左图为一个噪声函数的例子.对应X轴不同点生成0到1的 随机数.对这些数光滑插值(右图)可以定义一个以非整数为参数的连续函数. 2018/11/24 浙江大学

6 通过幅度和频率概念说明 对于正弦波,其幅度是波峰的高度,波长是从一个波峰到另一个波峰的长度,频率是波长的倒数.
在随机函数例子中,红色点为定义在函数一定尺度上的随机值,其幅度是随机数最大值和最小值之间的差,其"波长"是从一个红点到另一个红点沿横轴的距离,其"频率"也定义为波长的倒数。 2018/11/24 浙江大学

7 生成柏林噪声函数 注意:不同的频率即对应不同的尺度。 如果取很多这样的连续函数,它们具有不同的幅度和频率
(左图),然后将它们叠加在一起就得到柏林噪声函数(右图)。 注意:不同的频率即对应不同的尺度。 2018/11/24 浙江大学

8 将柏林噪声扩展到二维 先将二维区域分成小方格,在方格节点上随机生成[0,255]的灰度值,然后用二线性插值得到。
用上述方法生成一系列二维噪声(左小图),将其叠加(右大图)。 2018/11/24 浙江大学

9 确定幅度和频率间隔 在上述例子中,后面噪声的幅度比前一幅下降一半,频率则为前面的两倍。这是最常用的间隔。
根据实际需要,当然可以采用其它间隔方式。 2018/11/24 浙江大学

10 引进符号定义幅度和频率 , 这里i是所叠加的第i幅噪声函数。引进persistence 可以方便地把频率和幅度和i关联起来.
2018/11/24 浙江大学

11 确定倍频程(Octaves) 连续叠加的每个噪声函数叫做一个频程。之所以叫做频 程是因为后面的频率比其前面的高一倍。比如音乐中的 八度。
在柏林噪声中叠加多少个频程要视需要而定。如果柏林噪声用于计算机屏幕上显示,则最高频率可达1个像素,频率再高,对应的噪声小于像素而无法显示。 2018/11/24 浙江大学

12 柏林噪声中的插值 (1)线性插值:速度快,结果差。 (2)三次样条插值,结果光滑,但比线性插值速度慢。
因为插值有多种方式,在视觉效果上有些插值方式好于另一些插值方式。下面考察两种方式。 (1)线性插值:速度快,结果差。 (2)三次样条插值,结果光滑,但比线性插值速度慢。 2018/11/24 浙江大学

13 噪声平滑-1D 即三项高斯平滑 前面的插值是为了填补不同频程上(波长)两点之间的空缺点的值。
噪声平滑是把噪声函数的输出(即经过前面插值后的输出)进行平滑,使其看起来随机性少一些,并减小图像中的方块效应。 对于一维噪声曲线,可用下式平滑 即三项高斯平滑 2018/11/24 浙江大学

14 噪声平滑-2D 对于二维噪声,可用下面伪代码平滑 corner side center 2018/11/24 浙江大学

15 整合所有步骤-一维柏林噪声 function Noise1(integer x) x = (x<<13) ^ x; return ( ( (x * (x * x * ) ) & 7fffffff) / ); end function function SmoothedNoise_1(float x) return Noise(x)/2 + Noise(x-1)/4 + Noise(x+1)/4 2018/11/24 浙江大学

16 整合所有步骤-1D柏林噪声伪码 function InterpolatedNoise_1(float x) integer_X = int(x) fractional_X = x - integer_X v1 = SmoothedNoise1(integer_X) v2 = SmoothedNoise1(integer_X + 1) return Interpolate(v1 , v2 , fractional_X) end function function PerlinNoise_1D(float x) total = 0;p = persistence;n = Number_Of_Octaves – 1 loop i from 0 to n frequency = 2i ;amplitude = pi ; total = total + InterpolatedNoisei(x * frequency) * amplitude end of i loop return total 2018/11/24 浙江大学

17 2D柏林噪声伪代码 2018/11/24 浙江大学

18 2D柏林噪声伪代码(续1) 2018/11/24 浙江大学

19 2D柏林噪声伪代码(续2) 2018/11/24 浙江大学

20 柏林噪声与高斯噪声 Perlin噪声(不完全随机) 高斯噪声(完全随机) 2018/11/24 浙江大学

21 二维柏林噪声的应用 地形地貌 云彩 2018/11/24 浙江大学

22 柏林噪声的应用-纹理 2018/11/24 浙江大学

23 三维柏林噪声 可用于生成云彩动画。用柏林噪声生成云彩需要现仔细观察天上的云彩。 1.太阳发光,非常明亮。 2.靠近太阳的云彩比远处的
云彩更亮。 3.云彩有时遮挡太阳,这时容易看到云彩。 4.云彩在空中运动变化。 5.空中有些地方有云彩,其它地方没有。 6.很远处的云彩被雾霭模糊。 2018/11/24 浙江大学

24 生成柏林噪声 从实时考虑选用4个频程的柏林噪声,它们对应纹理大小是256X256,128X128, 64X64 ,32X32,见左图。
将它们叠加:CloudMap = Map1 + (Map2 / 2) + (Map3 / 4) + (Map4 / 8),得到右图结果。 2018/11/24 浙江大学

25 有云和无云区域控制 用一个简单的函数把纹理分成有云和无云区域,这里指数控制云彩边缘的渐变亮度。 这里v是云彩纹理图像上某像素的值,CloudCover需赋值,如85;CloudSharpness也需赋值,如0.5(不能超过1)。 2018/11/24 浙江大学

26 控制后的结果 参考代码地址: 1. noiseframe.cpp 2. 2018/11/24 浙江大学

27 云彩动画 即对两个噪声图插值. 四个频程的噪声图要用不同速度插值,具有最大幅度的要用最慢的速度。 2018/11/24 浙江大学

28 用柏林噪声生成的云彩动画 2018/11/24 浙江大学

29 可以进一步推柏林噪声进行抻拉、着色或者变形,以拓广其应用范围
2018/11/24 浙江大学

30 位移 添加位移可以改变多层柏林噪声叠加的效果 引进不同的位移速度可以产生不同的动画效果
We use the turbulence texture to phase shift the domain of the flow in y (vertically) colorMap(y + F(x,y,z)) 参见: 2018/11/24 浙江大学

31 Ken’s Academic Award http://mrl.nyu.edu/~perlin/doc/oscar.html
2018/11/24 浙江大学

32 C code for Perlin noise 2018/11/24 浙江大学

33 湍流函数 Perlin的湍流函数由一系列三维噪声函数叠加而成,其一般表达式为:
其中P表示一纹理空间点(x,y,z),k为满足下列不等式的最小整数。 2018/11/24 浙江大学

34 湍流运动模拟 为了使纹理细节随时间变化(如火焰),进而实现过程 纹理的运动,一个自然的想法是在湍流函数中引进时 间变量。即构造一个四维噪声函数。 首先在三维空间构造一个整数网格结构,四维噪声函 数noise(P,t)在每个整数网格点(i,j,k,l)的取值为一随机 灰度,非网格点处的值由四线性插值函数计算得到。 2018/11/24 浙江大学

35 火焰动画 火焰的基本形状,由动画师根据场景需要设计(左图),将其围绕Y轴旋转,得到一个火焰单位(fire unit,右图)
2018/11/24 浙江大学

36 将火焰形状、柏林噪声进行抻拉变形,用火焰形状作为模板对柏林噪声进行显示。
2018/11/24 浙江大学

37 火焰色彩分布 将火焰定义在长方形区域内,引入湍流函数,火焰的动态色彩分布函数为
flame(P)=(1-y/h)flame-color(|x/b|) y - b b x y∈[0,h]. x ∈[-b,b]. x=0时达最大值。 x=-b,b时为0。 2018/11/24 浙江大学

38 引入湍流函数后火焰色彩 将火焰定义在长方形区域内,引入湍流函数,火焰的动态色彩分布函数为
显然,火焰动画取决于turbulence(P,t)函数。 为便于理解,考虑二维柏林噪声,其中一维是时间。 t=t1时对应一个一维柏林噪声, t=t2时对应另个一维柏林噪声, 如果t1和t2足够密集,则两个噪 声之间近似连续变化。 t1 t t 2018/11/24 浙江大学

39 火焰动态控制 考虑三维柏林噪声,其中一维是时间。 t=t1时对应一个二维柏林噪声, t=t2时对应另个二维柏林噪声,
声之间近似连续变化。 t1 t t2 火焰动态控制(加位移) ,表示火焰运动方向 2018/11/24 浙江大学

40 火焰动画模拟结果 2018/11/24 浙江大学

41 基于物理的火焰模型(2002) 用纳维-斯托克斯方程求解
2018/11/24 浙江大学

42 火焰和其他物体之间的交互作用 横穿火焰物体被引燃 2018/11/24 浙江大学

43 水波纹理 动画视频 2018/11/24 浙江大学

44 水波纹理 模拟水波最简单的方法是正弦波叠加,该方法的突出优点是非常容易实水的波动,但只能合成小振幅水波。
常用的水波函数有平行水波以及同心扩散水波 2018/11/24 浙江大学

45 平行水波:从熟悉的正弦函数开始 y=A*sin(ωx+φ�)
上述公式不能表现波的运动.再考察下面具有不同初相位的正弦曲线,对应波峰位置也不同 所以可以通过正弦曲线相位随时间变化来控制正弦曲线的移动: y=A*sin(ωx- φ t) 2018/11/24 浙江大学

46 平行水波纹理 平行水波纹理函数为 其中Ai为水波振幅,t为时间,(ui,vi)为第i个正弦波的前进方向,(Ci1,Ci2)为第i个正弦波的速度。 上述函数实质上定义了t时刻的水波高度场,当t连续变化时我们就得到了水波的运动。 2018/11/24 浙江大学

47 平行水波纹里函数 设n=1,则有 z(x , y)=A cos (u (x-C1t) + v (y-C2t))
若v=0, 则z(x , y)=A cos (u (x-C1t) ) 若u=0, 则z(x , y)=A cos (v (y-C2t) ) 其中 A为水波振幅,t为时间, (u,v)为正弦波的(合成)前进方向, (C1,C2)为正弦波的速度。 2018/11/24 浙江大学

48 多个正弦波叠加 在上述公式中有多个参数需要确定: 正弦波个数n以及 Ai, ui, vi, Ci1,Ci2.
2018/11/24 浙江大学

49 卡通风格水波 先用样条曲线生成风格化水波峰, 先用 生成一些峰点,然后在Hk,Hk+1之间添加一个凹点Hin,其幅度取
根据卡通风格水波形状(右上图)还需进一步对正弦波峰进行风格化处理。 先用样条曲线生成风格化水波峰, 先用 生成一些峰点,然后在Hk,Hk+1之间添加一个凹点Hin,其幅度取 对Hk,Hin,Hk+1用样条曲线插值得到BARCk,代表ballistic arc (像弹道的弧线). 2018/11/24 浙江大学

50 卡通风格水波 在主要正弦波中 利用 检测正弦水波峰线(图中), 然后刚才得到的BARCk对正弦水波峰线高度加权得到风格化水波峰形状(图右).
利用 检测正弦水波峰线(图中), 然后刚才得到的BARCk对正弦水波峰线高度加权得到风格化水波峰形状(图右). 2018/11/24 浙江大学

51 波峰白浪(white water)形状建模
波峰白浪形状可用两组ballistic arcs构建(左图).注意中间凹点是偏离两峰点中间位置的(如红色箭头示) 将检测的水波峰线位置映射到一张纹理图上(中图粉色线). 再将波峰白浪形状影射到纹理图波峰线上(中图). 最后将纹理映射到3D水波表面(图右). 2018/11/24 浙江大学

52 激起大浪的建模 先观察手工绘制的激起大浪序列,交互画出其结构,中间呈树状(红色),轮廓像树叶(蓝色).该结构随时间变化.
2018/11/24 浙江大学

53 浪花最大轮廓与树状结构建模 先用一三角形定义大浪的宽度W和高度H,然后添加两个点构成五边形,对其顶点用样条插值得到浪花可达最大轮廓.
将中间垂线分成m段,每段顶点作为树状分枝点,然后将其和轮廓线上对应比例位置点相连得到左面分枝,右面分枝用类似方法得到. 2018/11/24 浙江大学

54 浪花实际形状轮廓 在刚才五边形内用类似方法再构建一个高度降低的五边形,对其顶点插值得到一个曲线(如虚线示),
在曲线上寻找和树枝交叉点,在每两相邻点间再生成一些ballistic arcs得到实际浪花轮廓线. 2018/11/24 浙江大学

55 添加水滴 在每个树枝上从浪花实际轮廓交叉点到最外轮廓顶点添加垂直于树枝的短横线,短横线的长度用正弦函数加权,然后用样条插值得到水滴形状
水滴沿树枝向外运动. 2018/11/24 浙江大学

56 浪花内部空洞建模与控制 将浪花内部空洞分成几类,用特征点定义其大致形状,然后用样条曲线插值得到最终形状, 最后将它们放置在浪花轮廓内部.
2018/11/24 浙江大学

57 最后结果图 2018/11/24 浙江大学

58 复杂海浪动画视频 2018/11/24 浙江大学

59 同心圆水波纹理 同心圆水波纹理函数为 在形式上它与 z(x )=A cos (u (x- Ct) )类似.
其中r=(x,y)-(c1,c2)=(x-c1,y-c2), (c1, c2)为该同心水波的中心,C为扩散速度。 网上找到一个实例,采用了指数衰减, c2控制衰减快慢: z(x,y)=A*cos(k*sqrt((x^2+y^2))-Ct)/ exp((x^2+y^2)* c2) 2018/11/24 浙江大学

60 水波模拟效果 2018/11/24 浙江大学

61 纹波荡漾视频 2018/11/24 浙江大学

62 A survey of water animation (20 pages)
2018/11/24 浙江大学

63 References in the survey
2018/11/24 浙江大学

64 References in the survey
2018/11/24 浙江大学

65 Animating breaking waves
2018/11/24 浙江大学

66 2018/11/24 浙江大学

67 注意 2018/11/24 浙江大学

68 Animating water interaction
2018/11/24 浙江大学

69 2018/11/24 浙江大学


Download ppt "计算机动画 于金辉 CAD&CG国家重点实验室 2018/11/24 浙江大学."

Similar presentations


Ads by Google