导出对象时如何排序三角形



我试图用unity导出一个网格到一个对象,我发现了2个脚本,但他们导出三角形的方式是完全不同的,我想了解他们每个人的原因:

:

        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));
            }

链接:http://wiki.unity3d.com/index.php?title=ExportOBJ

第一种方法效果很好,第二种方法也很好,但它在向上轴上旋转了180度。问题是,我不明白为什么他们需要在第一种方法上重新排列三角形分量而仍然有效为什么第二种方法中的正常分量符号与位置分量符号不匹配但仍然有效

我不明白他们为什么要重新排列三角形分量

许多渲染器使用三角形点的顺序来指示多边形的哪一边是三角形的"前"或"后"。如果启用了背面剔除,这一点尤为重要。

你可以尝试在一个网格上混合顺时针和逆时针的三角形;Unity的默认行为将剔除背面,你最终会看到一堆洞!

在导入/导出几何数据时,翻转一两个轴是相当常见的。如果所有的文件格式都能在这方面达成一致,那就方便多了,但有时并不是这样。

最新更新