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

avatar

今天说说,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
来源:本人录屏


##参考资料:



0
0
0.000
2 comments
avatar

JCAR 3월 구독보팅입니다.
날마다 좋은 날 되세요.

0
0
0.000
avatar


This post has been voted on by the SteemSTEM curation team and voting trail. It is elligible for support from @curie and @minnowbooster.

If you appreciate the work we are doing, then consider supporting our witness @stem.witness. Additional witness support to the curie witness would be appreciated as well.

For additional information please join us on the SteemSTEM discord and to get to know the rest of the community!

Please consider using the steemstem.io app and/or including @steemstem in the list of beneficiaries of this post. This could yield a stronger support from SteemSTEM.

0
0
0.000