【cn-stem】用upbge制作投石机模拟器

Words
1594
Reading
8 min
7y

今天说说,blender(upbge只是blender的一个分支)的物理引擎,一个是内置物理引擎,主要用于动画制作,具备刚体、软体、流体,例子,布料等多种模拟功能。另一个是游戏引擎中的bullet物理引擎,功能略少,但可以实时运行,非常适合在游戏中使用。这次我们就是用游戏引擎中的bullet物理引擎,这样可以做成游戏的形式,趣味性更强。这里我们要用到的是最基本的物理模拟——刚体模拟(rigid body)。所谓刚体,就是理想的,不发生形变的的物体。刚体间的主要互动方式就是弹性碰撞。

  • 一、投石机与杠杆原理

投石机的原理就是大名鼎鼎的阿基米德发现的杠杆原理,最形象的说明就是他的那句名言“给我一个支点,我可以翘起地球。”简单说,杠杆平衡的条件就是力矩平衡,力矩这个东西就是力量乘以作用点到旋转轴的距离。投石机的原理就是利用杠杆两端力臂不相等,而起到将力量放大的作用,达到远距离投掷重物的目的:

Image 10.jpg
图一:投掷端离旋转中心更远,起到将力量放大的作用。图片来源:本人制作截图;版权:CC0

我制作的这个投石机模拟是模仿配重是投石机,应该是阿拉伯人发明,文艺复兴以前古希腊的文明成就的主要继承者其实是阿拉伯人。应该说他们也是受了阿基米德学说的启发,后来,配重式投石机的技术被喜欢收拢工匠的蒙古人掌握,成为他们攻城略地,称霸欧亚的法宝。蒙古骑兵只是机动能力强,善于野战,但无法攻城。只有与投石机技术结合起来,才成就了蒙古帝国强悍的战力。这也是蒙古能攻占金国中都(北京),阿拉伯帝国的巴格达等固若金汤的名城的原因。当然最著名的战例,当属襄阳围攻战,忽必烈围攻襄阳数年不下,最后也是在配重投石机的帮助下,才最终攻克。此战配重投石机也给南宋军民留下深刻印象,被称为“回回炮”,也侧面说明了这一技术的来源。

  • 二、模型准备

模型非常简单,分别为锁链、配重圆柱,炮弹和投掷杆。投石机的木支撑架是做样子的,实际并不参与物理模拟。

  • 锁链与配重圆柱:
    Image 11.jpg
    图二:投石机配件模型一 来源:本人制作截图 版权:CC0

  • 投掷杆:
    Image 12.jpg
    图三:投石机配件模型二 来源:本人制作截图 版权:CC0
    投掷杆有三个环,第一个用来挂配重,第二个挂在固定悬挂环上,是旋转轴心,勺子底部的环挂在约束环上,防止提前发射,由玩家控制发射时机。

  • 炮弹:
    Image 13.jpg
    图四:投石机配件模型三 来源:本人制作截图 版权:CC0

  • 木支撑架
    Image 14.jpg
    图五:投石机配件模型四 来源:本人制作截图 版权:CC0

前面说了,这个只起装饰作用,不参与物理模拟。

  • 三、模型装配

  • 装配好的投石机模型:
    Image 15.jpg
    投掷杆勺子底部设置了一个固定圆环作为约束,在游戏中当玩家按下空格键后,约束环会消失,炮弹被发射出去。

  • 四、 物理属性设置

Image 17.jpg
图六,物理属性设置 来源:本人电脑截图

还是比较简单的,首先小球围绕大球那个图标就是物理属性设置页的标志。主要需要设置如下几项:

    1. 物理类型,一般参与物理模拟的部件,类型选为刚体(rigid body),悬挂环,和下方的约束环因为是固定部件,所以类型选为固定(static)
  • 2.质量,这个不用多说。就是电脑进行物理模拟也是一种权衡,并不能完全模拟出真实事件,模拟效果越真实,CPU资源消耗越大,反应越慢,所以质量这个值需要不断调整获得最佳的效果和可以接受的性能。

  • 3.碰撞边界,对于比较简单的物体可以选,正方体,球形等基本形状近似,以提高模拟性能。不过我们想尽量真实的模拟出投石机,所以这里选最耗资源的外形网格(Mesh)。

  • 五、 重新装填

为了更有趣味,我在对面搭了一个砖墙,具体搭建方法,可以看我参考资料中给出的视频教程。投石机一般一发炮弹还砸不塌这堵墙,只能砸出一个洞。这个时候需要补一发。这个时候需要将投掷杆,配重复位,并重新装填炮弹。
复位功能通过脚本实现,就是将个部件初始位置,方向等以矢量的形式重新赋值回去:

def reset(cont):
    obj=cont.owner
    obj.worldPosition=(obj['posX'],obj['posY'],obj['posZ'])
    obj.worldOrientation=(obj['rotW'],obj['rotX'],obj['rotY'],obj['rotZ'])
    obj.worldLinearVelocity=(0,0,0)
    obj.worldAngularVelocity=(0,0,0)

obj['posX'],obj['posY'],obj['posZ']以属性(property)的形式设置在控制器里,如下图:
Image 18.jpg
图七,投石机复位逻辑设置,来源:本人电脑截图
初始位置的坐标向量,以属性(property)的形式设置在控制器面板的右侧。脚本以python控制器的类型与键盘感应器连接,键盘感应器设置成按R键激发。

最后,我们来看看游戏效果吧,还是很有趣的。
ezgif-2-032c41f52eca.gif
来源:本人录屏


##参考资料:

【cn-stem】用upbge制作投石机模拟器 | Ecency