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

Blender 新欢 Armory3D - Logic Nodes 可视化编程 - UE 蓝图替补

2023-04-15 00:33 作者:紧果呗  | 我要投稿

本文继续讲解 Armory Traits 混入式编程的 5 种类型,本文着重介绍其中的 Iron 构架类型层次结构和逻辑节点编程,这是一种可视化节点编程工具,[doge] 和不真实的引擎 BluePrints 一样样:


1. **haXe** 脚本代码文件;

2. **Nodes** 使用 Logic Node Editor 可视化编程工具定义的节点树;

3. **UI** - User Interface (Canvas trait),使用 Armory2D 用户界面编辑进行可视化编辑;

4. **Bundled** Armory Engine 预定义 Haxe 脚本,是 `Trait` 类型的扩展;

5. **Wasm** 使用 WebAssembly 字节码程序;

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


🐥 Iron Tutorial

Iron - 3D Engine Core https://github.com/armory3d/iron

Iron examples https://github.com/armory3d/iron_examples/

Iron wiki https://github.com/armory3d/iron/wiki

Krafix shader compiler https://github.com/Kode/krafix


Iron 是一个数据驱动的异步高级游戏抽象类型构架,用于可移植的 3D 游戏开发,处理渲染与内容管道。Iron 没有使用现有标准的 3D 文件格式,而是独立开发了一种 .arm  场景文件格式。支持文本格式的 JSON (用于开发调试),和基于 MessagePack 的二进制格式的 ArmPack,串行化与可选的压缩支持。`.fbx`/`.gltf`/`.obj` 格式导入参考 armorbase_format。渲染管道上,着色器程序使用 GLSL 语法,使用 Krafix 进行交叉编译。


这里贴出场景类型结构定义其中的一个片段:

Useful tooling:

- [Haxebullet](https://github.com/armory3d/haxebullet) for 3D physics

- [Haxerecast](https://github.com/armory3d/haxerecast) for 3D navigation

- [Zui](https://github.com/armory3d/zui) to build user interfaces

- [armorbase_format](https://github.com/armory3d/armorbase/tree/main/Sources/arm/format) for 3D model import

- [armorcore](https://github.com/armory3d/armorcore) for deployment

[scene format](https://github.com/armory3d/iron/blob/master/Sources/iron/data/SceneFormat.hx).

[.arm exporter](https://github.com/armory3d/iron/blob/master/tools/io_export_arm.py)


Iron 为 Armory 提供了一个高级抽象的节点层次结构,基于 iron.object.Object

- **traits** 集合包含了 Blender 对象中 Armory Traits 列表中添加的所有 iron traits 类型;

- **parent** 引用含父节点;

- **children** 集合包含了所有子节点;

- **animation** 引用节点的动画对象;

- **constraints** 集合包含所有约束关系;

- **lods** 集合包含包含分级细节图;


iron.Trait 类型的两个属性:


- **name**: String 指定 Trait 的名称。

- **object**: Object 引用当前 trait 归属的所有者。


Armory 框架中的 CanvasScript 对象扩展了 iron.Trait,包含属性:


- **cnvName** 即创建 Canvas UI 时指定的名称,如 MyCanvas。

- **canvas** 属性为 `TCanvas` 类型,对应 MyCanvas.json 中的基本画布数据,如宽高、位置。

- **cui** 画布对象对应的 `Zui` 框架实例。


iron.Scene 类型的几个属性:


- **active**: Scene 静态变量,引用当前活动场景。

- **global**: Object 静态变量,引用全局对象。

- **root**: Object 引用场景的根节点。

- **sceneParent**: Object 引用父场景。


它们构建出来的节点树的基本结构如下:

Armory 引擎在 armory.trait 空间下定义了大量扩展类型,当然,其中也包括,CanvasScript,WasmScript,DebugConsole 等等核心扩展类型。


✨ Logic Node Editor

* Logic Nodes

  * [Introduction](https://github.com/armory3d/armory/wiki/Introduction-to-Logic-Nodes)

  * [Reference](https://github.com/armory3d/armory/wiki/reference)

  * [Common Mistakes](https://github.com/armory3d/armory/wiki/Common-Mistakes)

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

  * Play Tilesheet https://github.com/armory3d/armory/wiki/reference_motion#play-tilesheet


**Logic Node Editor** 是可视化编程工具,和 Unreal Engine 蓝图工具是同类型软件,通过定义节点树,实现程序逻辑的开发,由节点连接关系来转译成对应的代码,省去人工编写代码的过程。


Armory 提供了 Play Tilesheet 逻辑节点用来播放 Sprite Animation,官方教程: 

0. https://github.com/armory3d/armory_examples

1. tilesheet 提供简易的 Sprite Animation 使用示范,定义 Tilesheet 和 Action;

2. tilesheet_2d 使用 Tilesheet 搭建的简易的 2D 场景,角色都采用 Sprite Animation。

3. tilesheet_walkcycle 示范通过逻辑节点对 Tilesheet 动画进行设置,播放不同的 Action;

Armory Tilesheet 2D

三个 Tilesheet 教程都使用了相同对象动画控制器 AnimControl.hx。


Trait 类型中 object 引用了几何体对象,通过转型函数 cast() 转换为 `MeshObject`,此对象由 Iron 提供,用来操作几何体,tilesheet 就是其中之一,`Tilesheet` 对象提供了 Sprite 动画的基本控制方法:

    armsdk\iron\Sources\iron\object\MeshObject.hx

    armsdk\iron\Sources\iron\object\Tilesheet.hx

    armory_examples-22.06\tilesheet_walkcycle\Sources\arm\AnimControl.hx

BG-36's Tutorials - Armory Tilesheet 教程演示了通过逻辑节点实现一个爆炸效果的动画播放。https://github.com/BlackGoku36/armory-tutorial-sourcecode/tree/master/Tilesheet


explosion.png

在场景中添加一个 **Plane**,并添加 Armory PBR 材质,设置 Base Color 和 Opacity 材质纹理,将它们都关联到带透明通道的 Explosion.png。同时设置 UV,因为 Explosion Tilesheet 图像规格为 8 x 8 帧,所以映射到 Plane 平面时,就需要将其 UV 坐标映射区域的大小设置为 1/8,即 0.125。


Blender 中可以直接输出 1/8,交由 Python 引擎计算表达式的值。在 UV 编辑器中,选择网格,按下 S 进入缩放模式,再按 /8 即可以确定完成缩放。然后按下 G 将缩放后的风格移动到动画帧开始的区域。

01. Material 属性面板 - Armory Tilesheet 添加一个瓦片图,命名为 SpriteAnimation,同时创建一个 Action 并命名为 Explosion,可以创建多个 Action 播放不同的区间内的帧。Frame Rate 帧率,指定播放速度,根据动画设置。Tiles X/Y 指定图像的水平、竖直方向的帧数。多个 Action 可以通过 Start/End 指定播放的帧区间。


02. Object 属性面板 - Armory Props 中引用上一步创建好 Tilesheet,可以不勾选 Animation,此选项用于骨骼蒙皮动画和时间轴动画。设置 TilesheetAction 名称同上,通过列表中选择。


材质面板中 Armory Tilesheet 列表中添加的 Titlesheet,通常可以在列表中命名为 Character,这此对象可以设置多个动作动画,但是这些不是专为当前选中对象设置的,而是给那些通过其**对象属性面板**指定了 Armory Props - TilesheetAction 的对象使用。并且需要配合材质设置,因为 Tilesheet 根本上只是根据指定的图片帧参数移动 UV 坐标映射的区域,所以材质需要使用相应的图片作为纹理。


Armory 提供了 Armory PBR 节点组,它可以很方便地通过 Mix Shader 提供一个 Opacity 端口,可以直接输入带透明通道的 PNG 图像 Alpha 值。创建一个 Image Texture 节点将动画图像纹理的 Color 和 Alpha 连接到 Armory PBR 着色器的 Base Color 和 Opacity。


另外,对象数据属性面板中 UV Maps 设置的纹理坐标数据非常重要,因为 Sprite Animation 纹理图像就是通 UV 坐标映射到几何体上的。如果几何体未提供编辑好的 UVMap,或者连默认的 UVMap 都没有,那就需要进行 UV 坐标碾平,根据纹理图像进行调整。

Armory Tilesheet & Logic Nodes

在几何体上逻辑节点对 Tilesheet 动画进行操作时有可能出现这样的错误,这是因为 Tilesheet 配置不正确,应该给几何体的对象属性设置好要使用的 Tilesheet 和相应的 Action

    Trace: TypeError: Cannot read property 'play' of null

    Trace: TypeError: Cannot read property 'tileX' of null

使用逻辑节点播放 Tilesheet,先创建一个 Logic Node 节点树,命名为 SpritePlayer,然后,

按以下说明添加节点设置:


1. Event - `On Init` 初始化事件节点,将事件流输出到 Animation 节点;

2. Object - `Self Object` 自身引用节点,用来给动画节点指定 Object 属性值;

3. Animation - `Play Tilesheet` 瓦片图动画播放节点,Name 属性中指定一个 Action;


注意,逻辑节点的连线颜色,一般有两种含义:事件流(控制流)用红色线,表示程序的执行流程。数据流用青色,表示事件流经过的节点需要使用到的数据。事件节点通常用来获取事件流,事件流的走向表示了程序逻辑的执行流程,将其联接到 Animation 节点,就表示在初始化事件产生时播放动画。事件流有两种基本状态:激活状态非激活状态,处于激活状态就是在运行的逻辑程序。


目前没有 Set Tilesheet 这样的节点用来改变对象的 Sprite Animation,并且在对象属性面板中Armory Props - TilesheetAction 都要指定初始值,否则就会产生异常。

Trace: TypeError: Cannot read property 'start' of null

    at iron_object_Tilesheet.play (<anonymous>:19024:29)

    at <anonymous>:19005:13

    at Function.getSceneRaw (<anonymous>:6773:4)

    at new iron_object_Tilesheet (<anonymous>:18996:18)

    at iron_object_MeshObject.setupTilesheet (<anonymous>:17702:20)

然后将逻辑节点树关联到 **Plane** 对象,添加 Logic Trait,生成代码中的类名由 Armory Trait 列表中的条目指定。逻辑节点自动生成的代码如下,每个逻辑节点组就是一个逻辑节点树 `LogicTree`。


以下节点设置可以通过 Space 按键来切换 Tilesheet 的播放与暂停:


1. Event - `Keyboard` Space 事件流向 `Set Tilesheet Paused`;

2. Object - `Self Object` 获取自身对象引用,输入到 `Get Tilesheet State`;

3. Animation - `Get Tilesheet State` 获取 Sprite Animation 的播放状态 **Is Paused**;

4. Logic - `Invert Boolean` 用来反转当前的播放状态,并将结果输入到 `Set Tilesheet Paused`;


注意,`Keyboard` 产生的事件流对应有三种按键状态:

1. Started 刚按下按键时触发的事件;

2. Down 按下按键时触发,只要按键没有释放就持续地在每一帧触发;

3. Released 释放按键时触发的事件;


另外,`Invert Boolean` 和 `Invert Output` 是两类功能完全不同的节点,前者是逻辑取反运算,后者属于事件流状态控制节点:


1. InvertOutputNode  - 反转控制流,如果输入的状态处于激活状态,那么输出非激活状态;

2. AlternateNode     - 变换控制流,可以有多个控制流输出,每次变换地执行其中一个,按顺序循环执行;

3. SequenceNode      - 序列控制流,按顺序执行输出的控件流;

4. LoopNode - 循环控制流,From 与 To 指定循环次数,执行 Loop 端口,结束时再执行 Done 端口;


比如用来清理控制台输出内容的 Clear Console Node,它就是通过脚本调用 Krom 或其它平台的 API。因为逻辑节点需要在 Bledner 节点编辑器中使用,Armory 将 Haxe 代码转译为对应的 Python 代码,Blender 节点编辑器,所以 Armory 逻辑节点都按分类组织:

    armsdk\armory\Sources\armory\logicnode\ClearConsoleNode.hx

    armsdk\armory\blender\arm\logicnode\transform\LN_rotate_object.py

注意,逻辑节点生成的代码,默认保存在 Sources/arm/nodes 目录下,不能通过直接复制节点代码文件来复制 Blender 中的逻辑节点树。并且不能在逻辑节点编辑器中直接通过 Ctrl-X/C 等快捷键复制节点,需要通过 Logic Node Editor 的菜单执行复制动作。

以下代码使用 `import` 整理过,注意 `@:access` 元数据必需指定完整的 package.module.type,以访问私有成员,否则会导致异常。参考 Haxe [Compiler Features] [Built-in Compiler Metadata]:

    Cannot access private field preallocInputs

以代码方式使用 Logic Trait 并不是它的目的,只能开发者有了解它的需要。


Blender 新欢 Armory3D - Logic Nodes 可视化编程 - UE 蓝图替补的评论 (共 条)

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