大家好,我是 AVGPlus 游戏引擎的开发者彬彬。上一篇开发者日志提到过,我们首次在 「LetsGal」(以下简称 "LG") 使用了自研的 Galgame 游戏引擎 AVGPlus.
除了基本的对话、存档、场景、立绘等基础系统之外,AVGPlus 在演出方面也下了很多功夫,这也是我们引擎的一个重要特色。本次很高兴来为大家介绍一下 AVGPlus 的粒子系统。
毕业于五山男子技校(华南理工大学)物理专业,大学期间逐渐发觉自己才疏学浅,被系内各路大神杀的片甲不留、嘴歪眼斜,自认为难以在此等众神云集的领域混出啥名堂,随潜心研究润学。
终于在毕业前一把鼻涕一把、泪连滚带爬的转了码,从此过上了上班工作下班也工作的快乐牲活。
〇、前言(碎碎念)
为什么第一份开发日志介绍的是粒子系统,而不是其他更核心的演出系统?由于粒子系统相对纯粹,他并不像其他诸如存档、对话等系统那样,互相之间的关系错综复杂,剪不断理还乱。
从这里开始,我认为至少对我来说算是 Easy Mode.
这套系统其实在年初就已经开发完成了,但直到今天才正式落成一篇能上的了厅堂的文章。
3月份时,我小范围内介绍过这套粒子系统的设计思路,并进行了成果展示。
当时写出来的文章,与其说是开发日志/技术分享,不如说更像是一份演讲大纲(而且当时确实是拿来做讲演的),处处充满了点到为止的意味。所以今天趁着休假无所事事,将这套演出系统的开发过程重新整理归纳,输出一份更加正式的文档,以供各位参考,欢迎各位斧正。
当然,在本篇中不会过多的涉及代码实现,主要有两个原因:
- AVGPlus 将作为一款开源引擎进行发布(截至成文日暂未放出),在此再大谈特谈代码实现,显得冗余累赘(也招人烦);
- 我认为对于介绍这套系统来说,描述清楚设计过程和设计思路,要比过多关注实现细节来的重要的多;
一、为什么需要粒子系统
一个优秀的嘎啦给幕,需要配合丰富的演出效果,除了人物本身的演出,一个值得关注的重点便是——环境效果。
一时半会找不到图,请脑补以下特效:
- 樱花飘落
- 落叶飞散
- 大雨滂沱
- 大雪纷飞
- 沙石漫天
- 萤火虫飞舞
想必大家多多少少都在某些 Galgame 中接触过类似场景,相对应的,这些场景所对应的游戏情节也大多令玩家印象深刻。
假设,这些场景并没有使用这些动态的环境特效,而是只使用几张静态 CG,相信在表现力和视觉冲击力上也会有所折煞。而对于玩家来说,这款游戏大概又会缺少几个难以忘怀的记忆点。所以,这些环境特效存在的重要性非常简单直接——提高游戏画面的表现力,提高玩家的游戏沉浸感。
上述所提到的所有特效,归根到底都可以抽象成真实世界中的粒子行为。而粒子行为,必然也可以由统一的物理模型来进行真实验算。
粒子系统便由此氤氲而生了。
二、成品展示
我们第一个实际应用的案例,便是「LetsGal」项目,本小节会介绍一些在 LG 项目中运用的案例。
雪中路灯(大雪)
这是一个非常适合使用粒子特效的场景,搭配「雪下了很久……」的文本和积雪路灯的 CG,游戏演出对玩家沉浸感的提升超过一般的纯静态 CG.
雪中列车(小雪)
转场后的小雪 特效配合上 Pan Camera 系统(后续有机会会介绍),使用 AVGPlus 提供的多种工具组合特效,从而呈现出更加生动的环境效果。
当然,既然是粒子系统,那么允许展示的粒子就不只有雪花一种。按照你的喜好,你可以将上面演示的雪花替换为其他任何图片——雨点、花瓣、萤火虫,You name it!
落叶
来自于 AVGPlus 引擎自带的案例,下面是一个落叶 🍂 场景的 Demo 示例:
可以看到,相比雪花,落叶的行为要稍微复杂一点。不同的落叶都拥有不同的初速度、角速度,来实现落叶在空中飘忽不定缓缓下落的效果。
同时,如果你仔细观察,你也可以看到,落叶的飘落方向实际上是朝向摄像头的,部分落叶在最后还会有轻微 “撞上” 摄像头的效果。
三、系统的开发思路
开端
AVGPlus 存在数十套不同功能的子系统。每套系统也大致都会有过从最开始的「这不是能跑?」到后期「Bigger, Better, Stronger」的阶段
粒子系统,自然也是其中之一。
粒子系统最初的起点,是早期简单实现过一版雪花特效:
可以看 到,第一版的效果实际上非常原始,只是简单的雪花图片飞过,透视和下落行为与实际我们能够观察到的雪花效果差距较大。
那么,怎样才能做到让我们的雪花与实际的雪花行为相似呢?
很简单,把现实中的物理系统照搬过来就行了!👍🏻
要来点动力学模型吗?
我们直接在 AVGPlus 中实现了一套独立的分子动力学模型,可以实时计算所有粒子在给定环境&状态下任一时刻的行为。以下是我们的模型所参考的物理特性:
需要照搬的物理参数:
- 物体质量
- 位置坐标
- 偏转角坐标
- 速度向量
- 角速度向量
- 施加给粒子的外力向量
- 施加给粒子的外力矩
- 空气阻力系数
- 环境引力/重力系数
- 发生随机行走的概率
- 随机行走向量
驱动这些参数的,除了经典的理论力学公式,我们还引入了简化的空气阻力计算,让你在显示雨点或是落叶时,都能有更真实的效果呈现。除此之外,我们也加入了随机行走的概念,这让我们的雪花或是落叶特效可以更真实的演绎出随风中乱流飘落的感觉。
当然,合理配置的行走参数,也可以帮助呈现在空中不定飞舞的萤火虫效果,至于模型的迭代方式,我们直接使用了 第一性原理(ab initio) 从头 计算,这也是计算凝聚态领域的一个经典应用。
由于是 AVGPlus 独立自带的动力学模型,这套系统的体量非常轻巧。
相比直接引入专业的科学模型,我们只关注 Galgame 游戏中可能使用到的、最核心的粒子效果,那些相对复杂但冗余的计算我们不会涉及。
除此之外,由于是我们自己实现的模型,开发者能更加快速、高效的使用它所提供的各种特性,这一点在下文的「开发者能做什么」板块中会有所介绍。
周期性边界条件
对于下落物特效,我们可能随时都要生成上百乃至上千个独立运动的粒子。一个显而易见的问题——如何处理大量粒子的复用,并保证粒子特效演出效果的稳定。
这在凝聚态物理学中早有解决方案:
周期性边界条件(Periodic Boundary Conditions, PBC)
这是一个比较专业的物理名词。
用比较朴素易懂的语言来讲:
假设系统是一个盒子,那么当任何一个粒子从盒子的右边界离开盒子,就必然有一个粒子以相同的速度矢量从左边界进入盒子,这样就可以只用一小块区域来模拟一个超大系统的粒子行为。
大型粒子系统中的「盒子」
实际应用在 AVGPlus 中,这里还会添加更多的细节处理,我们实际上在其中添加了更多的分布函数和映射公式来调整粒子演出效果,不过这部分比较枯燥乏味,在此就不展开讲了。
理论上,AVGPlus 是有能力将边界条件开放出来给用户,让用户自定义粒子生成区间。甚至也可以允许用户自定义分布函数,允许专业用户调试自己所期望的粒子分布效果。
不过,鉴于我们的开发时间紧任务重,并且这项开放功能也只是属于锦上添花,所以我们暂时没整(跑)。
如果以后有机会,可以考虑下开放这一自定义项。
伪 3D 渲染
当然,还有非常取巧,也是有特色的一点:
AVGPlus 的粒子系统并不是实现的 3D 渲染,而是 2D 仿 3D —— 我们的所有粒子实际上并没有在真正的 3D 空间中存在 Z 轴延伸,事实上,所有的粒子都是在同一平面的。
我们的所有粒子特性的计算使用的都是 3 维空间向量,在计算完成之后,我们通过一套投影公式,将 2D 平面上的粒子依据他们的全部属性,投射成他们在 3 维空间中摄像机视角下的样子。
为什么这样做?
很简单——如果一套投影公式就能解决粒子的渲染问题,那么只要粒子的物理属性是计算正确的,我们何必要在游戏内创建一个真实的 3D 环境呢?
四、开发者能做什么
任何符合宏观物理规律的粒子行为,你都可以使用这套系统来实现
没有实现粒子碰撞:不是不能,而是不想——几乎没有 Galgame 需要粒子碰撞这么特殊的演出效果。
没有实现复杂的流体力学效果:理由同上。
开发案例
再借由一个我们的测试 Demo,来展示开发者在实际使用 AVGPlus 粒子系统时可以使用的种种功能。我们来一起简单调试下上面展示过的落叶 🍂 场景:
直接修改粒子数量、环境重力、空气阻力
除了演示的配置项之外,合理的调整其它参数(例如风力,徐徐清风又或是猛烈的狂风)可以使你的特效更加灵活生动