了解OpenGL ES 2.0中的索引

时间:2015-11-26 18:15:18

标签: java android opengl-es-2.0

我知道有很多关于指数的问题,但没有一个能解决我的问题。我试图将一个装有漫射光源的模型放入openGl ES并旋转它。我首先开始使用3D立方体并设法旋转它。然后我添加了一个光源。这也没有出现故障。现在我正在尝试从它的.obj文件加载模型并将其旋转以代替多维数据集。我尝试了两个.obj转换器,但它没有为我做这个技巧。然后我创建了自己的.obj导入器,结果是一样的。我得到一个扭曲的图像(照明和旋转仍然适用于扭曲的模型)。现在我觉得我对指数的了解可能不完整。

我正在做的是创建一个vertexPositionArray []来存储顶点信息,并创建一个vertexNormalArray []来存储相应的法线,比例为1:1。现在我创建一个indexArray,它存储应该调用位置和法线的顺序。 例如。如果我传入3,5,6,我指的是vertexPositionArray []和vertexNormalArray []中的第3,第5,第6个位置或只是vertexPositionArray?

This is a model that i want to use in my project, and on the sides are the output i am getting

这是我用来从.obj文件中提取所需信息的一段代码:

 String[] vData={"-1.000000f, 0.000000f, 1.000000f,",
                "1.000000f, 0.000000f, 1.000000f,",
                "-1.000000f, 0.000000f, -1.000000f,",
                "1.000000f, 0.000000f, -1.000000f,",
                "0.513184f, 0.000000f, 0.513184f,",
                "0.513184f, 0.000000f, -0.513184f,",
                "-0.513184f, 0.000000f, -0.513184f,",
                "-0.513184f, 0.000000f, 0.513184f,",
                "0.158195f, 0.690612f, 0.158195f,",
                "0.158195f, 0.690612f, -0.158195f,",
                "-0.158195f, 0.690612f, -0.158195f,",
                 "-0.158195f, 0.690612f, 0.158195f,"};

String[] nData={"-0.889400f, 0.457200f, 0.000000f,",
                "0.000000f, -1.000000f, 0.000000f,",
                "0.000000f, 1.000000f, 0.000000f,",
                "0.889400f, 0.457200f, 0.000000f,",
                "0.000000f, 0.457200f, 0.889400f,",
                "0.000000f, 0.457200f, -0.889400f,"};
int[] vOrder={8, 12, 11,
            6, 5, 3,
            7, 6, 1,
            8, 7, 2,
            5, 8, 4,
            11, 12, 9,
            6, 10, 9,
            5, 9, 12,
            7, 11, 10,
            7, 8, 11,
            1, 6, 3,
            2, 7, 1,
            4, 8, 2,
            3, 5, 4,
            10, 11, 9,
            5, 6, 9,
            8, 5, 12,
            6, 7, 10};

int[] nOrder={ 1, 1, 1,
             2, 2, 2,
             2, 2, 2,
             2, 2, 2,
             2, 2, 2,
             3, 3, 3,
             4, 4, 4,
             5, 5, 5,
             6, 6, 6,
             1, 1, 1,
             3, 3, 3,
             3, 3, 3,
             3, 3, 3,
             3, 3, 3,
             3, 3, 3,
             4, 4, 4,
             5, 5, 5,
             6, 6, 6,
};

FileWriter write = new FileWriter( path , false);
PrintWriter print_line = new PrintWriter( write );

print_line.println("float[] vertexData ={");
for(int i=0;i<vOrder.length;i++)
{
    print_line.println(vData[vOrder[i]-1]);
    vCount++;
}
print_line.println("};");


print_line.println("float[] vertexNormal ={");
for(int i=0;i<nOrder.length;i++)
{
    print_line.println(nData[nOrder[i]-1]);
}
print_line.println("};");

print_line.println("Vertex Count = "+vCount);

print_line.close();
}    
}

我通过在文本编辑器中使用replace函数从obj文件中获取了vData(vertex)和nData(normals)。同样地,我通过下面给出的面上的数据获得了vOrder和nOrder(将'//'之前的数字添加到vOrder,将之后的数字添加到nOrder之后):

f 8//1 12//1 11//1
f 6//2 5//2 3//2
f 7//2 6//2 1//2
f 8//2 7//2 2//2
f 5//2 8//2 4//2
f 11//3 12//3 9//3
f 6//4 10//4 9//4
f 5//5 9//5 12//5
f 7//6 11//6 10//6
f 7//1 8//1 11//1
f 1//3 6//3 3//3
f 2//3 7//3 1//3
f 4//3 8//3 2//3
f 3//3 5//3 4//3
f 10//3 11//3 9//3
f 5//4 6//4 9//4
f 8//5 5//5 12//5
f 6//6 7//6 10//6

有谁能告诉我这是错的我在这里?

提前致谢。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

如果我传入3,5,6,我指的是vertexPositionArray []和vertexNormalArray []中的第3,第5,第6个位置,或者仅仅是vertexPositionArray? 的两个

我需要将我的位置和普通数组绑定到1个数组中吗? ,但您可以,不需要。

告诉我是否正确理解.obj文件: - f 8 // 1 5 // 4 6 // 3为此我将vertexPositionArray [7]和vertexNormalArray [0]推入新的vertexPArray []和vertexNArray [],分别。

是的,因为Obj文件根本与OpenGL无关。

在OpenGL中,你只能有一个索引数组但是OBJ文件,你可以有三种类型的内(f v1 / vt1 / vn1 v2 / vt2 / vn2 v3 / vt3 / vn3 ....)所以你应该创建你的新vertexPArray []和vertexNArray []使用faces数据。