找回密码
 立即注册
查看: 414|回复: 3

[笔记] unity提交unity数据到houdini

[复制链接]
发表于 2021-11-25 21:15 | 显示全部楼层 |阅读模式
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[nodeID1].position);
                vertexList.Add(m_nodeList[nodeID2].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的结果:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2021-11-25 21:22 | 显示全部楼层
大佬威武
发表于 2021-11-25 21:24 | 显示全部楼层
看江忆冰windup的藤蔓部分讲解了下,原来基础方法在这里
发表于 2021-11-25 21:30 | 显示全部楼层
pack geometry before merging这个参数在C#里如何拾取
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-5-10 17:48 , Processed in 0.094561 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表