.obj文件triangle_fan或三角形

时间:2012-12-03 03:03:35

标签: android opengl-es 3d mesh

我正在使用Blender创建.obj文件,然后尝试编写自定义解析器以读取文件并创建网格。我有几个问题。我的例子是使用来自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

我的Mesh渲染方法看起来像这样......

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

如何填充索引缓冲区和顶点缓冲区以便能够绘制此多维数据集。我可以在一个“drawElements”函数中包含所有顶点,还是必须三角形三角形? .obj文件是否会使四个以上的顶点成为一个面? (比如2D五角大楼或六角形?)如果是这样,我该如何绘制? .OBJ文件是否使用Triang粉丝或条带?

谢谢!

2 个答案:

答案 0 :(得分:1)

就实际效率提升而言,如果将缓冲区存储在GPU上,则很可能不存在。如果您正在计算CPU上的数据并将其缓冲到GPU的每一帧(如果可以,您应该避免将其存储在GPU本身上),那么您将通过使用三角形扇形/条来减小缓冲区大小。但是,在光栅化过程中,除非光栅化器循环能够迭代超过3个椎体的复杂形状(我强烈反对),否则无论如何都必须对多边形进行三角测量。

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

就你将如何做而言,你只需对三角形列表进行去三角化。对于三角形条带,您必须遍历所有三角形并找到它们的列表,它们具有与每个前一个顶点相同的2个顶点位置。对于三角形扇形,您需要遍历所有三角形,并找到与每个前一个顶点具有相同2个顶点位置的列表,并且它们都必须具有相同的原点旋转顶点。

以上描述仅与三角测量算法相反:

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

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

答案 1 :(得分:0)

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