使用OpenGL ES在Android中错误显示简单多维数据集

时间:2016-11-28 11:11:08

标签: java android opengl-es

我的Android代码存在问题,无法为其找到合理的解决方案。 我的代码通过Charles Loop实现细分。我有一个针对对象的所有边和面运行的半边数据结构。但所有这些都按计划运行。我的问题是显示点和与这些点的连接。我定义了我的顶点和我的索引来在我的Halfedge类中绘制一个对象。在实现所有Halfedges之后,我想在进行任何细分之前绘制我的基础对象。

public HalfEdge()
    {

        Vector<Vector3f> vertices = new Vector<>();
        int[] indices =
                {
                        9, 10, 8,
                        12, 9, 11,
                        9, 1, 10,
                        10, 0, 8,
                        8, 3, 9,
                        12, 1, 9,
                        9, 3, 11,
                        11, 2, 12
                };

        vertices.add(new Vector3f(-0.5f, -0.5f, 0.5f));
        vertices.add(new Vector3f(0.5f, -0.5f, 0.5f));
        vertices.add(new Vector3f(0.5f, 0.5f, 0.5f));
        vertices.add(new Vector3f(-0.5f, 0.5f, 0.5f));
        vertices.add(new Vector3f(0.5f, -0.5f, -0.5f));
        vertices.add(new Vector3f(-0.5f, -0.5f, -0.5f));
        vertices.add(new Vector3f(-0.5f, 0.5f, -0.5f));
        vertices.add(new Vector3f(0.5f, 0.5f, -0.5f));
        vertices.add(new Vector3f(-0.5f, 0.0f, 0.5f));
        vertices.add(new Vector3f(0.0f, 0.0f, 0.5f));
        vertices.add(new Vector3f(0.0f, -0.5f, 0.5f));
        vertices.add(new Vector3f(0.0f, 0.5f, 0.5f));
        vertices.add(new Vector3f(0.5f, 0.0f, 0.5f));
        vertices.add(new Vector3f(0.5f, 0.0f, 0.0f));
        vertices.add(new Vector3f(0.5f, -0.5f, 0.0f));
        vertices.add(new Vector3f(0.5f, 0.5f, 0.0f));
        vertices.add(new Vector3f(0.5f, 0.0f, -0.5f));
        vertices.add(new Vector3f(0.0f, 0.0f, -0.5f));
        vertices.add(new Vector3f(0.0f, -0.5f, -0.5f));
        vertices.add(new Vector3f(0.0f, 0.5f, -0.5f));
        vertices.add(new Vector3f(-0.5f, 0.0f, -0.5f));
        vertices.add(new Vector3f(-0.5f, 0.0f, 0.0f));
        vertices.add(new Vector3f(-0.5f, -0.5f, 0.0f));
        vertices.add(new Vector3f(-0.5f, 0.5f, 0.0f));
        vertices.add(new Vector3f(0.0f, 0.5f, 0.0f));
        vertices.add(new Vector3f(0.0f, -0.5f, 0.0f));
        initHEDS(vertices,indices);
        updateMesh();
    }

这是立方体正面的一个例子。 updateMesh()正在填充我的Vertex-和IndexBuffer。

public float[] getVertices()
    {
        float[] floatVertex = new float[v.size() * 3];

        for(int i = 0; i < v.size(); i++)
        {
            floatVertex[i*3] = v.elementAt(i).xyz.x;
            floatVertex[i*3+1] = v.elementAt(i).xyz.y;
            floatVertex[i*3+2] = v.elementAt(i).xyz.z;
        }
        return floatVertex;
    }

public short[] getOldIndices()
    {
        short[] shortIndex = new short[f.size() * 3];
        int count = 0;

        for(int j = 0; j < f.size(); j++)
        {
            Edge indexer = f.elementAt(j).edge.previous;
            Edge temp;
            if(indexer.vertex.interpolated == true)
            {
                indexer = indexer.previous;
                temp = indexer;
            }
            else
            {
                temp = indexer;
            }

            do {
                shortIndex[count] = (short)v.indexOf(temp.vertex);
                count++;
                temp = temp.next;
                if(temp.vertex.interpolated == true)
                {
                    temp = temp.next;
                }

            }while(temp != indexer);
        }
        return shortIndex;
    }

但这非常重要,因为结果是正确的,并且两个缓冲区都获得了正确的顶点/指数。

protected void setVertices(float[] vertices)
    {
        ByteBuffer vb = ByteBuffer.allocateDirect(vertices.length * 4);
        vb.order(ByteOrder.nativeOrder());
        vertexBuffer = vb.asFloatBuffer();
        vertexBuffer.put(vertices);
        vertexBuffer.position(0);
        vertCount = vertices.length;
    }

    protected void setIndices(short[] indices)
    {
        ByteBuffer ib = ByteBuffer.allocateDirect(indices.length * 2);
        ib.order(ByteOrder.nativeOrder());
        indexBuffer = ib.asShortBuffer();
        indexBuffer.put(indices);
        indexBuffer.position(0);
        indexCount = indices.length;
    }

问题是我现在画了8张脸。问题是只有7/8正确显示,最后一个面不会绘制最后一个连接。由于我使用GL_LINE_LOOP,因此第一个和最后一个索引将在最后连接。但这并没有发生。经过数小时的工作后,我无法向自己解释这一点。 这是我的Draw方法:

public void draw(GL10 gl)
    {
        gl.glEnable(GL10.GL_CULL_FACE);
        gl.glCullFace(GL10.GL_BACK);
        gl.glFrontFace(GL10.GL_CW);
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glVertexPointer(3,GL10.GL_FLOAT,0,vertexBuffer);
        gl.glColor4f(1.0f,1.0f,1.0f,1.0f);
        if( colorBuffer != null)
        {
            gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
            gl.glColorPointer(4, GL10.GL_FLOAT, 0, colorBuffer);
        }
        gl.glDrawElements(GL10.GL_LINE_LOOP, indexCount , GL10.GL_UNSIGNED_SHORT, indexBuffer);
        gl.glEnable(GL10.GL_POINT_SMOOTH);
        gl.glPointSize(30.0f);
        gl.glColor4f(0.0f,1.0f,0.0f,1.0f);
        gl.glDrawArrays(GL10.GL_POINTS, 0 ,vertCount / 3);
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);

    }

如果有人能向我解释这一点会很酷。为什么没有绘制最后一个连接?!如果这是固定的,我的显示将适用于所有Loop-Subdivision步骤。 以下是一些显示实际问题的屏幕截图:

http://i.imgur.com/pBsIrHk.png

您可以看到我的立方体的正面和顶点的索引。

http://i.imgur.com/ztlH9qu.png

在这里,您可以看到迭代中最后一个面未连接的问题。

我希望有人可以帮助我! :)如果你们有问题等我可以更新这个帖子。

0 个答案:

没有答案