All Houdini Unreal Engine 4

Houdini Foliage Bake to levels 实现

 
 

Bake foliage 默认情况下是属于 GWorld->GetCurrentLevel(); 因此就是 Level 面板下当前level是哪个,就生成在哪个level里面。

 
 

每个 level 里面拥有 AInstancedFoliageActor 对象,就是用来存储 Foliage 信息的。

 
 

Houdini 回吐给 unreal 的信息里面的 HoudiniAssetComponent->GetAllInstanceInputFields(); 就是可以bake foliage 的信息来源。这里存成 UHoudiniAssetInstanceInputField 数组。这个 UHoudiniAssetInstanceInputField 对象里面会存 instance 对象以及所有的 transform

 
 

找到了位置就可以修改了。

 
 

首先需要知道每个子关卡的边界区域,这个在unreal里面由ALevelBounds这个对象来存储,你在创建子地图的时候,都会有这个对象被创建出来。

但是包括光照等所有的子地图都有这个对象来标记划分,因此我们需要一个标记来实现,因此我们增加了 bUseFoliageBound 对象来让用户标记哪些框框参与划分植被。

 
 

这里还有一个改动,我们知道AActor对象有一个函数 GetLevel 是获取其当前所在的level的,但是这个函数获取的是当前所在的开启的关卡,而不是主关卡里面的这个Bound应该属于哪个子关卡。

因此我们需要添加一个对象来记录这个ALevelBounds是属于哪个子关卡的。

赋值位置

 
 

然后我们需要提供按钮给用户操作,改造原来的Bake按钮

原来Bake默认就是Bake到当前level,因此我们这里改造一下添加两个按钮极其响应函数,保留原来的函数执行的基础上,添加新的Bake功能。

按钮执行函数里面的实现就是调用我们后续改造的BakeFoliage函数。

 
 

Bake函数的改造也是一样,我们添加了两个新的处理函数对接按钮。同时旧的函数参数做了修改。首先你需要传递目标Level,这个就是植被应该被bake到的地方,然后是两个在启用LevelsBake的时候才用的到的参数,第一个是bUseFoliageBound的值,第二个是Bound的值。为什么这么设计看下方。

 
 

BakeHoudiniActorToFoliage 函数为了兼容原来的bake模式,如果用户继续只需要bake到当前level,那么就只需要输入 ULevel* DesiredLevel 参数为当前level即可。这就是原来的bake函数的改造思路。

而函数里面则通过 bUseFoliageBound 来区分是否使用边界判断。

新的 BakeHoudiniActorToFoliageLevels 里面核心就是获取当前场景内的所有的 ALevelBounds,然后对于每一个 ALevelBounds,我们去调用 BakeHoudiniActorToFoliage 来做bake即可。
 

 
 

 
 

BUGBound存在overlap的话,交界处会同时在两个子level生成foliage对象

 
 

因此这边的实现思路就是在Bake出Foliage的同时,会修改用于存储instance对象的UHoudiniAssetInstanceInputField。使得已经bake完的instancetransform从这个对象的存储中删掉,这样就保证不会出现一个Foliage同时bake到多个levels的情况。

 
 

UHoudiniAssetInstanceInputField 里面添加一个Set函数

 
 

FHoudiniEngineBakeUtils::BakeHoudiniActorToFoliage 函数里面多创建一个数组UnprocessedTransforms

对于不在区域内的Foliageinstance回写给HoudiniAssetInstanceInputField即可实现。