浅谈游戏中的物理设计

2017年05月03日 16:18 0 点赞 0 评论 更新于 2025-11-21 21:23

在真实世界里,物理规律纷繁复杂。若每个游戏设计都要运用物理知识,势必会大幅延长游戏制作周期,增加开发难度。尽管当下游戏开发工具种类繁多,大多数物理行为已被编写在工具模板中,可随时直接调用进行模拟,但我始终认为,作为一名严谨的游戏设计者,不仅要“知其然”,更要“知其所以然”。唯有如此,才能真正理解自己的设计,并将其运用到每一个细节中。即便出现错误或 BUG,也能迅速定位问题,依据原理进行修复和优化。

本文将探讨另一个常见的物理行为——“切割”。

基础原理

“切割”行为,也可称作“分裂”行为。简单来说,就是一个质量为 A、体积为 V 的物体,在受到外力(或内力)作用后,分解成 2 个或多个部分,分别记为 A1、A2…(对应的体积为 V1、V2…),并且满足以下条件:

  • $\sum A_n = A$
  • $\sum V_n \neq V$(体积之和不一定等于原来的 V)

用示意图表示如下:

根据质量守恒定律,物体的质量不会发生变化。而物体的体积则受多种因素(如表面积、温度等)影响,分裂后的多个物体体积可能大于或小于原物体的体积。

质量和体积是分析物体行为的两个关键参数。此外,还需要计算分裂后物体的重心,该重心可根据物体的密度分布和形状计算得出。

物体被切割后分裂成多个部分,每个部分的运动状态可能会发生改变。要计算每个物体的运动状态,主要依据上述三个参数:

  • 质量:用于计算子物体的密度、初始惯性状态以及受力情况。
  • 体积:用于计算物体的密度,并分析物体的形状相关参数。
  • 重心:用于计算重力和物体的翻转行为。

在现实世界中,物体的切割行为涉及诸多周边计算。例如,将一根木头切割成两块,然后向不同方向倒下,这个过程会涉及摩擦产生的质量损耗、碰撞产生的动量转移、空气阻力、重心变化以及内能变化(燃烧和热)等。

因此,在游戏中要 100% 模拟真实物理几乎是不可能的,也没有必要。游戏设计通常会在真实事件的基础上,剔除一些影响较小的成分和参数(如摩擦力和空气阻力),进行最大程度的简化,仅保留基本的物理数值模型即可。

计算模型举例:《水果忍者》

严格来说,《水果忍者》并非一款物理模拟游戏。尽管其基本操作是手指“切割”,但在实际计算过程中,并未根据玩家的即时操作产生真实对应的物理反馈,所有切割行为都是预先设计和计算好的,玩家操作时只是选择性触发。

例如,当一个西瓜在空中飞行时,玩家想用手滑动将其切割成体积比为 1:5 的两部分,但实际操作中会发现,无论玩家如何操作,西瓜分裂成的两部分都是预先设定好的。

然而,在切割类游戏中,《水果忍者》无疑是最广为人知且受欢迎的。下面简单剖析其主要物理原理,它主要由两部分构成:

重力作用

游戏完全不考虑空气阻力,只考虑初始速度与重力加速度。每个水果从飞行到落下的整个过程中,状态变化如下:

  1. 状态 1:初始速度 V0 向上。
  2. 状态 2:V0 逐渐减小(减速运动)。
  3. 状态 3:V0 减为 0(物体短暂静止)。
  4. 状态 4:物体开始向下运动(加速运动)。
  5. 状态 5:物体离开屏幕。

在这个基本的重力作用过程中,参数设定较为简单,因为它与物体的质量无关(仅受加速度影响),所以只有两个可控参数:

  1. 物体的初始速度 V0。
  2. 物体的初始抛射角度 α。

通过为不同水果品种配置不同的这两个参数,游戏中就会出现各种水果以不同角度和速度飞入界面,玩家在眼花缭乱中进行“切水果”操作,获得游戏乐趣。所有的计算公式仅为理想状态下的抛物线公式(感兴趣的朋友可参阅本系列第二篇文章),计算过程较为便捷。

切割作用

在《水果忍者》的切割设计中,核心行为被简化。所有水果的切割并非真实模拟,只是预先设定的触发。

这种设计由游戏的主逻辑决定。因为该游戏的得分与过关方式与水果的切割分裂方式以及切割后部分的落下情况无关,玩家只需简单切割水果就能获得相应分数,从而在直接快速的滑动操作中获得畅快的游戏体验。

《水果忍者》的每种水果都预先设计好:

  • 切割后分裂成哪几个部分(绝大多数简化为 2 个,无论切割几刀)。
  • 分裂后的子部分以何种方式向两边分开落下。

为了简化计算,无论何种水果(无论体积大小),被切割后都是同样状态的两个子部分(在同一套公式下计算)飞行落下。

假设要适当增加这款游戏的物理真实性,可以使算法更复杂。加入玩家真实切割操作的反馈,并进行相应计算。在这种设计下,每个水果的属性配置表会更复杂,除去上文提到的重力相关参数字段,其他配置属性可能如下表(仅为个人设计,可能还有更多属性,仅供参考):

需要用到的公式

  • 重心计算公式:只需计算 2 维几何重心,可通过分割后的几何形状、体积、质量计算得出位置。具体计算过程可通过百度查询,此处不再列举。在后续的旋转计算中会用到“重心”这个参数(例如,切割香蕉的某个部位,真实情况下,部分香蕉可能会自身旋转着落下)。需注意,重心可能在物体上,也可能在物体外。
  • 受力分析公式:假设玩家的“切割”操作是一种外力,可赋予所有这种操作一个固定的外力值 F。由于力具有矢量性,可根据玩家在不同角度划过屏幕时进行不同的受力分析(玩家不同方向的切割会导致水果分裂状态不同)。水果在分裂瞬间仅受两个力:切割力 F 和重力 mg,受力分析相对简单,使用同一个公式即可实现。
  • 物体的自身旋转公式:玩家切割瞬间,水果具体分裂成哪两个(或多个)部分,由玩家切割的位置和方向决定(可能是 1/2 和 1/2,也可能是 1/10 和 9/10)。两个分裂部分在受力瞬间会受到一个“角速度加速度”,使物体发生自身旋转(这也是真实世界中存在的现象,物体会围绕自己的重心进行旋转),因此需要用到物体的旋转角速度计算公式。

在上述固定公式的基础上,结合所有种类水果的各项属性,基本可以较为真实地模拟“切水果”过程中,被切割的每个水果在真实世界中的物理反馈。虽然这对游戏本身的计算和输赢影响不大,但能让玩家感觉更加真实。

数据存储

笔者结合自身游戏设计经验,为大家提供了一些思路,或许有帮助,或许帮助不大。但我最想表达的是,无论游戏设计工具多么便捷和智能,游戏设计者都应始终保持探究设计原理的初心。

我认为,只有这样才能深入分析玩家的用户体验,在完成游戏制作后获得巨大的成就感。这种成就感在当今模板化、IP 化、快餐化的游戏行业中尤为珍贵。

作者信息

孟子菇凉

孟子菇凉

共发布了 3994 篇文章