Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android .obj文件三角形或三角形_Android_Opengl Es_3d_Mesh - Fatal编程技术网

Android .obj文件三角形或三角形

Android .obj文件三角形或三角形,android,opengl-es,3d,mesh,Android,Opengl Es,3d,Mesh,我正在使用Blender创建.obj文件,然后尝试编写一个自定义解析器来读取文件并创建网格。我有几个问题。我的示例是使用blender中的多维数据集,但我想将我的问题扩展到多维数据集之外 当我在blender中创建一个立方体并将其保存为.obj文件时,我得到了以下结果 # Blender v2.63 (sub 0) OBJ File: '' # www.blender.org mtllib cube.mtl o Cube_Cube.001 v -0.911915 -0.851241 1.1960

我正在使用Blender创建.obj文件,然后尝试编写一个自定义解析器来读取文件并创建网格。我有几个问题。我的示例是使用blender中的多维数据集,但我想将我的问题扩展到多维数据集之外

当我在blender中创建一个立方体并将其保存为.obj文件时,我得到了以下结果

# Blender v2.63 (sub 0) OBJ File: ''
# www.blender.org
mtllib cube.mtl
o Cube_Cube.001
v -0.911915 -0.851241 1.196067
v -0.911915 -0.851241 -0.803933
v 1.088085 -0.851241 -0.803933
v 1.088085 -0.851241 1.196067
v -0.911915 1.148759 1.196067
v -0.911915 1.148759 -0.803933
v 1.088085 1.148759 -0.803933
v 1.088085 1.148759 1.196067
usemtl 
s off
f 2 1 5 6
f 6 7 3 2
f 7 8 4 3
f 1 4 8 5
f 1 2 3 4
f 8 7 6 5
我的网格渲染方法如下所示

@Override
    public void draw(GL10 gl)
    {
        super.draw(gl);
        gl.glColor4f(255, 0, 255, 150);
        gl.glFrontFace(GL10.GL_CCW);
        gl.glEnable(GL10.GL_CULL_FACE);
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glVertexPointer(3,GL10.GL_FLOAT,0,vertexBuffer);

        gl.glDrawElements(GL10.GL_TRIANGLE_FAN,vertexBuffer.array().length,GL10.GL_UNSIGNED_SHORT,indexBuffer);
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glDisable(GL10.GL_CULL_FACE);
        gl.glColor4f(255, 255, 255, 255);
    }
如何填充索引缓冲区和顶点缓冲区以绘制此立方体。我能把所有的顶点都放在一个“抽屉元素”函数中吗?还是必须一个三角形接一个三角形?.obj文件是否会在一个面上生成四个以上的顶点?(如二维五边形或六边形?)如果是,我将如何绘制它们?.OBJ文件是否使用三角形扇形或条带


谢谢

OpenGL和图形卡只是简单的机器,它们绘制三角形的速度非常快。因此,您应该首先关注三角形。忽略四边形。四边形通常由一组两个三角形替换,您无法控制它们的划分方式。五边形和更多会带来更多的问题。忽略带和风扇太多。一般的三维模型通常只是三角形。在特殊情况下,风扇和条带可用作优化。例如,如果从高度地图以栅格的形式对景观进行建模,则三角形条带非常有用

就实际效率提升而言,如果您将缓冲区存储在GPU上,很可能不会有任何提升。如果您正在计算CPU上的数据并在每一帧将其缓冲到GPU(如果可以的话,您应该避免这样做,并且只将其存储在GPU本身),那么您可以使用三角形风扇/条带来减小缓冲区大小。但是,在光栅化过程中,除非光栅化器循环能够通过大于3个顶点的复杂形状进行迭代(我对此深表怀疑),否则无论如何都必须对多边形进行三角化

我不是一个笨重的android程序员,但如果您使用的OpenGL版本有“GenerateBuffer()”和“DrawArrays()”,请使用它们。由于使用三角形风扇/条带只能真正帮助硬件组件之间的缓冲速度,如果您的android设备没有专用的图形设备,则可能无法进行优化

就如何操作而言,只需对三角形列表进行反三角剖分。使用三角形条带时,您必须遍历所有三角形,并找到它们的列表,其中的两个顶点位置与前面的每个顶点相同。对于三角形扇形,您需要遍历所有三角形,并找到它们的列表,其中每个三角形的2个顶点位置与前面的每个顶点相同,并且它们都必须具有相同的旋转原点顶点

上述描述与三角剖分算法相反:


    三角形带(给出“n”个顶点的列表): 每个三角形都是“新三角形(n-2,n-1,n)”,其中(n>2)
    三角形风扇(给出“n”个顶点的列表): 每个三角形都是“新三角形(0,n-1,n)”,其中“0”是第一个元素,(n>2)

对于四边形(与您的示例代码一样),您可以使用上面的三角形扇形方法(三角形条在blender obj文件四边形中不起作用)。

有意义。。。。那么,如何解释.obj文件中提供给我的索引缓冲区?它们将面列为一组4个索引,而不是6个索引。(6是构成面的两个三角形)F2 1 5 6-你可以将其解释为两个三角形(2,1,5)和(1,5,6)。不确定订购是否正确。然后将这两个三角形加载到缓冲区中。obj格式可以有任意数量的顶点,只要它们创建凸多边形即可。这取决于你将如何加载它。在这种情况下,您可能会使用一个三角形风扇,但随后会有很多OpenGL api调用(从风扇切换到三角形等)。拥有一个大三角形缓冲区并在一个api调用中呈现它会更快。感谢对三角形条和三角形扇的描述。我一直把它们混为一谈,就像我脑子里想的一样。