前言

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

同样,这个范例材质也需要复制出一份然后修改贴图:
在这里插入图片描述
效果:
在这里插入图片描述

问题记录

中间还碰到了工具没有导出贴图的问题,我将它记录在了这里

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐