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的结果:
大佬威武 看江忆冰windup的藤蔓部分讲解了下,原来基础方法在这里 pack geometry before merging这个参数在C#里如何拾取
页:
[1]