惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Visual Studio Blog
Stack Overflow Blog
Stack Overflow Blog
G
Google Developers Blog
Microsoft Azure Blog
Microsoft Azure Blog
Engineering at Meta
Engineering at Meta
L
LangChain Blog
T
The Blog of Author Tim Ferriss
J
Java Code Geeks
Y
Y Combinator Blog
月光博客
月光博客
雷峰网
雷峰网
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
F
Fortinet All Blogs
A
About on SuperTechFans
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
P
Proofpoint News Feed
小众软件
小众软件
H
Help Net Security
Last Week in AI
Last Week in AI
B
Blog RSS Feed
宝玉的分享
宝玉的分享
N
Netflix TechBlog - Medium
博客园 - 叶小钗
The GitHub Blog
The GitHub Blog

机核

游戏性能旗舰最强之选,一加 Ace 6 至尊版国补到手价2999元起 6元钱自己更换电动车刹车线 《生化危机9:安魂曲》编剧Haris Orkin专访 摸金游戏?音乐游戏!暗区新赛季这把能弹的琴有何来历? 好评国产武侠SRPG《息风谷战略》免费DLC现已推出 | 机核 GCORES 碎片 《生化危机:安魂曲》将于5月实装首个免费更新内容 | 机核 GCORES 新锐东方游戏,谱写世界新章! 沉浸式恋爱视觉小说游戏《心象演算》免费试玩版现已正式上线 | 机核 GCORES 互动影游《代号三国:龙起》上线!穿越三国与曹操并肩、与佳人同行、与权谋博弈! 《老头收集梦想生活》,游戏酒桌会6,录音笔VOL.689 | 机核 GCORES 破界·共生——《白日梦:无限世界》五大核心游戏特点解析 价格已到史低,锐龙5 9600X/锐龙7 9700X正适合抄底 时间循环之旅即刻启程!《归环》一周目测试今日开启 热门在线韩游变魂游,洛奇衍生作能否打破“花瓶”魔咒? LG UltraGear evo 全新高端显示器系列:当“5K”遇见“AI”,不止强大,更懂热爱 反套路三国互动影游《代号三国:龙起》今日上线! 愿望单登记人数突破10万!备受瞩目的“女儿养成游戏” 《梦幻魔法公主》今日于Steam平台上线!限时八折优惠中 《黑神话:悟空》全球音乐会2026巡演将于4月29日12时开票 | 机核 GCORES “Snowguelike”生存肉鸽挖矿新作《蛙穿雪境》公布发售日期,5月7日正式上线 | 机核 GCORES 重塑移动办公、AI创作新境!全新华硕灵耀Air系列、ProArt 骁龙版震撼首发,创芯未来 均分88:《Saros》媒体评分汇总 | 机核 GCORES 上海烛龙公布合作遗迹探险游戏《吉时已到》首支预告片 | 机核 GCORES 首个独立游戏《萝薇日记》已上线Steam! 烛龙新IP《吉时已到》首曝,打造国内首款中式合作遗迹探险游戏 喜加一:《暗黑破坏神Ⅳ》国服现已开启限时免费领取本体活动 | 机核 GCORES 新版《生化危机》电影定于9月18日上映,官方网站现已上线 | 机核 GCORES 《冲就完事模拟器2》“星球大战”联动DLC正式宣布 | 机核 GCORES SteamController将于5月4日发售,售价99美元 | 机核 GCORES 事已至此,内存这么用也算省钱了,“2+1”非对称双通道应用实测
2D游戏非物理湍流火焰&粘性焦油模拟:正态分布叠加柏林噪声进...
呃呃我不好说 · 2024-04-25 · via 机核

《最终幻想7 重制版》使用“湍流火焰”与“逃离混沌”的前章标题呼应,《死亡搁浅》的非牛顿流体焦油又如何模拟。Haar小波重构出Haar的移动城堡,肯·柏林拿下奥斯卡技术成就奖,Daubechies太强以至理解不能。最终只是实现这样的效果:分形湍流火焰面

Haar的移动城堡?

或蒸汽朋克风格的锯齿火焰面(结合麦克斯韦弹性齿轮惰轮电磁场模型,从底层原理出发构建“纯齿轮的蒸汽朋克”)

粘性焦油面效果

最终幻想7重制版,是逃离混沌还是踏入混沌的“湍流火焰”?

计算机图形也要与修拉和梵高一决高下

What I cannot create, I do not understand.

Richard Feynman

1 概述

“艺术就是爆炸”,爆炸伴随燃烧。它们都是各种娱乐作品里的常客,也多是作品体验过程中的高峰。与水体模拟类似,火焰模拟在计算机图形学和电子游戏、影视特效制作中必不可少。20世纪80年代初,Reeves首次将粒子系统引入计算机图形学的实际应用,在电影《星际迷航II:可汗怒吼》(Star Trek II: The Wrath of Khan, Paramount Pictures 1982)中成功模拟火墙效果。

在最终幻想7重制版(Final Fantasy VII Remake,SQUARE ENIX 2020)最终决战前、命运的岔路口处,刚刚经历第17章名为“逃离混沌(Deliverance from Chaos)”的主角团们,不得不再次踏入象征混沌的“湍流火焰”,非常巧妙的呼应(当然这里并非真的火焰,只是具有湍流火焰的流动特征)。在死亡搁浅(Death Stranding, Kojima Project 2019)中,焦油作为冥滩出现在现实世界的副产物之一,也属于死亡搁浅世界观下的标志性物质,它的高粘性从游戏中也能略窥一二。

对于追求分辨率和帧率的玩家而言,湍流火焰的高度无序和粘稠焦油的非牛顿流体特性使得二者较难基于物理实时模拟。2002年斯坦福大学的Nguyen等人提出基于物理的火焰模拟方式,使用当时较为先进的奔腾IV处理器,模拟图1.3右侧的火焰效果,每帧的模拟成本也需要3分钟左右的时间。考虑到如今算力的飞跃,也许小规模的物理火焰能够做到实时模拟,但随着三维模拟分辨率的增加,计算复杂度至少以O(n3)的速度增加。与之相比,Lamorlette和Foster为电影《怪物史莱克》(Shrek, DreamWorks SKG 2001)设计出一种以曲线为骨架的非物理火焰模拟方式,实现图1.4左侧的效果只需使用奔腾III处理器每帧渲染2.7秒。

以下采用非物理方式模拟火焰,使用正态分布函数当作火焰基底,叠加柏林噪声表示湍流火焰的随机脉动。Mandelbrot创立分形理论并应用于模拟雪花山脉河流等自然景观,Gouldin将其引入湍流火焰面的几何形状描述并建立了一个预测湍流火焰速度的模型。Daubechies D4小波具有分形特征,可通过小波变换来实现火焰的分型结构的模拟。而焦油面需要更平滑的效果,通过改变方差使基底扁平化,再使用Vaidyanathan小波重构。

2 柏林噪声

2.1 基本思想

现实世界在视觉上是复杂的。如何在计算机图形学中实现真实感,就是如何从合成的图像中再现这种复杂性。自然的视觉复杂性(Naturalistic Visual Complexity)由非线性函数的组合中产生,而不是传统的纹理映射或生长模型算法。基于以上思想,柏林(Ken Perlin)在1982年为《电子世界争霸战》(Tron, Disney 1982)工作期间,为生成自然的纹理效果开发出新的噪声算法,并于1985年正式发表,即柏林噪声。柏林认为一个好的随机函数应当具有以下特征:

1) 旋转下的统计不变性。无论怎样转动它的域,它都具有相同的统计特征。

2) 频谱上的窄带通限制。它在一定狭窄的尺寸范围内没有过大或过小的可见特征。

3) 变换下的统计不变性。无论对域进行怎样的变换,它都具有相同的统计特征。

对于柏林噪声,它还具有噪声数值连续、没有间断点的特点。1989年Perlin与他的学生Hoffert使用基于柏林噪声的Hypertexture来模拟火球。柏林噪声也是如今游戏内生成地形、模拟火焰、云雾、水面等的方式之一。柏林本人也因为柏林噪声算法的贡献获得了1996年美国电影艺术与科学学院的奥斯卡科学技术奖。

2.2 具体算法

以二维柏林噪声为例。在空间平面内划分网格,赋予每个网格顶点一个随机的方向向量g[i,j],作为该点的梯度值。任取空间平面内一点(x,y),该点的噪声值,即为该点到四个顶点的距离向量v[i,j],分别与四个顶点的梯度向量做点积再加权的结果。其中距离向量为

用点积的意义是如果所选点到顶点的距离向量与这个顶点的梯度向量同向,意味着如果在现有点有一个小球,它从现在的位置到顶点是下坡,速度会增大;同理如果两个向量方向相反,说明从该点到顶点需要上坡,速度要减小;而当二者垂直则互不影响,速度不变。这恰好就是点积的意义(其实取负号也可以,小球速度换成小球的势能即可)。当(x,y)在网格内连续移动时,点积的值将平滑变化,因此噪声值也会平滑变化。

由于在网格内不同位置取点,它距离四个顶点的远近不同。选取的点离一个顶点越近,它受到那个顶点的影响就应该越小。因此仅有距离向量并不够,还需进行加权:

其中W为权函数。二维柏林噪声的加权结果为

权函数多取

分别对应线性插值和光滑插值,又称缓和曲线(Ease Curve)。对于顶点的梯度向量,有的约束其长度为1,此处采用单位圆约束,即一个顶点的梯度向量应当位于所在网格的单位圆内。部分柏林噪声的实现为增强随机性还需指标随机化取模查哈希表,还有改进版Simplex噪声和分形柏林噪声等,此处不考虑。

2.3 实现效果

2.3.1 1维静态柏林噪声

基于2.2节二维的算法,一维就是一条直线,不考虑单位圆约束条件,结果如图

2.3.2 2维静态柏林噪声

二维实现方式与2.2节算法相同,采用单位圆约束。结果如图

2.3.3 1维动态柏林噪声

一维动态柏林噪声是一系列一维柏林噪声沿时间方向推进演化的结果,需要额外增加一个时间变量并循环不断输出。但其实在时空图上看就是一个二维柏林噪声。因此可以直接使用二维柏林噪声,每次展示一行结果,沿时间向前推进来实现一维动态柏林噪声。

3 小波变换

3.1 基本思想

3.1.1 何为变换:Sam Porter Bridges

在死亡搁浅送快递的路上,动力装甲电量即将耗尽。恰好注意到前方高地处有一个充电桩,而山姆身上带着两把折叠梯。

此时大多数玩家的做法会是:向前方高地搭一个梯子,爬上高地到无线充电桩范围内充电,再搭一个梯子继续前进(也可以从原梯子处原路返回)。

变换就是Bridges。因为要充电,所以需要到高地,但又不能瞬移,所以需要经过梯子过去。梯子就是变换,充电就是对经过变换的东西的操作/处理,而再次经过梯子前进或返回就是逆变换。

3.1.2 傅里叶变换和短时傅里叶变换

为高效储存、传输数据,我们希望用尽可能少的量来表示一个数据。变换的目的是用一组确定的简单函数来表示复杂函数f(t),其中确定的简单函数就是基函数φn。对于正交基有

此时f(t)可表示为

系数为

因此f(t)就可以唯一用αn来表示,传递αn显然更有效率。基函数是确定的,接收方只需要用收到的系数αn和已知的基函数φn在本地重构回f(t)即可。周期函数进行傅里叶展开时选取的基函数为三角函数,对于非周期函数可视为周期T→∞,有傅里叶变换

经过傅里叶变换,时域的信号被变换至频域,能看到该信号中各种频率分量的含量。但对于非平稳信号,频率分量会随时间变化,而傅里叶变换只显示该信号含有哪些频率分量,但并不提供这些频率在何时出现的信息。这对于分析非平稳信号很不友好。并且用傅里叶变换得到的结果在时间上是全域的,它不能提供信号变化的局部图像。

为了克服这一缺点,Dennis Gabor在傅里叶变换中引入窗函数w(t),建立起短时傅里叶变换(STFT,也称窗口傅里叶变换)。此时使用一个窗函数在一个区间内提取数据,再计算该窗口部分的傅里叶变换。因此STFT可以捕捉到信号中的瞬时响应。

其中w*(t)为w(t)的共轭复数。对于窗函数w(t)还有其他限制,如窗函数在时域和频域的半宽度满足海森堡不等式

窗函数一旦确定,窗口的大小和形状就固定不变,其分辨率也随之确定。如果窗口取的较短,对于波长大于窗口宽度的低频区域,在频域的分辨率非常低。如果选一个长窗口,能量在较长的窗口宽度内被平均分配,它在高频区域时域的分辨率就很差。因此,如果一个信号由短时间的高频和长时间的低频组合而成,那么窗口函数就无法捕捉全该信号的重要信息。从(3.6)也可看出时域分辨率和频域分辨率的矛盾性。

3.1.3 小波变换

为了进一步弥补STFT的缺点,小波函数应运而生。在最简单的意义上一个小波可以被定义为一个衰减速度快且平均值为零的波函数。

小波变换表示局部的时间和频率信号,它比傅里叶模式更能有效地检测间断点。它的形状可以改变,在捕捉较低频率时变宽,而在捕捉高频时变窄。

小波变换仍沿用STFT中的瞬态窗口,但随着频率的增加的同时,增加时间分辨率,即令带宽与频率成正比。选定一个小波函数ψ称为母小波,通过对其伸缩和平移可生成一系列小波:

与窗函数对比,可见小波函数除了平移参数b,还有另一个可调的尺度参数a,因此能够实现窗口的改变。而连续小波变换为

连续小波变换存在一些缺点,如冗余和不实用的问题。而离散小波变换解决了连续小波变换的不足。它将计算限制在尺度参数和平移位置确定的离散网格上,而非整个域。常用方式为将(3.7)中的a和b分别取

此时小波离散为

对应的离散小波变换为

其中dj,k是小波系数。若小波系列能构成L2(R)空间的正交基,f(t)可重构为

与傅里叶变换、STFT相比,单个小波函数被定位在空间上,而正弦和余弦函并不被定位在空间上。小波在时域和频域都定位的特征,使许多经过小波变换的函数在转换到小波域时显得稀疏,很多系数都在0附近,因此小波变换常被用于数据去噪、图像压缩等领域。小波还有很多其他数学基础涉及到泛函分析、群论等,非所学专业不再展开。

3.2 尺度函数、小波函数和多分辨分析

以Haar小波为例引入小波变换中重要的基础概念:尺度函数和小波函数,介绍离散信号的多分辨表示。

3.2.1 尺度函数

对于信号x={x1,x2},定义其平均与细节分别为

使用平均a与细节d重构信号,有

因此a和d是原信号x={x1,x2}的一种表示方式。

考虑分段离散信号f(t)如图,

第一次取平均和细节

对于a1,0和a1,1还能再取一次平均和细节

同样,原信号也可以由a0,0、d0,0、d1,0和d1,1重构回来。

对于图3.7的信号,考虑使用最简单的常数函数来拟合。定义尺度函数

图像如3.8所示

若要拟合f(t),需要尺度函数的区间更短,如果Φ(t)只在[0,1/4)上那么f(t)的第一段就可以表示为f1(t)=x1Φ(t),t∈[0,1/4),第二段可视为Φ(t)在[0,1/4)上向右平移1/4个单位再与x2相乘。因此对尺度函数Φ(t)进行伸缩和平移变换(非标准化),有

为描述f(t)需要Φ(t)伸缩2次、平移3次,此时

现在能够使用经过伸缩和平移的尺度函数描述原信号f(t),但还需原信号本身的信息x1~x4。能否使用平均信息a1,0和a1,1结合尺度函数来表示f(t)?

假设有g(t)满足要求,

当t=1/8时,f(t)=x1,而g(t)=a1,0=(x1+x2)/2,并不相等。显然只用平均量a并不能重构回原信号,还需要引入细节量d。

3.2.2 小波函数

比较g和f的差别,可以发现g需要在[0,1/4)内加上x1/2同时减去x2/2,在[1/4,1/2)上相反,减去x1/2同时加上x2/2。而这加减的恰好是(3.15)式中的细节d1,0,只是在相邻两个区间内正负号相反。引入Haar小波函数ψ(t)

ψ(t)同样可以进行伸缩和平移(非标准化),

此时,f(t)就可使用平均量a和细节d,以及尺度函数和小波函数完整重构

3.2.3 多分辨分析

多分辨分析(Multiresolution Analysis)从函数空间特别是线性代数中内积空间、正交和、正交补、基等的角度出发进行分析。不去考虑纯数学的定义和推导,最简单来看多分辨分析是指在尺度函数(3.17)和小波函数(3.21)伸缩平移的过程中,j每增加1函数就缩短为原来的一半,此时k增加1产生的平移幅度就越小,即每次平移的分辨率就越高。而同一个信号,又可以用不同层级分辨率的尺度函数和小波函数来表示。如(3.22)使用第一层的平均和细节重构f(t),也可以使用第二层的平均和细节与第一层的细节共同重构(因为第一层的平均可以进一步分解为第二层的平均+细节):

如果信号更长,还可以继续分解下去。

不同尺度之间通过两尺度方程联系。显然尺度函数和小波函数满足

对于其他尺度同理。真正严谨的多分辨分析,还需参考教材深入学习。

4 2维火焰面和焦油面模拟

4.1 火焰面模拟

最基础的火焰形状在很多游戏中都出现过,如各种中世纪游戏中必不可少的火把,以及在黑暗之魂3(Dark Soul III, FromSoftware 2016)中常见的篝火火焰,可见基本形状与正态分布类似。

因此选择以正态分布函数为基底,线性叠加噪声来模拟湍流火焰的无序动态燃烧效果。参数a和b用于调控形状

湍流火焰锋面应当尖锐、粗糙而非光滑,可以考虑用柏林函数在低分辨率下线性插值,不做小波变换。火焰具有分形特征,也可以考虑对光滑表面做Daubechies D4小波变换构造分形火焰面。对于蒸汽朋克世界,如果处处都是齿轮,连火焰面都是锯齿也未尝不可,此时可以使用Haar小波变换。结合麦克斯韦的弹性齿轮、惰轮电磁场模型,可以从底层的齿轮架构电磁场开始构造纯正的齿轮蒸汽朋克世界。

4.1.1 小波变换效果

对于一个固定的柏林噪声波形,选择不同小波进行变换有不同效果。xy分辨率较低时去掉细节会使整体波形更平缓。用同样的细节层数重构,光滑小波比不光滑的小波重构出来的结果显然更光滑。图4.2~4.4的xy分辨率为0.5,使用线性插值。

D8小波比D4小波更光滑,从下方三张重构结果图片也可看出D8重构结果比D4更光滑。Haar小波本身就是锯齿形,重构出来的波形也一定有锯齿特色。这也是适合蒸汽朋克的原因。

而在高分辨率下,结合多项式插值,波形本身比较光滑。用不光滑的小波重构,其去掉细节的平均量会使波形变粗糙,向所使用的小波函数靠拢。图4.5~4.6的xy分辨率为0.05,可见去掉越多的细节,D4小波变换后的结果越粗糙。而本身光滑的Vaidyanathan小波效果相反。

因此对于火焰模拟有以下方式,一是低分辨率不进行小波变换,也可以进行Haar小波变换,另一种是高分辨率进行D4小波变换。

4.1.2 低分辨率无变换火焰

在(2.3)~(2.5)式中的权函数取线性插值,即(2.6)式。结果如下

4.1.3 低分辨率Haar小波变换

Haar的移动城堡、蒸汽朋克下的锯齿火焰,效果如下

4.1.4 高分辨率D4小波变换

xy分辨率为0.05,权函数用(2.7)式,通过Daubechies D4小波变换去掉3层细节:

可见重构后的火焰也具有了分形的特点。但这样非物理的简单模拟出的火焰看上去还是不够自然。

由于正态分布函数在远离轴的位置函数值很小,而柏林噪声函数在整个范围内均值不变,因此火焰图像有比较明显的上下波动。可通过对柏林噪声项加入阻尼函数来解决这一问题。

4.2 焦油面模拟

正态分布函数的标准差σ可以控制其图像的分散程度,如果σ较大则图像扁平,适合模拟有表面张力效果的水面。此时柏林噪声为水面上的波动如起泡等。少量的冒泡需要限制柏林函数在区域两端的值,因此(4.2)式改为

焦油面较为平滑、但也偶尔有少量起泡波动,所以xy分辨率要高、柏林噪声采用线性插值、小波变换使用更光滑的Vaidyanathan小波并去掉多层细节。

这样的水面模拟和火焰面模拟具有同样的问题,与上篇文章所述的浅水方程类似,自由表面都使用了表面函数假设的限制,同一个x位置不能出现两个函数值,因此无法模拟真正的起泡脱离表面、海浪卷起等效果。还可以将焦油面和火焰面结合,实现燃烧的焦油面效果,因为二者完全可以共用一套随机数。

5 火焰图片压缩

在上传gif图片的过程中,由于Daubechies火焰空间分辨率较高,生成的图片数量多,综合生成的gif图片过大以至于无法上传到网站。

因此需要对gif进行压缩。而gif图片为动图不好直接压缩,可从原始的1000张静态火焰图像入手,压缩后再生成gif,即可降低最终的gif图片大小。选择上课介绍过的EZW算法进行图像压缩。

5.1 基本思想

图像数据冗余基本可分为三类:空间冗余、频谱冗余(Spectral Redundancy)和心理-视觉冗余。空间和频谱冗余的存在是因为像素和颜色成分之间的某些空间和频谱模式相同,而心理视觉冗余源于人眼对某些空间频率不敏感的生物学研究,如视锥细胞和视杆细胞的数量差别。

而图像压缩的核心是减少图像数据中的冗余,以便只存储或传输最小数量的样本,并且仅通过这些样本,就能够重建在人类视觉感知下原始图像的良好近似。

大部分图像经过小波变换后,大量高频区域的小波系数较小或接近0,而低频区域小波系数普遍较大。较大的小波系数更重要,因此可以适当舍弃较小的小波系数,直接以0代替,从而节省空间实现压缩效果。

图片经过小波变换后还有一个特点,就是小波树中各级子带系数之间具有相似性。1992年,Lewis 和Knowles发现小波树状结构,在由同一方向和相同空间位置上的所有小波系数组成的小波树中,各级分解子带的系数中间存在很大的相似性。父节点小波系数较小,则其对应的子节点小波系数通常也较小。1993年,Shapiro提出了小波零树编码算法的改进算法,称为嵌入零树小波编码算法,即EZW算法。

5.2 EZW算法

算法流程图如下:

在压缩步骤通常包含三小步:(1)变换:将图片数据转换到小波域。(2)量化:每个小波系数被量化为一个字母。(3)熵编码:量化后的符号进一步压缩使比特率最小化。

一个原始数据的扫描结果有四类:(1)系数的绝对值大于阈值且为正,量化结果为P,正重要系数;(2)系数的绝对值大于阈值且为负,量化结果为N,负重要系数;(3)系数的绝对值小于阈值,且对应的所有子节点处系数的绝对值都小于阈值,量化结果为T,零树根;(4)系数的绝对值小于阈值,但子节点中存在绝对值大于阈值的系数,量化结果为Z,孤立零点。

初始阈值通常选取

剩余阈值通常设置为

扫描路径采取莫顿路径

扫描过程又分为5个步骤:选择阈值、主扫描、辅扫描、重新排序、输出编码信号。在扫描过程中,需要用一个主扫描表来记录输出结果。当一个系数的扫描结果为T时,它的所有子孙系数就不再扫描。主扫描结束后,需要在扫描结果为P或N的系数的相应位置加标记或将其系数置为零,以免在下次扫描时再次计入。

主扫描结束后,需要对主扫描表进行顺序扫描,以便对其中输出符号为P或N的小波系数进行量化,即为辅扫描过程。对于小波系数处于[Ti-1,1.5Ti-1)区间的系数,量化值为0,重构时幅值统一会被重构为1.25Ti-1。处于[1.5Ti-1,2Ti-1)的系数,量化值为1,重构时统一会被重构为1.75Ti-1。为便于设置下一次扫描所用的量化间隔,以提高解码的精度,需要对输出符号为P或N的数据重新排序。

编码器输出两类信息:一是给解码器的信息,包括阈值、主扫描表和辅扫描表;二是用于下次扫描的信息,包括阈值及重新排序后的重要系数序列。解码过程基本为上述编码过程的逆过程,包括接收编码器发送的解码信息、设置阈值、构造逆量化器来解读位流中包含的位置信息和小波系数信息。当达到所选扫描层数时,如果不需要进一步解码,退出解码器,用幅值等于或小于T/2的数值取代尚未还原的小波系数,最后用逆小波变换重构图像。

判断压缩质量好坏可用压缩比CR和峰值信噪比PSNR的值作为参考。压缩比显然为压缩前后的图片大小之比,而峰值信噪比表示信号最大可能功率和影响它精度的破坏性噪声功率的比值。

其中

为均方误差,I是大小为m×n的原始图像,K为包含噪声的图像。而MAXI为图像的最大像素值。

5.3 压缩效果

将直接生成的火焰图片先修改尺寸,改为512×512,选择2层分解、5层扫描,结果如下。

可见压缩后的图片大小变为原来的1/3,保持了较好的火焰图形细节,但缺点是丢失了颜色信息。

也可选择其他层数和扫描次数,但最终对比发现扫描次数低于5次时火焰边缘不够清晰,图片大小也并未减少多少。高于5次的细节添加已经难以分辨,没有必要。分解层数越高,同样扫描次数下重构的图片大小越小,但同样的画质也越低。为得到相同的质量重构时间就更长。

关于物理真实和视觉真实的讨论,可参考上篇水体模拟中的“记”,Fournier和Reeves有相当精彩的论述。此外Ebert等仍强调,"For entertainment applications, empirical accuracy is not the goal; visual verisimilitude is, and visual novelty might prove even more useful."

对于火焰模拟和水体模拟的区别,Lamorlette和Foster指出:"Fire on the other hand, is a dramatic element that requires the maximum level of control possible while maintaining a believable appearance. We expect fire to look complex and unpredictable, while at the same time having a recognizable structure according to the conditions under which it is burning. That complexity by itself makes direct numerical simulation of fire much less attractive than for other phenomena..."令人信服的火焰外形应当是不可预料的,但火焰动画又必须可控,按照艺术创作者的需要绽放。所以它不能是纯物理的,这样对创作者而言就缺少调整方式;它也不能是纯动画的,这样太不真实。本篇实现的分形火焰虽然看着像个火焰,但很缺乏真实性。也许基于上述内容可以加入一些物理的模拟构造出更逼真的效果。而焦油模拟的效果显然比火焰要好,实际上这两个效果都是基于完全相同的随机数种子生成的(取消了随机数生成器,改为输入一组固定数据)。这也是Lamorlette等看法的又一印证。

实际上在D4火焰效果实现后发现,早在2009年工业光魔公(Industrial Light & Magic)的两位研究员Horvath和Geiger就已经将小波变换引入计算机图形学的火焰模拟过程:We augment the PIC/FLIP technique by using a simple wavelet decomposition on the velocity grid to produce multiple levels of detail. This allows us to amplify vorticity at multiple scales as well as accelerating convergence of the iterative incompressibility solution.他们的思路也是使用小波分解来增强火焰的细节,但包含物理求解不可压NS方程的过程,也有一套具体实现方案。他们使用NVidiaQuadro5600 GPU,每个切片的每一帧平均需要20秒来模拟。使用10个GPU,模拟通常需要2到4个小时,渲染需要另外的1到2个小时。实现结果如图。

同样使用了小波变换,但不得不说Horvath和Geiger的实现结果与按本篇方案的效果相比简直没法比。

游戏创作就是艺术创作。不仅如此,更底层的计算机图形学也是艺术。Musgrave、Peachey和Ebert等对梵高、修拉的绘画作品与计算机图形学进行对比:"Good painters evoke worlds of color in a painting, and even in a single brush stroke. Van Gogh, who painted with a palette knife, not a brush, executed several paintings in the morning, took a long lunch, then did several more in the afternoon. Painting in a hurry, he didn't mix his paints thoroughly before applying a thick blob to the canvas. Thus each stroke has a universe of swirling color within it. Seurat's pointillism is another form of what painters call juxtaposition, or the use of a lot of different colors to average to some other color. This is part of the visual complexity that, to me, distinguishes good paintings from most computer graphics."

确实,好的画家用一幅画,甚至一笔就能向观众唤起一个色彩的世界。如今AI取得了前所未有的飞跃,但距离真正的人、创作的人、理性的人、游戏的人,还差得远。

参考文献

[1] Ten Lectures on Wavelets, Ingrid Daubechies

[2] 《小波变换》课件,BUAA王海辉教授

[3] An Image Synthesizer, K. Perlin

[4] Hypertexture, K. Perlin, M. Hoffert

[5] Depicting Fire and Other Gaseous Phenomena Using Diffusion Processes, J. Stam et. al.

[6] Interactive Simulation of Fire, Z. Melek et. al.

[7] Particle Systems-Technique for Modeling a Class of Fuzzy Objects, Reeves, William T.

[8] A Technique for Art Direction of Physically Based Fire Simulation, A. Bangalore et. al.

[9] Physically Based Modeling and Animation of Fire, Nguyen et. al.

[10] Breeding Terrains with Genetic Terrain Programming: The Evolution of Terrain Generators, Frade et. al.

[11] A Fire Flame Simulation Scheme with Massively Parallel Processing, Byeong-uk Im et. al.

[12] The Fractal Geometry of Nature, Mandelbrot

[13] Directable, High-Resolution Simulation of Fire on the GPU, Horvath et. al.

[14] Laminar Flamelet Concepts in Turbulent Combustion, N. Peters

[15] Improving Noise, K. Perlin

[16] Generating and Rendering Procedural Clouds in Real Time on Programmable 3D Graphics Hardware, Hasan et. al.

[17] Introduction to Wavelet Transforms, Bhatnagar

[18] Generation of Augmented Bathymetry to Aid Development of Terrain-Aided Autonomous Underwater Vehicle Localization and Navigation Approaches, Heubach et. al.

[19] A Parallel Algorithm Using Perlin Noise Superposition Method for Terrain Generation Based on CUDA architecture, Li et. al.

[20] Texturing and Modeling: A Procedural Approach, Ebert et. al.

[21] 小波变换与图像、图形处理技术,孙延奎

[22] Wavelet Analysis: Basic Concepts and Applications, Arfaoui et. al.

[23] Wavelet Transforms, Kith and Kin, Shah et. al.

[24] Wavelets and Wavelet Transform Systems and Their Applications: A Digital Signal Processing Approach, Akujuobi

[25] 形象易懂讲解算法I——小波变换,https://zhuanlan.zhihu.com/p/22450818

[26] 从傅里叶(Fourier)变换到伽柏(Gabor)变换再到小波(Wavelet)变换,https://blog.csdn.net/jbb0523/article/details/42028587

[27] The Art of Fluid Animation, J. Stam

[28] Structural Modeling of Flames for a Production Environment, Lamorlette et. Al.

[29] Combustion Physics: Flames, Detonations, Explosions, Astrophysical Combustion and Inertial Confinement Fusion, Liberman

[30] Shapiro J M .Embedded image coding using zerotrees of wavelet coefficients

[31] Embedded Zerotree Wavelet Encoding, C. Valens

[32] Visually Improved Image Compression by using Embedded Zero-tree Wavelet Coding, Janaki R , Tamilarasi A

及格再放代码,不及格就重修