缘起

近期试着把类似code.org的编程项目移植到3D场景中。

我们最初使用three.js实现了原型,后来发现了Blender和Verge3D,十分称心,便切换到这个技术栈里。

Blender

Blender名声在外,早有听闻,但一直没去试用。

近期在树莓派的项目页面看到3D modelling projects

看了几个学习项目,觉得还不错,这些项目依赖于Blender,便下载试用了Blender,在学习Blender过程中发现许多惊艳的东西,在此做个笔记。

也是在了解Blender过程中,意外地发现Verge3D,觉得这就是我要找的工具,用来构建3D场景的编程教育项目。

最近常在浏览开源项目中意外解决了手头的问题。而且事后发现它们往往是最佳解决方案,原本以为要花上几个月的工作量常常变成了几周或几天。甚至几分钟(如昨天发现的fbs将彻底省下我之后重构scratch3-adapter的时间)

Blender是什么

Blender主页上的介绍是:

Open Source 3D creation. Free to use for any purpose, forever

在阅读介绍之前,我喜欢先把软件下载下来,凭感觉胡乱捣鼓一番,先做个感性的认识,再做知性的了解。

Blender的下载地址为download, 我目前使用的版本是v2.79b

以下内容摘自维基百科词条:Blender

Blender是一套专业的,自由及开放源代码的三维计算机图形软件。由荷兰的一个动画工作室NeoGeo创建。

Blender使用Python语言来创作及制作游戏及工作自动化脚本。这令我们这些python拥趸跃跃欲试,我在还不会使用blender的时候,就先去翻它的python文档。

Blender有个子计划叫Game Blender,用于制作实时交互内容。该游戏引擎使用 C++ 程序语言编写,并支持 Python 脚本和 OpenAL 3D 音频。

Blender的先进功能包括:

  • 在Blender中,物体与数据是分离的,这使其可以快速塑模。
  • 可以将多个场景合并至单一文件(称为".blend"的文件)
  • 所有Blender所生成的".blend"文件均有完善的向前,向后版本的兼容性,同时亦具有完整的跨平台支持。
  • 所有场景,对象,材料,材质,声音,图片,后期制作特效均可集成至最后生成的".blend"动画档里。
  • 可透过".blend"文件来自定义用户界面。

案例

NASA为火星探测车“好奇”着陆三周年纪念日作出了交互web-软件。探测车的动作、摄影机和机械手的操纵是基于 Blender 和 Blend4Web 创造的软件实现的。Blend4Web是用于创建和在网页浏览器中显示交互式三维计算机图形的开源框架。近期NASA将技术栈从Blend4Web迁移到Verge3D。

这是个非常炫酷的项目:opensourcerover

Blender与电影

第一套使用Blender专业视频是蜘蛛侠2,在该片制作中用来绘制分镜脚本。

Blender基金会牵头制作了一些开源电影。

这些通过 Blender 创作出的电影作品,都是根据CC协议(Creative Commons)发表的。因此 DVD 内带有所有电影创作相关 .blend 文件、模型、纹理和其他材料,还有原始剧本、支配表、画面分镜剧本,以及技术细节文档和视频,教你如何使用这些素材,所有人可以下载该作品或其源文件,用于修改后重新发布。

这些开源电影包括:

大家可以看其中的一个例子(辛特尔):

这些例子令人震惊之处在于,创作者所使用的工具全都开源,任何人可以轻松获得,他们把作品的所有细节,从剧本到素材也都开源,你可以看到一个人手握屠龙刀,斩落恶龙的所有细节。这就给人一种希望,只要努力,有朝一日,我们也可能创作出如此惊人的作品。事实上极少人最终走到这一步。有时候,令人难过的是,你本来有机会做出一些令人惊叹的事,外部环境已足够友好,也有前辈尽力予以支持,但却因为自身的原因,不够努力或不够聪明,未能达成目标。

在开源的世界里,无论你想成为一个顶级黑客,还是想建构一个新的虚拟世界,或是用程序操控现实中的万物,屠龙刀都是可以轻易获得的,但屠龙技却得靠自己的努力去习得。

Verge3D

Verge3D是一个用于创建运行于网页的3D交互式体验的实时渲染器和工具套件。

Verge3D是由以前创建的Blend4Web 框架的核心软件工程师团队创建。 Verge3D使用户能够利用常用的三维设计工具(目前支持 Autodesk 3ds Max 和 Blender )创做3D交互内容,并直接转换到网络浏览器中查看。

Verge3D基于 WebGL 进行渲染,整合了 Three.js 库,并向程序开发人员公开API接口

Puzzles编辑器

Puzzles编辑器是基于Blockly编写的可视化编程环境。Verge3D的程序功能可直接编写代码或使用Puzzles编辑器添加 JavaScript 脚本。 Puzzles主要面向非程序员,使其可通过 拖放 操作快速创建交互场景。

使用Puzzles,非技术用户(如艺术家)可以轻松创作出动态的场景或游戏。步骤是在Blender中导入或创建好3D模型,接着在Puzzles中拼搭积木为3D场景/物体编程。强大而友好得令人震惊!

Verge3D的工作流与主流的WebGL框架有很大的不同,它追求的是一个强大的面向艺术家的方法。开发一个新的Verge3D应用开发通常是从3D对象的建模、纹理和动画开始的,在单一的*.max或*.blend文件中组装模型完成3D场景。然后即可在App Manager调用该文件,作为初始化Verge3D项目的基础。

此外以团队协作的视角来看,通过在程序员和设计师之间分配责任,将提高团队的效率。这个神奇的工具既可用于快速原型制作,也可用于生产。

需要注意的是,Puzzles项目的底层使用了three.js,物体之间的交互逻辑由js控制。所以一个使用python来控制逻辑的.blend项目导入Puzzles后,python逻辑不生效。

Puzzles是对blender内置的逻辑编辑器的替代。

Blender与Python

我们前头提到

Blender使用Python语言来创作及制作游戏及工作自动化脚本。

Blender v2.79b携带的Python版本是3.5.3

这篇教程介绍了如何使用Python与Blender的内置的游戏引擎打交道,快速做一个游戏。文章里的代码直接可用(2012年的文章,可见其兼容性之好)

安装python第三方库

由于Blender支持Python,所以我们可以把Blender接入到更广阔的世界中,让外部世界与Blender虚构的3维空间交互。

在这个过程中我们可能需要安装一些第三方python库,下边是教程,演示如何安装pyserial.

参考Install packages for blender bundled python

1
2
3
4
cd /Applications/Blender/blender.app/Contents/Resources/2.79/python
wget https://bootstrap.pypa.io/get-pip.py
./bin/python3.5m ./get-pip.py --prefix /Applications/Blender/blender.app/Contents/Resources/2.79/python
./bin/python3.5m bin/pip3 install pyserial

我近期会将Scratch3-adapter接入blender中!如此一来就建立了现实世界与虚拟世界的连接,你甚至可以和电影中的角色打交道。很多著名的电影都使用了blender来创作。

一旦scratch3-adapter与Blender连接完成,你可以徒手创作minecraft中的世界(借助leapmotion,而minecraft的资源包社区里已经有了:BLENDER MINECRAFT ADDON)。你也可以使用micro:bit制作的魔法棒与虚拟世界的哈利波特一决高下。

我们之前的演示案例很快将延伸到虚拟世界中。

python api

Blender相关的python API参考Python API

而BGE(Blender Game Engine)相关的api则参考:game_engine

1
2
3
# 移动名为Cube的对象的顶点
import bpy
bpy.data.objects["Cube"].data.vertices[0].co.x += 1.0

一个bge例子

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# car
import bge
cont = bge.logic.getCurrentController()
own = cont.owner
move = cont.actuators["move"]
pressup = cont.sensors["up"]
pressdown = cont.sensors["down"]
speed = move.dLoc[1]

if pressup.positive:
    speed = speed + 0.05
    move.dLoc = [0.0, speed, 0.0]
    cont.activate(move)
    
elif pressdown.positive:
    speed = 0
    cont.deactivate(move)
    move.dLoc = [0.0, 0.0, 0.0]

此外我写了一个简单的完整例子:test_bge.blend

如何运行python脚本

Script Loading

1
2
3
4
# alias blender=/Applications/Blender/blender.app/Contents/MacOS/blender
blender  --python my_script.py # 会打开新的blender窗口
# blender --python --help
blender --python a.py  test_bge.blend # 这种模式下blend编辑器里的输出会在命令行打印出来!

教程

在学习Blender的过程中,发现不少很不错的教程,记录如下:

参考