浅谈游戏中的物理设计(3)
本篇文章是游戏中的物理设计的第三篇,之前的两篇文章简单写了一些常见的游戏中真实物理的模拟:抛物,碰撞,反射。真实世界物理规律无穷无尽,如果每个游戏的设计都要运用物理知识,那岂不是大大延长了游戏制作周期和开发难度?虽然现在游戏开发工具五花八门,大多数的物理行为都已经被写在了工具的模板中,随时可以直接调用进行模拟。但是,我始终认为,作为一个认真的游戏设计者来说,一定要“知其然”更要“知其所以然”,因为只有这样才可以真正了解自己所做的设计,并且真正会运用它们在每一个细节中,就算出现了错误或者BUG,也可以迅速定位到问题,并且懂得原理,知道如何来修复和优化。
本文想要写一下另外一个很常见的物理行为“切割”。
基础原理
“切割”行为,也可以叫做“分裂”行为,简单描述就是:一个质量为A、体积为V的物体,被外力(或内力)作用,分解成2个或多个部分:A1,A2…(体积V1,V2…)。并且满足:
l ∑An=A
l ∑Vn?V(体积之和不一定等于原来的V)
简单用示意图表示则如下图:
根据质量守恒定律,物体的质量是无论如何都不会发生变化的。物体的体积,则会由很多因素(表面积、温度等)所决定,可能造成分裂出来的多个物体体积大于(或小于)原物体的体积。
质量和体积,是分析的物体行为的两个主要参数,除此之外,还需要计算出分裂后物体的重心(根据物体的密度分布和形状所计算出来)
物体在被切割以后,分裂为多个物体,那么每个物体的运动状态可能都会各自不同,发生改变。然而要计算出每个物体的运动状态,主要根据就是上述的三个参数:
l 质量(用于计算子物体的密度、计算子物体的初始惯性状态,计算子物体的受力)
l 体积(用于计算物体的密度、分析物体的形状相关参数)
l 重心(计算重力,计算物体的翻转行为)
在真实世界中,一个物体的切割行为,往往涉及到很多周边计算,例如:一个木头被切割成两块,然后分别向多个方向倒下。这个过程就会涉及到:摩擦产生的质量损耗,碰撞产生的动量转移,空气阻力,重心变化,内能变化(燃烧和热),等等。
因此要在游戏中做到100%模拟真实物理,几乎是不可能的(也没有必要),所以游戏中的设计会在真实事件的基础上,删去一些影响比重较小的成分和参数(例如摩擦力和空气阻力),进行最大程度的简化,仅仅保留一个基本的物理数值模型,也就足够了。
计算模型举例
《水果忍者》
其实《水果忍者》这款游戏,严格意义上来说,并不算一个物理的模拟游戏,虽然在最基本的操作中,仅仅为一种手指操作的“切割”,但是实际的计算过程中,并未根据玩家即时的操作行为,产生与之真实对应的物理反馈,而是一切切割行为都已经预先设计好,计算好,在玩家操作的时候进行选择性触发而已。
举个例子:一个西瓜飞行在空中时,若玩家用手滑动,想要将西瓜切割成体积1:5的两个部分,但是实际操作的时候玩家会发现,无论自己真实如何操作,西瓜分裂成的两个部分都是预先已经被设定好的。
但是在切割类的游戏中,毫无疑问的《水果忍者》这款游戏应该是最广为人知并且最受欢迎的。简单的剖析一下,水果忍者主要的物理原理构成很简单,分为两个部分:
l 重力作用:完全不计算空气阻力,只考虑一个初始速度与重力加速度,每一个水果从飞行到落下的整个过程中,经历的状态变化为(如下图):
状态1:初始速度V0向上
状态2:V0逐渐减少(减速运动)
状态3:V0减为0(物体短暂静止)
状态4:物体开始向下运动(加速运动)
状态5:物体离开屏幕
在这个最基本的重力作用的过程当中,参数是非常好设定的,因为他与物体的质量无关(只有加速度影响),因此只有2个可控参数:
1.物体的初始速度V0
2.物体的初始抛射角度a
通过给不同的水果品种,配置不同的上述2个参数,则可以在游戏中看到各种各样的水果,以不同的角度和速度飞入游戏界面中,玩家在一种眼花缭乱中紧张地进行着“切水果”的操作,获得快乐。配置表随便举例如下图(仅为举例参考,请无视具体数据):
水果ID | 备注 | 初始速度V0 | 初始抛射角度a |
101 | 苹果 | 10 | 80 |
102 | 西瓜 | 5 | 90 |
103 | 梨子 | 9 | 75 |
104 | 菠萝 | 7 | 65 |
所有的计算公式,只有一个:理想状态下的抛物线公式。(感兴趣的朋友可以参阅我的本系列第二篇文章)。这个过程的计算还是很便捷的。
l 切割作用:
在《水果忍者》的切割设计中,将最核心的行为进行了简化:所有水果的切割,不是真实进行模拟的,而仅仅是一种预先设定的触发而已。
这种设计是有游戏的主逻辑所决定的:因为《水果忍者》的得分与过关方式中,与水果是如何切割分裂,切割后的部分如何落下并没有关系,玩家只需要简单的将水果切割掉,就可以得到对应的分数。在一种直接而快速的滑动操作中,得到酣畅淋漓的游戏操作快感。
因此这种简化设计是非常适合这款游戏的。
《水果忍者》的每一种水果,都被预先设计好:
l 切割后分裂成哪几个部分(绝大多数都被简化为2个,无论切割几刀)
l 分裂后的子部分,以何种方式向两边分开落下
甚至可以想象得到,游戏很可能使用了同一套公式和系数去计算所有的水果切割分裂后的飞行状态。意思就是,为了计算的简便,无论哪一种水果(无论体积大小),被切割后都是同样状态的两个子部分(在同一套公式下计算)飞行而落下。
假设(不考虑是否有意义),要适当增加这款游戏的一些物理真实性的话,可以复杂一下算法。可以加入玩家真实切割操作的反馈,并且对应这种反馈对应计算。那么在这种设计下,每个水果的属性配置表,就会相对要复杂一些了,除去上文中的重力相关参数字段,其他的配置属性可能如下表:(仅为个人设计,可能还有更多属性,仅供参考)
水果ID | 备注 | 体积 | 最大被切割次数 | 最小分裂体积占比(极限值) | 质量 |
101 | 苹果 | 5 | 3 | 10% | 5 |
102 | 西瓜 | 15 | 5 | 10% | 10 |
103 | 梨子 | 8 | 3 | 10% | 6 |
104 | 菠萝 | 10 | 4 | 10% | 8 |
需要用到的公式:
l 重心计算公式:只需计算2维几何重心即可。(通过分割后的几何形状、体积、质量计算得出位置,)在此就不再列举出具体公式的计算过程了,百度即可。因为后面的旋转计算中,需要用到“重心”这个参数。(举例:如果切割掉香蕉的某个部位,真实情况下,很可能一部分的香蕉自身旋转着落下)。注意:重心可能在物体上,也可能在物体外哦。
l 受力分析公式:假设玩家的“切割”操作,是一种外力,那么可以赋予所有这种操作一个固定的外力值F,由于力的矢量性,因此可以根据玩家在不同角度划过屏幕的时候,做出不同的受力分析(玩家不同方向的切割,对水果的分裂状态变化也是不同的)。水果在分裂瞬间仅仅受力为两个:切割力F,重力mg。因此受力分析也是比较简单的,使用同一个公式即可实现
l 物体的自身旋转公式:玩家在切割的瞬间,水果具体分裂成哪两个(或多个)部分,是由玩家切割的位置和方向所决定的(可能1/2和1/2,也可能1/10和9/10)。两个分裂的部分,在受力的瞬间,都会受到一个“角速度加速度”,让物体发生自身的旋转(这个也是在真实世界中存在的现象,物体会围绕自己的重心进行旋转),物体的旋转角速度计算公式也是需要的。
在上述固定公式下,配合所有种类的水果的各项属性,基本可以较为真实的模拟出在“切水果”的过程中,被切割的每个水果会做出类似真实世界中的一些物理反馈。虽然对游戏本身的计算和输赢没有什么影响,但是至少会让玩家感觉更加真实一些。
结束语
这篇文章(还有之前的两篇同系列文章),笔者都尽力结合自身的游戏设计经历给大家提供一些思路,或许有帮助或许帮助不大,但是我最想要表达的想法其实可以用一句话去概括:无论游戏设计的工具如何便捷如何智能,作为一个游戏设计者,应当永远保持一颗探究所有设计原理的初衷。
我觉得这样才可以将玩家的用户体验分析到细微处,在完成游戏的制作后,也会得到一种莫大的成就感。这种成就感,是当今模板化、IP化、快餐化游戏行业中所泥足珍贵的。