当前位置: 华文问答 > 游戏

为什么很少有游戏支持场景破坏?是因为技术问题吗?

2016-04-20游戏

策划: 这块石头,玩家要能砍碎,而且要有猛然崩裂之感。

程序: 现实中,物体受到冲击会碎成若干小块,在游戏里, 这种破碎效果是由物理引擎中的破碎系统实现的。

游戏物理引擎会模拟物体(刚体 RigidBody)的撞击,当撞击发生时,物理引擎计算出撞击的位置和冲量(作用在物体上的力在时间上的累积),将信息交给破碎系统,破碎系统判定是否需要破碎,如何破碎,如果需要,就将刚体切割和分解成若干合适的碎片,切割后由物理引擎继续控制碎片,模拟碎片在真实世界的运动。

策划: 具体讲讲,怎么切割的。

程序: 嗯,在往下讲之前,先给你科普一个游戏开发小常识,你知道面么?

策划: 我知道啊。

程序: ……你可能不太知道,我给你科普一下。

游戏中所有物体都是由面组成的,面越多,细节就越真实,但对性能的要求也越高, 因此游戏开发者需要不断平衡画面表现和性能消耗,用最少的面实现最优质的效果 (这方面塞尔达传说 旷野之息做得非常牛逼)

为啥牛逼,因为面少表现还好啊。
法线贴图(Normal mapping),一种模拟凹凸处光照效果的技术,可以在不添加多边形的前提下,为模型添加细节。
电脑配置差(划掉)性能优化不足的后果

好,进入正题。破坏系统在切割碎片的过程中,需要计算碎片刚体的质量属性和形状切割。

刚体质量属性即刚体的质量、转动惯量和重心,为的是尽可能真实的模拟碎片运动;而形状切割要保证碎片质量属性便于计算,且形状大小丰富,接近真实破碎效果。

除了要切割刚体的形状外,还要切割用于渲染的形状,切割渲染形状的面,可以在切割刚体的面上,增加一些细节,同时带上纹理和uv坐标,用于产生切割面的材质。

破坏向VR游戏【VR机器人】(VRobot),破坏效果只能说勉勉强强

策划: 一般什么时候切割碎片?游戏中实时生成么?

程序: 嗯,切割碎片一般有2种方案。

一种是预切割,在资源制作的时候制作好带贴图的碎片,在游戏运行时根据预先设定好的切割来分割。 此种方式在运行时比较节省运算量(视分割的碎片数和美术效果),但是无论玩家如何着力,分割的结果都是一样的,和真实情况有很大差距。

另一种是在游戏运行的时候做,实时生成符合当时条件的切割。 这种方法可以根据实际情况生成不同的碎片,比较接近真实世界的情况,但是运算量也非常大,容易引起游戏的卡顿,非常依赖机器性能。

策划: 在【我的世界】里,破碎生成的图形都是非常规则的,但真实世界中,破坏生成的碎片有大有小,边缘并不规则,而且还有细节,这是怎么生成的?

程序: 不错,破碎系统仅做切割和凸分解的工作,物理引擎本身不会对破碎边缘区做细碎的东西,最开始的破碎都是四边形、六边形等等,慢慢的添加一些细节。

这些细节,即不规则边缘的视觉效果,主要是在Shader着色器里去做,从渲染层面做出比较好的不规则效果。

对于实时大量破碎,就需要结合特效来做一些效果展示。比如一个很大的爆炸,基本上是破碎系统切割+特效,同时还要尽量减少切割,减少面数,否则依然会造成机器卡顿。

策划: 举个破碎系统的例子给我听听。

程序: 阿碧【彩虹六号:围攻】玩过吧,R6的破坏系统很nb,游戏中易碎材质(如木头、玻璃等)所组成的表面都能破坏,包括墙壁、天花板和地板等等。这些材质除了使用炸药也可以用枪击或近战攻击破坏,若墙面遭到加固则需要特殊的炸药方可击破。

策划: 这么nb的破坏系统是怎么做出来的呢?

程序: 请看R6物理程序员 @喝十八 的泣血陈述:

在R6里你可以在很多墙的任意位置开洞来创造新的视线。你闲着蛋疼甚至可以用枪挖个狗洞爬出去。这是这个游戏最大的创新。为了支持这种创新,开发团队经历的是彻彻底底的血泪史。 首先,我们讨论的是把墙在任意位置打破这种事情。要做到这一点,靠预先把墙切成几块是不行的。因此,所有的墙体破坏都是根据破坏力大小实时计算的。而R6的设计目标是在PS4这种垃圾上PVP模式下要能跑60帧。 其次,拆墙显然会影响到很多GAMEPLAY方面的事情。射击,物理系统,人物移动,AI,NAVMESH都要根据破坏系统的结果做出反应,这又是一个CPU黑洞。 最后, R6是个竞技向的联网FPS游戏,如何在各种网络条件下正确地同步所有初始条件,从而保证所有的玩家都能看见相同的破坏效果,这又是一个天坑。 同时,因为反作弊的需求,你需要把破坏引擎放在服务器上也执行一遍,导致R6非常非常非常烧服务器。R6各种坑爹BUG跟这个多少都有点联系,但是相比技术本身的复杂度和育碧愿意在这个游戏上投入的人力来说已经相当不错了。

策划: 最后一个需求。这是一堵很厚的墙,玩家要能在墙上持续挖洞,最后……

程序: