scratch3-adapter接入blender

我在积木化编程与3D场景写道:

我近期会将Scratch3-adapter接入blender中!如此一来就建立了现实世界与虚拟世界的连接,你甚至可以和电影中的角色打交道。很多著名的电影都使用了blender来创作。
一旦scratch3-adapter与Blender连接完成,你可以徒手创作minecraft中的世界(借助leapmotion,而minecraft的资源包社区里已经有了:BLENDER MINECRAFT ADDON。你也可以使用micro:bit制作的魔法棒与虚拟世界的哈利波特一决高下。

这部分的工作已经完成。做些笔记

开发笔记

debug

blender有多种方式可以运行Python脚本,参考Script Loading。 运行text editor中的代码,我们无法看到输出,为了调试方便,我们可以这样启动blender:blender --python /tmp/test.py /tmp/test_bge.blend,如此一来项目中运行python程序时,输出会显示在命令行。

上边的blender命令其实是:alias blender=/Applications/Blender/blender.app/Contents/MacOS/blender

逻辑积木

blender的逻辑积木与node-red很像。使用方式也基本一样,

值得注意的是blender运行python的方式。注意程序的生命周期。从上图可以看出,Python程序由传感器触发。每当设置的sensor发现了某个事件(event),python脚本则运行一次,在脚本中可以拿到传感器(sensor)的信息,以此决定如何影响触动器(actuator)。由此可以看出,我们的脚本是被动运行的,它被多次促发。所以你不能在脚本中跑守护进程。我只好将zmq rep socket改为NOBLOCK风格。

消息

blender有两类逻辑积木:传感器(sensor)和触动器(actuator)都支持消息(message)

使用消息,可以实现跨场景控制,这个scratch很像。和adapter也很像。

everything is message

import bge
cont = bge.logic.getCurrentController()
own = cont.owner
# send message
own.sendMessage(data) # 会激活messge sensor

导出游戏

使用blender插件可以将制作的游戏导出为独立应用,参考How to Export correctly a standalone Game?

需要注意的是,如果你使用了自己安装的python第三方包,导出为游戏时会出错,错误原因是第三方包没有到打包进应用。我使用pyzmq,就遇到相应问题。

由于导出的应用没办法看到调试信息,你可以简单打个log

try:
    from test import run_server
except  Exception as e:
    # export to log
    with open("/tmp/error.log","a+") as f:
        f.write(str(e))

BGE

  • blender在暂停BGE引擎之后需要重启,否则zmq端口没有释放
  • 重启blender, adapter和scratch3.0插件不需要重启
  • 记得连接逻辑积木,always作为触发器
  • 被触发的Python脚本在进程中,当心阻塞blender

参考




Fork me on GitHub