欢迎光临散文网 会员登陆 & 注册

Blender 新欢 Armory3D - Armory Engine

2023-04-14 14:06 作者:紧果呗  | 我要投稿

Blender Grease Pencil 绘画是基于曲线创建的,不能像几何体一样导出到 Godot 这些游戏引擎中使用,只有 Mesh 几何体才能通过 Collada 这些文件导出使用。当然,可以将蜡笔转换为 Polygon Curve,设置 Geometry -> Depth 再导出为 Collada,但是经过处理后,与 Blender 渲染的效果不一致。另一种方法是输出透明有动画帧图像,作为 Sprite Animation 使用,需要设置渲染器的透明属性,Render Properties - Film - Transparent。


目前,Armory3D 是集成了 Blender 功能的游戏引擎,可以说是专为 Blender 开发的,但蜡笔效果支持也不好。Armory 本身是 Blender 插件,组合成一个完整游戏开发工具和从头到尾的统一工作流程。使用 haXe 语言开发,语法类似 Java。haXe 是编译器又是转译工具,可以将源代码构建为跨平台应用程序,并且允许访问每个平台的本地功能。自有虚拟机 HashLink 和 NekoVM,但也可以在解释模式下运行,例如 `haXe -cp src --main Main --interp`。


使用 Kha 开发游戏项目,最好有图形学基础,有一定的线性代数基础。熟悉现代 GPU 渲染管道的编程逻辑,了解任意一个图形 API 接口,如 OpenGL、Direct3D、Metal、Vulkan。


✨ 源文档 https://github.com/Jeangowhy/opendocs/blob/main/Haxe.md

Armory3D 引擎是一组工具集合,除了一个 Blender 插件,还有以下核心模块:

  • 01. **haXe** 一个高级跨平台编程语言、代码转译工具。

  • 02. **Kha** 一个使用 haXe 编程语言的跨平台游戏框架,包含独立于不同系统的图形、音频、输入、网络抽象层。

  • 03. **Iron** 是 Armory 的核心构架,相对于处理底层 Kha,Iron 是高级抽象层,处理游戏中的渲染与内容管道。

  • 04. **Armory3D**,包含的 Blender 插件称为 Armory,从 Blender 中完全分离 Shaders 和  Materials,使用 Cycles 材质节点,使用 Blender 动画,提供 Logic Nodes 可视化编程。

  •     使用 haXe 编程语言,使用 Traits 混入编程模式。

  • 05. **Zui** UI 框架,使用 Armory2D 编辑器进行可视化界面设计,Bundled 目录下 JSON 文件中保存。此构架受 imgui 启发,Immediate Mode 即时刷新模式 UI 构架,使用 Haxe 和 Kha 实现。

阅读 Architecture 内容,了解使用到的相关构架,有助于快速认识 Armory 引擎的主体构架结构:

  * [Setup](https://github.com/armory3d/armory/wiki/setup)

  * [Playground tutorial](https://github.com/armory3d/armory/wiki/playground)

  * [Architecture](https://github.com/armory3d/armory/wiki/architecture)

  * [Tanks tutorial](https://github.com/armory3d/armory/wiki/tanks)


Armory3D Wiki - Playground 内容中展示了 Armory 引擎的基本功能以及使用流程:

  • - Armory Player 工具条的使用,Run、Stop,或者 Krom、Browser 运行时选择等等;

  • - Materials - Armory PBR 是引擎提供的一个着色程序节点组;

  • - Animation - Armory 支持 Blender 时间轴动画;

  • - Physics - Armory 集成了 Bullet 等物理引擎支持 Blender 中的物理设置;

  • - Logic Nodes - 逻辑节点和 UE 蓝图一样是可视化的节点编程工具;

  • - Haxe Scripts - Armory 可以使用 Haxe 脚本为场景对象提供编程控制能力,主要是 Iron 构架;

  • - Bundled Scripts - Armory 引擎提供的一套常用的 Trait 扩展类型定义;

  • - UI Canvas - 场景属性 Armory Traits 列表可以添加 UI 扩展,可以激活 Armory2D 界面编辑器;

  • - Render Path - 提供可编程的渲染路径系统,`Render - Armory Render Path` 面板中进行配置;

  • - Exporter - 项目导出配置: `Properties - Render - Armory Exporter`;


所谓“捆绑脚本”,Bundled Scripts,就是 Armory 源代码中现有的由 Haxe 编写的 Trait 扩展类型。与常规 Haxe 脚本类似,Bundled 脚本可以附加到对象属性面板或场景属性中的 Armory Trait 列表中。例如,使用 PhysicsDrag 特性,当这个特性附加到启用了物理的对象上时,可以使用鼠标拖动这个对象。

又如,使用 WalkNavigation 可以实现相机的漫步运动控制。


以下一是 Armsdk 中定义的部分 Bundled Scripts 列表和 Zui UI 框架代码文件:

Armory 使用独立于 Blender 的渲染程序,通过 Iron 实现,但是使用 Cycles/EEVEE 材质节点, 目前还不断完善,没有完全做支持所有材质节点。Armory 提供了一个 Armory PBR 材质着色器,另外 Render Path 功能完全可脚本化,支持开箱即用的 deferred renderpath。也完全可以在 GLSL 中编写自己的着色器。


显然,Armory 的缺点是对 Blender 材质支持不到位,比如 Glass BSDF 就不能完全支持,这导致 Blender 中调试好的材质,程序运行时 Armory 无法准确还原,并且较多 Shader 节点没有支持。 [supported nodes] https://github.com/armory3d/armory/wiki/supported_nodes


Armory3D 开发本身涉及多个语言,包括 haXe、Python、JavaScript 等等,需要对所选择语言有了解。 可以在渲染器属性面板 Armory Exporter 中配置为 C 语言项目导出,如 Windows (C)、Android (C), 这种方式会生成相应的项目配置和 C 语言代码,需要经过编译才会生成游戏的可执行程序。使用 JavaScript 语言有两种导出方式,Node (JS) 和 HTML (JS),不同平台提供的 API 都有差异,需要区别对待。


JavaScript 作为一种跨平台脚本语言,应用非常广泛,在 Armory 中也被大量使用。并且,随着 WebAssembly 不断发展,Web 平台性能有了较大的进步,所以 JavaScript 应用更盛。正所所谓: 任何可以用 JavaScript 来写的应用,最终都将用 JavaScript 来写。 JavaScript 的优点是可以写任何东西,缺点是你真的会用它去写这些东西。


    Atwood's Law: Any application that can be written in JavaScript,

    will eventually be written in JavaScript.


    Reg Braithwaite: The strength of JavaScript is that you can do anything.

    The weakness is that you will.


也就如墨菲定律所说:“如果坏事情有可能发生,它总会发生,并引起最大可能的损失。” JavaScript 虽然灵活,但是用好它好一点也不容易,特别是大型项目,所以才有了 TypeScirpt 这种强类型升级版 JS 脚本。

Armory3D SDK 本身已经包含 Armory2D 工具,要从 Blender 中启动 Armory2D editor, 只需要在 Scene 属性面板中向 Armory Scene Traits 列表中添加一个 UI Armory Trait, 然后编辑这个 UI 就会打开 Armory 2D 编辑器。或者直接执行 Krom 加载 Armory2D。 Armory2D UI Editor https://github.com/armory3d/armory/wiki/ui_editor

    Krom.exe C:\HaxeToolkit\armsdk\lib\armory_tools\armory2d\d3d11

注意,Kha GraphicsExtension 会在新版本中移除,需要使用这个图形扩展,可以手动拷贝到项目目录中。


    armsdk\Kha\Sources\kha\graphics2\GraphicsExtension.hx

    @:deprecated("GraphicsExtension will be removed. If you want to use it, simply copy it into your own project and then remove this message.")

一个常用的工作流程是:使用 Kha 编译源代码得到 JavaScript 脚本程序,然后由 Krom 加载运行。 Krom 和 Electron 类似,都集成了 V8 JavaScript 脚本引擎,提供了不错的性能。Krom 还集成了 一个低层抽象游戏库:Kinc - Modern low level game library and hardware abstraction。 同时,haXe 编程语言提供了的丰富转译能力,这样的组合也使得 Kha 拥有非常好的移植能力,方便实现 跨平台游戏项目开发。


Krom 运行程序时,如果路径参数缺失,krom 就从其自身的目录下加载着色器和资产。


Armory3D 运行游戏时也会调用 Kha 编译命令,可以打开 Blender 控制台查看。比如,以下命令将构建出供 Krom 运行时程序,生成的工程也可以使用 HaxeDevelop 进行构建。


用户也可以自行构建 Zui 这些工具,并将结果拷贝到指定目录。下载 Zui 源代码后,就可以参考以下命令执行 Zui 示例程序的构建、执行:

Blender 中执行 Armory3D 构建时,引擎插件会将所有资源、着色器、纹理等等都存放在 compiled 目录下, 最后打包到输出目录,主要是 krom 和 krom-resources 两个目录。构建脚本 khafile.js 也自动生成。 资源导出目标为 `<build target>-resources`,比如 Krom 导出的资源目录就是 krom-resources。


而手动执行 Kha 构建时,则直接打包到输出目录,并且需要自行配置 khafile.js 脚本,当然可以调用 khamake 生成:

    node.exe C:\HaxeToolkit\armsdk\Kha\make --init

Kha 构建 HTML5 或 Flash 应用时,如果有 .wav 等等资源文件,就需要指定 ffmpeg 工具来转换格式。 声波文件在 HTML5 平台中需要转换为 .ogg 文件,在 Flash 平台中转换为 .mp3 文件,优化文件大小。

    node Kha/make html5 --ffmpeg "/path/to/ffmpeg.exe"

khamake 期待的资源文件格式如下,其它格式资源通过 Assets.blobs 作为 Blob 对象访问:

  • 01. Images: png, jpg, hdr

  • 02. Sounds: wav (sample rate: 44100Hz 16 bit)

  • 03. Videos: mp4

  • 04. Fonts: ttf

Kha 是一套 API 或称为一个开发库,它使用的构建工具称为 **khamake**,以及一个着色器交叉编译器 **Krafix**,使其能够支持多个图形 API。支持平台包含:Web, Mobile, Desktop, and Consoles, 使用 OpenGL, WebGL, DirectX, Vulcan, 以及 Metal 等图形 APIs。


Kha 编译得到目标程序程序是 targets,最典型就是 C++ ( with Kore ), Krom, Web, 和 HashLink (HL)。

Kha Feature Matrix

https://github.com/Kode/Kha/wiki/Feature-Matrix


Kha 构架图示意

https://github.com/Kode/Kha/wiki/Features


Blender 新欢 Armory3D - Armory Engine的评论 (共 条)

分享到微博请遵守国家法律