【翻译】Houdini官方对UE4新版插件的介绍:Houdini Engine for Unreal - V2
原视频:Houdini For Unreal - YouTube介绍
Houdini与虚幻引擎以多种方式强强联合。资深3D软件开发者Damien Pernuit 将讨论:
第二版的虚幻引擎 Houdini Engine 插件Niagara插件实时链接(Live-Link)
此演讲和最近的新闻有关——UE4的Houdini Engine现在免费提供给商业客户。 你可以在此处了解更多信息: https://www.sidefx.com/community/houdini-engine-for-unreal-and-unity/
0. 总览
大家好,我是Damien Pernuit ,SideFX的一名软件开发者。我主要负责 Houdini Engine 插件,特别是针对于虚幻引擎的插件,而这也是今天我们讨论的中心。
下面是今天内容的总览:
首先,我们将快速介绍 Houdini Engine 以及UE4的插件——它是做什么的,和它是怎么运作的。然后,我们看一看在第二版的插件中,有哪些新特性,以及我们做了哪些改变。
接下来再讨论一下我们给UE4准备的两个其他插件:
Niagara插件 KineFX 实时链接插件
最后——
说一下我们最近计划实现的特性,以及路线图是什么。
1. 简介HoudiniEngine
什么是 Houdini Engine ?
首先,你将在Houdini编辑器中制作一个程序化工具(Procedural Tool)(例如 树木生成器 、地形生成器 、植被 等等)然后,你需要将这个程序化工具打包到一个 HDA 文件中。你可以为 HDA 暴露一些参数(Parameter) 或 输入(Input)。而HoudiniEngine让你可以在其他应用(如Maya、Unity、UE4)的编辑器中使用 HDA 文件。
HDA:Houdini Digital Asset,Houdini数字资产而UE4的HoudiniEngine插件,很明显,就是让你可以在UE4中导入 HDA。
你可以将 HDA 文件导入到UE4 内容浏览器(Content Browser) 中作为一个 资源(Asset),然后将其实例化到关卡中。
这时,UE4将会在 细节面板(Details Panel) 中提供界面,用于编辑HDA的参数和HDA的输入。
而HDA的输入可以用来将UE4的数据传入到Houdini。例如:内容浏览器中的StaticMesh或是蓝图、世界中的Actor、spline和curve、地形。
当所有的这些数据传入Houdini后,你可以调整参数。 而每当你修改了参数或输入时,HoudiniEngine将会对 HDA 进行Cook。当Cook成功了之后插件将 HDA 的 输出(Output) 或者说 显示的几何体(Display Geometry) 转换成实际在UE4中对应的资源。基本上插件会创建StaticMesh和Instance(常规的Instance,Hierarchical型Instance,或Foliage),你也可以创建地形。
这里有一个在UE4中使用“树木生成器HDA”的范例。 插件会暴露出“输入曲线”,用于控制其形状。而且HDA是动态的,一旦你修改了曲线,插件就会重新Cook出树的形状。
你还可以修改参数。比如,用于分配材质的 引用字符串(string reference):
2. UE4的HoudiniEngine - 第二版
下面我们谈一谈UE4插件的第二版。我们在一个月前正式发布了它。
为什么要做“第二版” ?
首先,我们应该谈一下为什么我们要做一个“第二版”
第一版的架构太落后了:它被创建于UE4.7,而现在已经是UE4.26了。最初是为一个“简单”的HDA所准备,现在却被用于生成整个场景。自定义序列化导致了 不稳定、崩溃、污染数据。未使用UProperty,这导致一些新特性较难实现,例如蓝图和多重参数(multi-parameter)技术债:代码难以维护,需要接连不断地重构以增加新功能。运行时(runtime)模块混合了HoudiniEngine的逻辑、编辑器逻辑、和界面的逻辑。结果需要被烘焙(baked),最终游戏需要脱离插件。
第一版的插件有一点过时了。它当时是给UE4.7用的,但现在已经是UE4.26了,Epic 在这期间为引擎做了很多修改、添加了很多特性。
HoudiniEngine开始是为一些“简单”的HDA所准备的,比如图中那个桌子生成器 。但最后却被用于创建非常多疯狂的内容,比如图中第二张截图里的场景,里面包含地形、Instance、等。插件的架构并不是为这种级别的数据量而设计的。
插件用了自定义的序列化。而这导致了很多不稳定与崩溃。
我们没有使用UProperty。而这导致添加一些新特性会较难实现,比如蓝图、多重参数(multi-parameter)。 这也意味着一些很简单的基础功能,比如复制粘贴到到关卡,在第一版插件中相当难支持。
插件的代码非常难以维护。我们持续增加新功能,基本上我们也需要持续重构很多东西。每当你触及某项东西,就有退化(regression )的风险。最终,架构变得不那么理想了。
插件的运行时(runtime)模块混合了HoudiniEngine的逻辑、编辑器逻辑、和界面的逻辑。
而我们提倡的是提前烘焙(bake)出结果,然后在最终游戏发行时关闭插件
所有的这些让我们决定去重写插件,就像之前我们为Unity插件所做的那样。
那么, 在第二版中有什么改变呢?
What's new? - 核心
首先,我们谈一谈插件的核心变化。
我们完全重新设计了插件的架构,现在插件更轻量级与模块化。 现在,插件分为了三个模块:
HoudiniEngine模块,这是最主要的一个模块。Cook、创建HoudiniEngine的session、将数据从UE4传入到Houdini、从Houdini传入到UE4。这些逻辑都将包含在这个模块中。 我们还有一个主要负责编辑器的模块——HoudiniEngineEditor模块。他包含界面的元素、组件可视化(FComponentVisualizer)、等。运行时模块——HoudiniEngineRuntime模块,这一模块现在很轻量。它包含了插件中使用的组件和Actor——他们仅仅充当一个“数据持有者”。意思是:他们知道参数的值是什么,他们知道输入是什么mesh或其他什么对象,但并不负责做实际的转换或者修改。HoudiniEngine模块才是实际做那些繁杂计算工作的角色。
这意味着现在插件的运行时部分是非常轻量级的。 你不需要再烘焙HDA,你不需要在打包游戏之前关闭插件。
另一个关于核心的大改变是:我们现在使用 基于UProperty的序列化(UProperty-Based Serialization)。现在,基本上插件所使用的Actor或组件都表现地像原生(Native)的UE4对象一样。而这修复了大量在第一版中出现的问题,特别是“在关卡间移动对象”、“复制”这种操作。我们有这些问题是因为我们在手动地处理这些事情,而UE4实际上期望使用UProperty来处理。出于历史原因我们之前没有这么做,而在第二版中我们支持了它。
What's new? - 输出(1)
我们在插件的输出方面做了改动:
— 优化StaticMesh的创建时间
在第一版中人们最常见的问题是——生成mesh非常慢。这意味着你动了一下滑条,然后会需要几秒钟来让插件更新结果。显然,这其中是包括Cook时间的,但是插件本身也需要一些时间来创建mesh,虚幻也要花费时间来生成mesh。
因此,在第二版中,我们花费了很多时间来确保我们对传输的数据进行了优化。基本上,对于优化StaticMesh的创建时间,我们尽己所能让代码最快了。
我们还添加了使用MeshDescription的能力,它是UE4内部(internally)使用的新格式。这让我们之前在第一版中需要 “9” 秒才能Cook好的mesh,在第二版中只需要大约 “2:30” 秒。
我们还将mesh保存在临时目录,因为UE4想让我们这么做。在第一版中我们将临时的mesh保存在关卡中,而这也导致了一些问题。
— Houdini Proxy Mesh
我们还想让反馈更快。
因为,尽管我们已经尽己所能优化了,但UE4还是需要大量的时间来生成mesh,最后总是需要卡住一段时间来等待mesh进行构建。
我们和Epic讨论了这件事。基本上,在创建一个StaticMesh的时候,UE4自己也做了一些优化(译注:这里的“优化”应该不是指针对于 创建时间 而是 渲染性能等),例如 re-index triangle(译注:重新排序三角形的索引号?) 等等。
因此,为了让它更快,我们在第二版中引入了 “Houdini Proxy Mesh”。
使用ProxyMesh为的是在调整HDA参数时可以快速地获得视觉反馈。所以它们并不是真正的StaticMesh(StaticMesh是你想要的最终产出,或者说插件的输出)。ProxyMesh做了优化,它们尽可能以最快速度生成。
我们理想中是:当你拖动滑条时,你可以同时得到一个视觉反馈知道HDA被调整成了什么样子。而在之后,你可以将他们转变为正常的StaticMesh。
也就是说—— ProxyMesh让我们可以更快看到反馈。同一个Mesh的Cook,在第一版中会花费 “9” 秒,在第二版会花费 “2:30” 秒,然后可以在 “1” 秒的时间得到更新。
显然,你所生成的mesh越复杂,你就越能从ProxyMesh中受益。比如你的mesh有一百万个面,那使用ProxyMesh将会非常有用。
— 分割Mesh更简单
我们还改进了一个常见问题,即如何分割mesh。
比如你有一个HDA就像图里这个箱子,它有多个部分组成,就像碎裂了等等,而你想要为每一个小碎片创建单独的StaticMesh。在第一版这并不容易,你可以做,但是需要创建一套相对复杂的Attribute。
在第二版中,这件事儿变得简单多了,你可以使用 pack primitive 这种简单的方式。你可以将很多小东西 pack 到一个 primitive 中。如果它并没有拷贝多次,我们会创建一个StaticMesh(译注:应该是指只有一个实例的 Instancer 会创建StaticMesh)。
所以,使用 pack primitive 就行了,它让分割mesh变得简单。
What's new? - 输出(2)
输出方面,其他的变化是:
— 模板几何体
关于输出,我们所做的一个改变是: 现在可以使用节点上 模板(Template) 这个flag了。
它起到一个提示的作用。意思是,我想做一个东西,同时我需要显示一些辅助性的几何体,这些辅助几何体并不实际在游戏中用到,但在编辑时会起到一个提示标记的作用。
这在有时会很有用,比如看上面的截图,它显示了一个“裁切平面”。显示这个平面对你的编辑很有帮助,不过你最终不需要这个平面,所以你就可以使用“模板”这个flag。
— 改进Instancer
我们还花费了很多时间来改进插件中 Instance。
现在,你可以通过 Class 或 Object 的名字来对它们进行实例化。
在第一版和第二版中你都可以对StaticMesh进行实例化,方式是将StaticMesh的路径写到 unreal_instance这个attribute上,这样插件就会为其自动创建Instance。但问题是:你没法实例化一些不能存储在内容浏览器中的东西,比如 点光源(PointLight),因为他们不是资源,不存在“资源路径”。
在第二版中,你可以直接将类的名字(比如PointLight)写到 unreal_instance 上,而插件会明白你的意思——哦他想让我创建一个点光源。
我们也让分离Instancer更容易了。你可以使用一个attribute,比如“颜色”,来表明:我需要根据这个attribute来创建不同的Instancer。
我们还添加了一个默认的 “Asset Not Found”模型,所以当你创建了很多Instance却有引用错误时,在之前的版本将不会显示任何东西,但是现在可以显示有Houdini标志的小立方体,表示这里本该有什么东西但是没找到资源。这将对排错很有帮助。
另一件很棒的事情是,我们对Foliage也有直接的支持了。
Foliage的支持非常简单。当你有个 attribute instancer 或者说任何可以创建普通实例的 Instancer 时,你可以将 unreal_foliage 的值设为1。然后插件就会明白需要将其添加到Foliage系统中。
你可以使用已存在的 Foliage Type。而插件也足够智能——可以不与已存在的insntance搞混。比如,你先是手摆了一些草,然后又使用插件增加了一些instance,此时插件将会只控制他自己创建的instance,它不会删除或者修改任何已存在的手动摆放的instance。
— 曲线输出
你现在可以使用 unreal_output_curve 创建曲线输出。这将自动把一个Houdini中的 Curve 转变为UE4中的一个 SplineComponent 。
— 优化 通用属性(Generic Attribute) 支持
我们还优化了对“通用属性”支持。
通用属性(Generic Attribute) 是一些以 unreal_uproperty_ 作为前缀的attribute。他们被用于修改属性(译注:应该是指 UPROPERTY ),比如模型Instance等插件所生产的东西上的任何属性。我们优化了这个系统,现在它被更广泛地应用了。
— 物理材质的支持
我们还添加了物理材质相关的支持
What's new? - 输入
下面我们看看在“输入”方面有什么变化
Geometry Input 可以导入蓝图中发现的mesh。Geometry Input 可以导入多个mesh作为一个输入。碰撞体和LOD可以被导入,必要的 group 以及 attribute 会被创建。BSP笔刷框出的几何体可以被导入。Instance和Foliage将作为 packed primitives 导入,而不是分离的mesh。World Input 可以导入任何支持的类型(如地形、Houdini Actor 等等。。。)World Input 可以导入放在另一个关卡中的 Houdini Asset Actor改进了World Input 的Bound Selector(包围盒选择器) 模式曲线输入 现在可以创建/导入任意数目的曲线
改进了曲线的编辑,alt键+点击 可以插入点,复选框可以关闭自动更新添加“作为引用导入”的选项
你可以创建 unreal_instance 的引用而非传输所有的数据可将DataTable导入为 point attribute
Geometry Input 用来将内容浏览器中的UObject(也就是Asset,资源),从UE4转换到Houdini。这方面现在被扩展了:
可以导入从蓝图中找到的mesh。可以导入多个mesh,作为一个输入。
插件还有能力可以导入碰撞体和LOD,而他们会自动地设置必要的 group 以及 attributes 。
我们还支持了对BSP笔刷的导入。他们基本上用来 “框出”(blockout)一个几何体。我们能读取这个几何体然后送进Houdini。
如果你使用了 World Input 选择了一个Foliage,他们将会以 pack primitive 的形式导入。在第一版中他们是作为分离的mesh导入的。
World Input 现在有能力导入任何其支持的类型。在第一版中,对于World Input 你只能选择Actor中的mesh(译注:在第一版中,有一个Landscape Inputs专门用于地形的输入)。在第二版中,你也可以选择地形作为World Input ,而插件将会把地形送到Houdini中。如果你选择的是一个 Houdini Asset 而非普通的mesh,则插件会自动将两个HDA在Houdini中连接。
World Input 现在还有能力导入放在另一个关卡中的 Houdini Asset Actor
我们还极大地改进了World Input 的 Bound Selector(包围盒选择器) 模式。 在这个模式下,你将在World Input 中选择一个物体,然后我们将通过这个物体的包围盒来选择其中所有的东西,将其送入Houdini。看图中下面的那个截图,你可以看到一个绿色的盒子,而其中所有东西都被自动地送到Houdini中。而这个过程是动态的,所以如果你放进去一个新的Actor,Houdini也会自动地知道。
我们还改进了曲线输入:
你现在可以在一个曲线输入中创建多个曲线,而不是像之前一样必须在HDA中为多个曲线创建多个输入。 我们还试图让曲线编辑更为快捷。比如,现在你可以在曲线上按住【Alt键】点击,来插入一个点。 我们还增加了 “别更新” 的选项框,可以让你临时禁止将曲线传入Houdini并更新。这样你就可以先调整曲线,然后等调整好了后再恢复更新HDA。
我们还为大多数输入类型添加了一个 “作为引用导入(import as reference)” 的选项。 这意味着,仅仅将一个 “引用”传入给Houdini,而不传入StaticMesh数据。实际上你将创建一个带有UE4引用信息的点,并表示“这是个UE4中的mesh,插件会知道如何处理的”。随后,你可以将其用于Instance。
插件现在还可以导入 DataTable(数据表)。而它将会转变为 point attribute。
下面是一个快速的范例,展示了BSP笔刷是如何在第二版中工作的:
在右边,你可以看到直接在UE中被编辑的BSP笔刷,它将会被传入到HDA中作为一个输入,用来制作左边这个房屋。
BSP比较好的一点是:你可以直接在UE4编辑器中控制,你可以框出几何体、选择面、编辑顶点等等。而这些都在UE4的原生编辑环境中。
What's new? - 参数
接下来,我们看看在参数方面我们的改变。
参数和输入的编辑,现在支持多选编辑。Folder类UI优化:Tab、Radio、Collapsible 。Ramp类UI优化。现在可以选择在编辑的时候关闭掉自动更新。文件类参数的支持。(自定义扩展名、目录、创建新文件。。。)新添了对很多类型参数的支持:多行字符串、栏目标签、条状按钮、对数型整数、对数型浮点数 等等。。。参数可以恢复到默认值。字符串参数支持由资源直接拖入,其值会被设为被拖拽资源的引用在有“unreal_ref”、“unreal_ref_class”的Tag时,字符串参数将会转变为一个资源拾取器。
一个我们做的最有用的事情是: 你可以在选择多个HDA的情况下编辑参数或者输入。比如,当你选择了三四个不同的HoudiniActors的时候,只要他们来源于同一个 HDA 文件,则插件可以让你对他们的参数同时进行调整。也就是说,当你改变了一个参数后,你所选的五个HDA的这个参数都会同步修改。
我们还花了很多时间来优化 Folder 类型的UI,所以Tab、Radio、Collapsible 都得到了改进。Collapsible 真的是可折叠的了,Tab 也真的是分页了,Radio 也同样。
我们也改进了Ramp类型的UI。 之前人们所遇到的一个常见的问题是:当你在编辑Ramp曲线的时候,每当你修改了一个控制点,插件都会重新Cook。因此,我们添加了一个小选项让你可以关掉这个自动更新,这样你就可以选择在调整完了之后再Cook,从而避免在调整过程中频繁被Houdini的Cook所打断。
我们还改进了 文件 类型参数的支持。
我们还增加了对很多类型参数的支持,包括: 多行字符串 、Button Strip (条状按钮)、Log Integer (对数整数)、Log Float (对数浮点数)等等。。。
现在,所有的参数都有一个小按钮可以恢复到默认值。
另一个我们做的很有用的特性是: 我们注意到人们有很多使用资源引用的需求,比如材质、Instance、等。在第一版中,你需要右键资源,复制资源的引用字符串,然后粘贴到字符串参数中。而在第二版中你不需要这么做了,你只需要简单地将内容浏览器中的资源拖动到字符串参数上就行了,插件会自动将资源的引用字符串填给参数。
与前者相关的一个特性是: 如果你有一个字符串参数,而它有一个名字是 unreal_ref 的Tag。则插件会将其自动转换为一个资源拾取器。同理,如果你想选择一个类,则添加名为 unreal_ref_class 的Tag。
What's new? - 综合
下面,让我们来谈谈我们对插件所做的一些更综合性的更改
我们完全翻新了一遍插件的UI,有了一些新的精致的图标,还有个“Houdini Engine” 菜单包含了插件中一些有用的快捷方式。
我们做的另一个不错的功能是: 你现在可以在内容浏览器中直接导入 bgeo 文件了。当前它只支持 mesh 和 instance,但本质上它也被HoudiniEngine用同样的方式处理,因此它的表现和 HDA 的输出是一样的,相关的attribute也是一样的规则。
bgeo:binary geometry,Houdini使用的二进制几何体文件我们还添加了同步session的功能。你可以在菜单中选择用同步模式启动 Houdini 的 session。 我们也添加了视窗的同步功能。所以你可以让Houdini与UE4的视窗同步,或是一方控制另一方。
我们还做了与第一版所创建的数据进行“部分向下兼容”的功能。如果你有一个使用第一版插件的项目,则第二版会尽量保留组件、参数、输入等等。
下面我们看下 session同步 的效果。范例来自于Simon Verstraete 左侧是UE4编辑器,右侧是同步连接模式的Houdini。 另外我们也同步了视窗。
正如你所见,我可以在Houdini中直接修改控制HDA的曲线,使用普通的控制器来移动控制点,然后可以看到在UE4中结果得到更新。
而在UE4中,我们也可以做些修改。你会注意到这些修改会被自动同步到Houdini中:
使用“session同步”很棒的一点是:它是个非常好的调试工具。
另外,如果你的HDA是在Houdini中有个比较复杂的交互方式,或者说使用了Python State,有自定义的控制手柄而它们很难在UE4编辑器里复现。那么你就可以通过这种方式在Houdini中操控了。
What's new? - 蓝图支持
我们在第二版中添加的另一个重要特性是“蓝图支持”。
我觉得当讨论“蓝图支持”的时候,应该说得更具体一些。因为所谓的“蓝图支持”可以指很多东西。
现在,你可以在蓝图编辑器中直接使用HoudiniAssetComponent。这意味着你的HoudiniAsset可以被蓝图化了。
所以,你现在可以在一个蓝图Actor上预制和使用HDA。
例如,对于之前的那个“树木生成器”,我就可以在一个蓝图Actor中使用它,生成一种树,预制一些参数,然后我可以放置一些实例。随后我总是可以再回来打开这个蓝图,修改一些参数,而这将自动更新该蓝图的所有放置的实例。
当前我们在蓝图中仅支持StaticMesh和instance。 我们也没有支持所有的输入类型,当前我们只支持Geometry Input 和 Curve Input。我们有计划为蓝图做一个与World Input 等价的功能。
有一件很重要的事情是: 你不能对蓝图Actor逐实例修改参数或输入——你只能对这个蓝图类修改,它将影响所有的实例。 原因是——
that's because blueprints are very sensitive.
so they would re-cook automatically, if you sneeze around them, if you look them the wrong way, a blueprint will automatically re-cook, which in houdini terms would mean that the HDA would need to be updated cooking in houdini and the result updating.
if you move the blueprint, same thing the HDA the blueprint construction script runs again, the blueprint is reconstructed and created again.
so because of that we could not basically support per instance modification of blueprints. and that's why we went with that per class. so basically you can set a different type of inputs and parameters per blueprint actor. but unfortunately you cannot modify per instance because that was very very costly actually when used.
译注:个人理解的大致意思是——
这是因为蓝图非常地“敏感”——随便动一下他们都会重新运行一遍 构建脚本(construction script)。如果你支持了逐实例地修改参数或输入,你也需要在运行构建脚本时重新对HDA进行cook然后更新结果,而这样其实花费很高。
下面是一个使用蓝图的快速范例:
首先,创建一个简单的蓝图。
在蓝图编辑器中打开它。 然后你可以添加HoudiniAssetComponent,并指定使用的 HDA 文件是哪个。
之后,你就可以在蓝图编辑器内直接访问其参数和输入。 现在我在用一个树木生成器,我要定义一种树的类型。
你可以在蓝图编辑器中调整曲线、改变材质引用、和所有所有的东西。
然后,我会保存这个蓝图类。 之后就像其他蓝图那样可以在场景中实例化。
如果我觉得“哦,它看起来不太好”,我就总是可以返回蓝图编辑器然后进行一些调整。 当你调整蓝图类时,你放在场景中的所有实例都会自动地调整。
我们在之前就总是被问什么时候能给插件做个 “预制(preset)” 系统。现在在UE4中,蓝图就是个简单好用的选择。
What's new? - PDG Asset Link
PDG: Procedural Dependency Graph,程序化依赖网络 另一个比较重要的需求是 PDG Asset Link (PDG资产链接)。 我们在第二版中对它有了支持,和Unity插件中类似。
PDG Asset Link 所做的事情就是:当你将一个包含 TOP 网络的HDA拖入视窗时,插件会自动找到其中的TOP网络,并为其在细节面板中创建一个 PDG Asset Link 界面。
而 PDG Asset Link 界面可以让你控制TOP网络,暴露出一些节点。让你可以dirty一个节点然后cook,让你可以决定是否在UE4中自动读取TOP节点的结果。
默认情况下,我们使用一系列前缀(或者说命名过滤)来决定:“一个节点是否应该在UE4编辑器中可见?”、“我们是否要在一个节点准备好后立即自动导入该节点的结果?”
默认情况下我们用如下规则(你也可以更改前缀的名字):
HE_前缀用来表示这个节点在 PDG Asset Link 界面中是可见的(或者说被暴露出来) HE_OUT_前缀表示:一旦这些节点的 work item 产生了可用的结果,我们就自动地读取这些结果到UE4编辑器中。
你知道的,PDG中有很多 Asset、很多 work item。为了尽量减少在UE4线程(或者说编辑器线程)中的数据加载,我们在第二版中可以使用 异步导入的Commandlet(译注:见HoudiniGeoImportCommandlet)。
它其实就是一个在后台运行的UE4的Commandlet。它会将 bgeo 文件转变为UE4的资源,也就是做Houdini到UE4的转换工作——这是一项繁重的工作。当完成后,它会通知插件,而随后编辑器内的开销就只是将它们实例化——这样任务就轻松很多。
因此,这个Commandlet会在另一个线程中持续地执行任务,导入 work item 的结果(或者说PDG进行Cook的结果),它为UE4的编辑器线程减轻了很多工作量。
这个 异步导入的Commandlet 也并非只能在PDG中使用。 只要是你想自动导入bgeo文件,你都可以用它。它可以作为一个 “目录观察者”(directory watcher),或者用来一次性的导入。
下面是个PDG Asset Link 的快速使用范例,同样来自于Simon Verstraete
你可以看到,由于HDA有TOP网络,所以在右侧出现了PDG Asset Link 的界面。 当 work item 运算完成之后(可以看到右侧PDG界面显示的信息),结果就会被自动导入到UE4编辑器中。在我们这个范例中,就会导入地形块、instance 等。
What's new? - World Composition
我们拥有的另一个非常重要的功能是对 World Composition 的支持
在第二版中,我们对 World Composition 有了支持。所以,如果你在Houdini中有分块的高度场,你可以在UE4中使用其数据来更新 World Composition 系统。
有一件重要的事情要注意: 当前仅会在 烘焙(baking) HDA的时候更新 World Composition。 因为: 如果要在cook的时候更新 World Composition,那么在修改HDA时(比如修改地形尺寸时、修改tile的数目时等等)都会触发更新。这会有一些问题,而且我们修改这么多东西UE4也会不开心。我们还需要创建子关卡、生成 streaming proxy component 等等。 因此: 我们决定让World Composition成为一个需要烘焙的东西,而不是你经常需要变化的东西。
当你烘焙一个有 分块高度场(Tiled HeightField) 的HDA时,我们将会自动地创建子关卡,并更新 World Composition 系统。随后编辑器就会知道——好的,这些是新的Tile,他们应该被这样安排,被这样存储。
至于 mesh 和 instance: 如果你的HDA生成多个高度场,你很可能会有植被或者几何体伴随他们生成。你可以使用unreal_level_path属性来指定一个 mesh 或 instance 要生成在哪个关卡。这让你可以创建复杂的系统——在一个HDA中有多个子关卡,并且还伴随有几何体一同生成。
我们还有一个相当有用的 属性标记(attribute token) 系统,可用于动态地组合一些路径字符串,图中是一些范例。注意波浪括号{}里的就是 属性标记 ,他们基本上是动态的。比如world就会是当前世界的路径,tile就是Tile的编号,还有其他的一些东西。
比起手动地拼写一些字符串,显然使用属性标记 更好,因为这样更容易且更灵活。
下面是个 World Composition 的范例,同样来自于Simon
这里的地形Tile都是由烘焙一个HDA生成的。你可以看到当角色奔跑的时候,World Composition 系统会动态地决定每个地形块的可见性,选择移除一些地形,或是加载一些地形。
在哪得到插件
好了,现在已经总结了我们在第二版中实现的新功能了。 而你要问的第一个问题可能是:那么我可以在哪得到第二版插件呢?
第二版 与18.5版本一同发行 UE4.25和26的二进制库和源代码都有。(Mac只有4.25的库)
与 UE4.26,25,24,23 都兼容
源代码可以在第二版插件代码GIT仓库中得到
18.5版本同时有第一版和第二版
插件不再会被自动安装,而是需要手动拷贝到UE4的插件文件夹(UE4.2X/Engine/Plugins/Runtime)首先,第二版插件是跟随18.5版本一起发行的,包含有二进制的库以及源代码,包含的版本有UE4.25和UE4.26(Mac版的UE4.25只有二进制库)。
不过,插件对UE4的 26、25、24、23版本都兼容。你可以在 第二版插件代码GIT仓库 中得到源代码。
当前,18.5版本中同时有第一版和第二版插件。我们准备废弃掉第一版插件,但是有些人可能还在使用。
由于现在有两个版本插件,所以插件不会像之前那样会自动安装到UE4中了。这意味着你需要在安装的时候勾选Houdini Engine For Unreal,然后前往Houdini的安装目录中,找到HoudiniEngine的目录以及对应的版本,最后手动拷贝到UE4插件的Runtime目录(译者注:也可以拷贝到工程的插件目录)。
3. Houdini Niagara 插件
好的,下面我们来谈谈我们为UE准备的另一个插件——Niagara插件。
正如名字所暗示的,这个插件让你可以将Houdini中的数据导入到UE的Niagara系统中。
插件会在Niagara中添加一个Houdini数据接口。
它还支持点缓存资源(PointCache Asset) ,包括 hcsv文件(大致上就是导出的csv文件)、json文件、或者二进制的json文件(效率更高)。
这些 点缓存资源 会包含粒子系统中点的信息,你可以导入他们,随后在Niagara中直接在Houdini数据接口上访问它们。
点缓存资源 本身可以是静态的,他们将代表粒子系统中一个点的位置。也就是之前我们展示的一些demo,我们创建了一些有冲击力的点,然后进行模拟运动。
而在最新版的Niagara插件中,你也可以导出动画点云,它可以来自粒子系统、FLIP流体、刚体模拟。这意味你现在可以追踪粒子系统的其他属性,比如颜色、年龄、等等任何你关心的属性。
数据接口对CPU和GPU模拟都兼容。 在Niagara这边,我们还有个不错的更新(只针对于4.26):我们为GPU使用Shared Buffer。这是一个很好的优化,基本上意味着当在同一发射器中多次访问点缓存 时,你只需要访问一次buffer,因此这个点缓存 只需要一个buffer。
Houdini Niagara插件现在可以在 HoudiniNiagara插件GIT仓库 中下载。 它之前是直接跟随UE引擎一同发行的。但是Epic 现在已经决定把这个插件还给我们了。 因此,你现在只能从GIT仓库中下载。但我们很快就会把它添加到Houdini的安装中。
这里有个关于流体模拟的小范例。 这些粒子是在Houdini中被创建的,然后被导出成点缓存 ,随后在UE中回放:
下面是另一个范例。这个柱子重建的动画是从Houdini中导出的。
由于这是个Niagara系统,所以你总可以让它更动态一点。这里当角色和柱子碰撞后,在UE中使用了物理系统将他们打碎。
最后一个范例。这个桥的重建动画是在Houdini中做的:
这就是所有关于Niagara插件的东西了。 如果你想了解更多,你可以到SideFX 官网上,里面有很多教程教你怎么使用。
4. Houdini KineFX 实时链接插件
最后,谈一下我们最近与Houdini18.5一起发布的第三个插件——Houdini 实时链接插件,也就是 Houdini KineFX 实时链接插件。
基本上,它是一个用于建立Houdini和UE之间实时链接的插件。 它让你可以直接在Houdini中控制UE里的绑定,使用的是KineFX——我们最新的绑定与动画系统(特点是完全在SOP节点中工作),是18.5版本的新功能。
使用时,你需要先在UE中启用实时链接插件,然后再启用Houdini的实时链接插件。这时你就会有一个新的Source——Houdini Live Link。之后,插件会附带一个HDA(ue4_livelink.hda),它负责传输数据,并通过实时链接插件来直接设定骨骼的transform。
我们将通过WebServer来将UE4与那个HDA进行链接。
而且就像我之前说的,这些需要KineFX。
当前,如果你想玩玩这个插件,你需要从HoudiniLiveLink插件GIT仓库中下载。 我们很快也会将其添加到Houdini的安装中。
下面是路易斯几个月前做的一个范例,展示了实时链接的功能。
你可以看到,路易斯在下面,穿着一个动作捕捉套件,它会将数据传递给动作捕捉软件(右上侧)。然后动作捕捉软件会使用Houdini。正如你能看到的,我们将一个“人类”的绑定 重定向(re-target) 为了一个“恐龙和骑着它的小家伙”的绑定。最后,实时链接插件将结果传给UE。
概括来说:
动作先从真人传到动作捕捉软件中 动作捕捉软件使用Houdini将动作重定向到恐龙上 最后实时链接插件将最终的动作传递给UE
5. 路线图
总结一下,现在让我们谈谈关于Houdini插件接下来会有什么。
修复BUG和打磨 instance、属性、烘焙、地形、PDG。。。 改善文档,增加范例HDA,回归测试。对地形编辑层的支持插件API(Python或蓝图)KineFX相关特性 骨骼Mesh与动画的导入导出优化session同步 “将UE数据传入Houdini”,输入的优化UE5的集成 UE5会用第二版插件UE5相关的特性(待做):Nanite,World Partition。。。
当前,我们集中于修复BUG和打磨插件。我们有一些问题要修复,关于 instance、属性、烘焙、地形 等。 我们还需要改善一下文档,我们想提供一些范例HDA。 我们目前也正在为插件添加回归测试。
关于新特性,我们首先考虑的是对地形编辑层的支持。这是UE4.25版本添加的新特性,不幸的是这个特性出现得太晚了,当时我们已经在第二版的开发后期了,但我们也想对它支持。
地形编辑层 的思路就是让地形的编辑成为一个“非破坏性”的操作,就像Photoshop中的“图层”一样。这对于Houdini的程序化编辑层来说是一个完美的插入时机,因为它不会影响在这之前或之后的手动雕刻或是其他什么操作。
我们还想为插件暴露出API。我们想让Python或蓝图有能力做一些基础的操作,比如设置参数、设置输入、触发cook或是烘焙等等。
我们还有一组与KineFX相关的功能。 我们正在研究在houdini中导入和导出骨骼mesh和动画。
我们还花了一些时间改善session同步。 我们想让UE中的数据也能传入到Houdini。我们需要对数据进行一些优化,防止一个mesh在Houdini那边被创建多次。
还有一个显而易见的重要问题是——UE5将在今年来临。 我们有一个能在UE5上运行的V2插件版本。因此针对UE5的插件版本仍旧是V2而不是一个独立的“V3”。 此外还有一些UE5相关的特性,包括Nanite,还有会取代World Composition 的 World Partition,等等。但不幸的是我不能透露太多。
学习资源
想学更多的东西?
Houdini Engine:
虚幻引擎的HoudiniEngine插件 - Simon Verstraete
https://vimeo.com/473042636
Simon Verstraete 的教程:
- 程序化沙漠:
https://www.sidefx.com/tutorials/procedural-desert/
- Session同步:
https://www.sidefx.com/tutorials/houdini-engine-for-ue4-session-sync/
- 使用BSP做建筑:
https://www.sidefx.com/tutorials/bsp-to-building-ue4/
官方文档:
https://www.sidefx.com/docs/unreal/
UE4入门包:
https://www.sidefx.com/tutorials/ue4-starter-kit/
Houdini Niagara:
将Houdini数据导入到UE4的Niagara - Mike Lyndon
https://www.sidefx.com/tutorials/houdini-to-ue4s-niagara/
如果你想学更多关于HoudiniEngine的东西,我们官网上也有Simon做的大量的教程。Simon 将会讨论第二版插件功能的很多细节,如何使用World Composition、如何使用PDG Asset Link等。还有一些配套的范例文件。
你还可以参考插件的文档。
如果你是插件的初学者,你可以看看我们官网上的“UE4入门包”,里面有一系列入门级别的HDA。
对于Houdini Niagara 插件,Mike Lyndon 制作了一个很棒的教程。
页:
[1]