Object 导出obj时如何对三角形进行排序

Object 导出obj时如何对三角形进行排序,object,opengl,unity3d,3d,Object,Opengl,Unity3d,3d,我正在尝试使用unity将网格导出到obj中,我发现有两个脚本可以这样做,但它们导出三角形的方式非常不同,我想了解其中每一个的原因: 第一: foreach(Vector3 lv in m.vertices) { Vector3 wv = mf.transform.TransformPoint(lv); //This is sort of ugly - inverting x-component since we

我正在尝试使用unity将网格导出到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));
            }
foreach(向量3 lv,单位:m.顶点)
{
Vector3 wv=mf.transform.TransformPoint(lv);
//这是一种丑陋的反转x分量,因为我们在
//与“每个人”不同的坐标系是“习惯于”。
sb.Append(string.Format(“v{0}{1}{2}\n”,-wv.x,wv.y,wv.z));
}
foreach(向量3 lv,单位为m.法线)
{
Vector3 wv=mf.transform.TransformDirection(lv);
sb.Append}
对于(int i=0;i
我不明白他们为什么需要重新排列三角形组件

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

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

在导入/导出几何体数据时,翻转一个或两个轴是相当常见的。如果每个文件格式都同意这类事情,这会很方便,但有时它们不同意

我不明白他们为什么需要重新排列三角形组件

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

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

在导入/导出几何体数据时,翻转一个或两个轴是相当常见的。如果每个文件格式都同意这类事情,这会很方便,但有时它们不同意

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