NoiseFloor 发表于 2021-11-25 21:15

unity提交unity数据到houdini

hda中的curve、paint等节点的ui可以通过houdini engine暴露到游戏引擎里,但比较简陋,不是很好用。




如果想更自由,可以自己写编辑器界面,然后把生成的数据传给hda进行处理,最终结果再返回到unity。恰好unity编辑器开发又比较简单,看起来还挺有前途。所以,试验了一下unity mesh传入hda的功能。
一,简单试验
新建hda并添加operator path控件,则对应到unity里会生成如下面板:


input给一个unity自带的sphere。
hda中简单放一个extrude操作


cook结果:


可见,是生效的。
在debug中可以看到数据如下:
point数据只有position


vertex数据有normal和uv


prim数据有节点名称和材质名称


如果有多个input,可以通过节点名称unity_input_mesh_name来进行区分,如:


二,其它试验
1,Pack Geometry Before Merging


如果勾选Pack Geometry Before Merging,则每个输入节点单独pack为一个prim。hda里要先unpack再进行处理。
2,uv2,uv3...
unity中用脚本对mesh添加uv2数据:
Mesh mesh=GetComponent<MeshFilter>().mesh;
      Vector3[] vertList=mesh.vertices;
      int vertexCount= vertList.Length;
      List<Vector2> vList = new List<Vector2>();
      for (int i = 0; i < vertexCount; i++) {
            vList.Add(new Vector2(0,1));
      }
      mesh.uv2 = vList.ToArray();
      GetComponent<MeshFilter>().mesh = mesh;debug查看发现hda里没有uv2数据。
翻houdini engine for unity代码,HEU_InputInterfaceMesh.cs里的UploadData函数,发现里面确实是只处理了uv,没处理uv2,需要自己补充。补充后可读到uv2:


unity的mesh类似乎不支持自定义顶点数据,但支持9套uv(uv和uv1~uv8),一般的信息传递需求应该够用了。
另外,其实任何数据都可以当成mesh来传(虽然可能会显得别扭),比如想把100以内素数表传给houdini,直接生成一个25个顶点的mesh,每个顶点存一个值即可。不知道是否还有更直接的数据传递方法。
三,另一个例子
比如我在unity里搞一个简单的拓扑编辑器,编辑出如下拓扑结构:


用下面c#脚本将此拓扑结构转成mesh:
Mesh mesh = new Mesh();
      List<Vector3> vertexList = new List<Vector3>();
      for (int i = 0; i < m_edgeList.Count; i++)
      {
            int nodeID1 = m_edgeList.startPointID;
            int nodeID2 = m_edgeList.endPointID;
            if (nodeID1 < m_nodeList.Count && nodeID2 < m_nodeList.Count)
            {
                vertexList.Add(m_nodeList.position);
                vertexList.Add(m_nodeList.position);
            }
      }
      mesh.vertices = vertexList.ToArray();
      List<int> triList = new List<int>();
      for (int i = 0; i < vertexList.Count;i+=2) {
            triList.Add(i);
            triList.Add(i);
            triList.Add(i+1);
      }
      mesh.triangles = triList.ToArray();
      GetComponent<MeshFilter>().sharedMesh = mesh;然后将此mesh传入hda做进一步处理。
比如这样:


返回unity的结果:

TheLudGamer 发表于 2021-11-25 21:22

大佬威武

c0d3n4m 发表于 2021-11-25 21:24

看江忆冰windup的藤蔓部分讲解了下,原来基础方法在这里

JoshWindsor 发表于 2021-11-25 21:30

pack geometry before merging这个参数在C#里如何拾取
页: [1]
查看完整版本: unity提交unity数据到houdini