我试图将网格导出到具有统一性的obj中,我发现有两个脚本可以实现,但是它们导出三角形的方式完全不同,我想了解每个网格的原因:
第一
foreach(Vector3 lv in m.vertices)
{
Vector3 wv = mf.transform.TransformPoint(lv);
//This is sort of ugly - inverting x-component since we're in
//a different coordinate system than "everyone" is "used to".
sb.Append(string.Format("v {0} {1} {2}\n",-wv.x,wv.y,wv.z));
}
foreach(Vector3 lv in m.normals)
{
Vector3 wv = mf.transform.TransformDirection(lv);
sb.Append}
for (int i=0;i<triangles.Length;i+=3)
{
//Because we inverted the x-component, we also needed to alter the triangle winding.
sb.Append(string.Format("f {1}/{1}/{1} {0}/{0}/{0} {2}/{2}/{2}\n",
triangles[i]+1 + vertexOffset, triangles[i+1]+1 + normalOffset, triangles[i+2]+1 + uvOffset));
}
(我保留了评论),http://wiki.unity3d.com/index.php?title=ObjExporter
这是第一种方法,第二种方法是:
foreach(Vector3 vv in m.vertices)
{
Vector3 v = t.TransformPoint(vv);
numVertices++;
sb.Append(string.Format("v {0} {1} {2}\n",v.x,v.y,-v.z));
}
sb.Append("\n");
foreach(Vector3 nn in m.normals)
{
Vector3 v = r * nn;
sb.Append(string.Format("vn {0} {1} {2}\n",-v.x,-v.y,v.z));
}
for (int i=0;i<triangles.Length;i+=3) {
sb.Append(string.Format("f {0}/{0}/{0} {1}/{1}/{1} {2}/{2}/{2}\n",
triangles[i]+1+StartIndex, triangles[i+1]+1+StartIndex, triangles[i+2]+1+StartIndex));
}
link:http://wiki.unity3d.com/index.php?title=ExportOBJ
第一种方法完美无缺,第二种方法也是如此,但它在向上轴上旋转180度。 问题是我不明白为什么他们需要在第一种方法上重新排序三角形组件并且仍然有效以及为什么第二种方法中的正常组件符号与位置组件符号不匹配但仍然有效< / p>
答案 0 :(得分:2)
我不明白为什么他们需要重新排序三角形组件
许多渲染器使用三角形点的顺序来指示多边形的哪一边是&#34;前面&#34;或&#34;返回&#34;三角形如果启用了背面剔除,这一点尤为重要。
您可以尝试在网格上混合顺时针和逆时针三角形; Unity的默认行为会剔除背面,你最终会看到一堆洞!
导入/导出几何数据时,翻转一个或两个轴是相当常见的。如果每种文件格式都同意这种事情会很方便,但有时它们不会。