学习在Houdini中将PivotPainter(2.0)数据导入给UE
前言UE的PivotPainter现在有两版,区别在于2.0版使用贴图来存储信息,而1.0版使用顶点信息比如顶点色和额外的UV通道。Houdini的工具也是对应了两版,之前的博客《学习在Houdini中将PivotPainter(1.0)数据导入给UE》尝试了1.0版本。本篇将对 2.0 版本进行尝试。主要参考的资源还是 https://www.sidefx.com/tutorials/pivot
前言
UE的PivotPainter现在有两版,区别在于2.0版使用贴图来存储信息,而1.0版使用顶点信息比如顶点色和额外的UV通道。Houdini的工具也是对应了两版,之前的博客《学习在Houdini中将PivotPainter(1.0)数据导入给UE》尝试了1.0版本。本篇将对 2.0 版本进行尝试。
主要参考的资源还是 https://www.sidefx.com/tutorials/pivot-painter-version-1-and-2/,时间可以从 9:58 开始。
实验1:按次序降落物体
这个实验将尝试导出这个范例对应的数据,当然结果也会使用相同的材质做预览:
测试节点
测试节点和之前类似:
其中 point wrangle节点的代码如下:
@N = set(0,1,0);
s@hierarchy = "root/" + itoa(@ptnum);
i@selectionIndex = @ptnum;
其中:
hierarchy
属性是 2.0 版本所需要看的pivot点上的属性。我这里单纯将其指定为root后跟顶点数。selectionIndex
表示一个“次序”,这个次序将在随后导出到贴图中。
pivot点(左)和几何体(右)显示如下:
导出
在 PivotPainter 节点中,除了要将 Mode 改为 2.0 之外,还需要注意导出的贴图:
其中:
- 贴图 1 的 RGB 是 pivot点位置。
- 贴图 1 的 Alpha通道是物体的 “次序”,也就是
selectionIndex
属性。 - 贴图 2 的 RGB 是物体的 X方向。
- 贴图 2 的 Alpha通道是一个随机值。(暂时用不到)
点击导出后,将导出模型与两张贴图:
可以留意,由于贴图1中的数据是16位的,因此存为了exr格式,而贴图2是8位的,所以存为了TGA格式。
导入UE
导入UE时,注意需要修改一些贴图的属性:
随后,我将使用ContentExamples中 PivotPainter2 场景中的材质作为测试。
不过,这个材质并没有将自己的纹理暴露成子材质参数,所以需要复制一份这个材质然后替换其中的贴图:
上面的纹理名原先叫 Box042_rgb_XVector_a_Random0-1_UV_2 ,也就是将 XVector存在了RGB,将0~1的随机值存在了A通道,也就是对应我刚导出的纹理test2_RGB_XVector_A_Random0-1_UV2。而下面的纹理名原先叫B42_PivPos_SelOrder_IntAsFloat_UV_2,也可以判断出是对应我刚导出的test2_RGB_PivotPos_A_SelectionOrder_IntAsFloat_UV2。
替换以后,效果如下:
可以看到实现了相同的,按照次序逐渐下落的逻辑。也就是说数据导出时没问题的。
实验2:按层级深度缩放物体
这个实验将会尝试导出这个范例对应的数据,当然结果也会使用相同的材质做预览:
测试节点
“层级深度”顾名思义,归一化后根部是0,叶子最末端是1,中间即为0~1。它的原理很简单,不过如何构建这样一个像模像样的测试数据,还需要些功夫。虽然官方给出了范例文件,不过我希望自己构建一个更简化的数据。
下面是我构建的测试数据(当然,在实际项目中应该没有用到这样方式的机会)
我注意到 L-System 节点可以直接创建一个树状的效果:
但它本身并没自带层级属性,也没有带方向属性。因此我在想是否有方法可以计算出层级和方向。
观察后我发现方式很简单:只需要遍历每个点,找到与其相邻的且顶点号比它小的点,就可视其为父。知道父点后,层级就是父点的层级再附带加上自己这个点的号,而方向就是自己这个点的方向减去父点的方向。
不过实现起来有需要注意的地方。想到“遍历”,第一个想到的是用 Point 级别的Wrangle节点,然而这对于“方向”是可以但对“层级”却不行。因为在每个点计算“层级”的时候,其父点的层级必须已经计算好了。所以最后我的代码是在 Detail 级别:
string hierarchyData[];
resize(hierarchyData, @numpt);
hierarchyData[0] = "root";
//按递增的顺序遍历所有的顶点,i表示第i个顶点,即顶点号
for(int i=0; i<@numpt; i++)
{
//遍历所有的邻居,n表示第n个邻居
for(int n=0; n<neighbourcount(0, i); n++)
{
//这个邻居的顶点号:
int NeighbourPointNumber = neighbour(0, i, n);
//假如邻居的顶点号小于此顶点号,则视其为父
if(NeighbourPointNumber < i)
{
//设置法线:
{
//法线的值应该是此点减去父点:
vector N = pointattrib(0,"P",i,0) - pointattrib(0,"P",NeighbourPointNumber,0);
//设置属性:
setpointattrib(0,"N",i,N);
}
//设置层级
{
//层级的字符串应该是父项加上自己
hierarchyData[i] = hierarchyData[NeighbourPointNumber] + "/" + itoa(i);
//设置属性:
setpointattrib(0,"hierarchy",i,hierarchyData[i]);
}
}
}
}
整体的节点和之前类似,模型的样子如下:
导出
- 贴图 1 的 RGB 是 pivot点位置。
- 贴图 1 的 Alpha通道是物体的 父物体的序号 (暂时用不到)
- 贴图 2 的 RGB 是物体的 X方向。
- 贴图 2 的 Alpha通道是一个 层级深度。
导入UE
同样,这个范例材质也需要复制出一份然后修改贴图:
效果:
问题记录
中间还碰到了工具没有导出贴图的问题,我将它记录在了这里。
更多推荐
所有评论(0)