Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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
Java 用顶点数组绘制三维多边形_Java_Opengl_Jogl_Vertex Array - Fatal编程技术网

Java 用顶点数组绘制三维多边形

Java 用顶点数组绘制三维多边形,java,opengl,jogl,vertex-array,Java,Opengl,Jogl,Vertex Array,我有一个简短的程序,可以绘制一个3DGL.GL\u四边形,这里是它的display()方法- public void display(GLAutoDrawable drawable) { .... gl.glBegin(GL.GL_QUADS); // of the color cube // Top-face gl.glColor3f(0.0f, 1.0f, 0.0f); // green gl.glVertex

我有一个简短的程序,可以绘制一个3D
GL.GL\u四边形,这里是它的
display()
方法-

public void display(GLAutoDrawable drawable) {
        ....
        gl.glBegin(GL.GL_QUADS); // of the color cube

        // Top-face
        gl.glColor3f(0.0f, 1.0f, 0.0f); // green
        gl.glVertex3f(1.0f, 1.0f, -1.0f);
        gl.glVertex3f(-1.0f, 1.0f, -1.0f);
        gl.glVertex3f(-1.0f, 1.0f, 1.0f);
        gl.glVertex3f(1.0f, 1.0f, 1.0f);

        // Bottom-face
        gl.glColor3f(1.0f, 0.5f, 0.0f); // orange
        gl.glVertex3f(1.0f, -1.0f, 1.0f);
        gl.glVertex3f(-1.0f, -1.0f, 1.0f);
        gl.glVertex3f(-1.0f, -1.0f, -1.0f);
        gl.glVertex3f(1.0f, -1.0f, -1.0f);

        // Front-face
        gl.glColor3f(1.0f, 0.0f, 0.0f); // red
        gl.glVertex3f(1.0f, 1.0f, 1.0f);
        gl.glVertex3f(-1.0f, 1.0f, 1.0f);
        gl.glVertex3f(-1.0f, -1.0f, 1.0f);
        gl.glVertex3f(1.0f, -1.0f, 1.0f);

        // Back-face
        gl.glColor3f(1.0f, 1.0f, 0.0f); // yellow
        gl.glVertex3f(1.0f, -1.0f, -1.0f);
        gl.glVertex3f(-1.0f, -1.0f, -1.0f);
        gl.glVertex3f(-1.0f, 1.0f, -1.0f);
        gl.glVertex3f(1.0f, 1.0f, -1.0f);

        // Left-face
        gl.glColor3f(0.0f, 0.0f, 1.0f); // blue
        gl.glVertex3f(-1.0f, 1.0f, 1.0f);
        gl.glVertex3f(-1.0f, 1.0f, -1.0f);
        gl.glVertex3f(-1.0f, -1.0f, -1.0f);
        gl.glVertex3f(-1.0f, -1.0f, 1.0f);

        // Right-face
        gl.glColor3f(1.0f, 0.0f, 1.0f); // violet
        gl.glVertex3f(1.0f, 1.0f, -1.0f);
        gl.glVertex3f(1.0f, 1.0f, 1.0f);
        gl.glVertex3f(1.0f, -1.0f, 1.0f);
        gl.glVertex3f(1.0f, -1.0f, -1.0f);
            ....
}
现在我想将上面的图形更改为“顶点阵列”模式并获得相同的结果,因此我执行了以下操作:

  • 创建了一个
    float
    数组,该数组包含
    GL.GL_四边形的所有顶点坐标
  • 将此数组放入
    缓冲区
  • 告诉OpenGL顶点的位置(8个顶点)
  • 告诉OpenGL要绘制哪些索引 这是我写的主要代码(编辑的)-

    公共类DisplayWithArray扩展GLCanvas实现GLEventListener,
    键盘监听器{
    私有浮动[]立方={1.0f,1.0f,-1.0f,-1.0f,1.0f,-1.0f,-1.0f,
    1.0f,1.0f,1.0f,1.0f,1.0f,
    1.0f、-1.0f、1.0f、-1.0f、-1.0f、1.0f、-1.0f、-1.0f、-1.0f、1.0f、,
    -1.0f,-1.0f,
    1.0f、1.0f、1.0f、-1.0f、1.0f、1.0f、-1.0f、-1.0f、1.0f、1.0f、,
    -1.0f,1.0f,
    1.0f、-1.0f、-1.0f、-1.0f、-1.0f、-1.0f、-1.0f、1.0f、-1.0f、1.0f、,
    1.0f,-1.0f,
    -1.0f、1.0f、1.0f、-1.0f、1.0f、-1.0f、-1.0f、-1.0f、-1.0f、-1.0f、,
    -1.0f,1.0f,
    1.0f,1.0f,-1.0f,1.0f,1.0f,1.0f,1.0f,-1.0f,1.0f,1.0f,
    -1.0f,-1.0f};
    私有浮点[]颜色顶点={0.0f,1.0f,0.0f,0.0f,1.0f,0.0f,0.0f,
    1.0f、0.0f、0.0f、1.0f、0.0f、1.0f、0.5f、0.0f、1.0f、0.5f、0.0f、,
    1.0f,0.5f,0.0f,1.0f,0.5f,0.0f,1.0f,0.0f,0.0f,0.0f,1.0f,0.0f,
    0.0f、1.0f、0.0f、0.0f、1.0f、0.0f、0.0f、1.0f、1.0f、0.0f、1.0f、,
    1.0f、0.0f、1.0f、1.0f、0.0f、1.0f、1.0f、0.0f、0.0f、0.0f、1.0f、,
    0.0f、0.0f、1.0f、0.0f、0.0f、1.0f、0.0f、0.0f、1.0f、1.0f、0.0f、,
    1.0f、1.0f、0.0f、1.0f、1.0f、0.0f、1.0f、1.0f、0.0f、1.0f};
    //第一次编辑-GL.GL\U四边形的24个位置
    私有整数[]指数=新整数[24];
    私有IntBuffer指示符buf;
    }
    公共显示WithArray(GLCapabilities、int-width、int-height){
    
    对于(int i=0;i而言,错误在于数组的大小不同。顶点位置数组中有24个vec3,而颜色数组中只有6个。因此,当索引数组显示“6”时,它将尝试访问包含6个元素的数组中的第7个条目。因此崩溃

    每个数组都使用相同的索引。因此,如果你想有颜色和位置,那么每个颜色必须有一个单独的对应位置。反之亦然。你不能有6种颜色和32个位置。每个属性也不能使用不同的索引。如果你在做索引渲染,它们都必须使用相同的索引。

    正如我在编辑的文章中提到的,我希望你能看一看。
    public class DisplayWithArray extends GLCanvas implements GLEventListener,
            KeyListener {
    
        private float[] cubeVertices = { 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f,
                1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
    
                1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, 1.0f,
                -1.0f, -1.0f,
    
                1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f,
                -1.0f, 1.0f,
    
                1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f,
                1.0f, -1.0f,
    
                -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f,
                -1.0f, 1.0f,
    
                1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f,
                -1.0f, -1.0f };
    
        private float[] colorVertices ={ 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
            1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.5f, 0.0f, 1.0f, 0.5f, 0.0f,
            1.0f, 0.5f, 0.0f, 1.0f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
            0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f,
            1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
            0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,
            1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f };
    
        // 1st edit  - 24 positions of the GL.GL_QUADS
        private int[] indices = new int[24] ;
    
        private IntBuffer indicesBuf ;  
    }
    public DisplayWithArray(GLCapabilities capabilities, int width, int height) {
            for (int i=0 ; i<24 ; i++) {
                this.indices[i] = i ; 
        }
    public void init(GLAutoDrawable drawable) {
                ...
            final GL gl = drawable.getGL();
                ...
            setupPointer(gl);
    }
    
    public void display(GLAutoDrawable drawable) {
    
            final GL gl = drawable.getGL();
            // draw
            gl.glDrawArrays(GL.GL_QUADS, 0, 24);
    }
    
    public void setupPointer(GL gl) {
    
            FloatBuffer tmpVerticesBuf = BufferUtil
                    .newFloatBuffer(cubeVertices.length);
            ;
            FloatBuffer tmpColorVerticesBuf = BufferUtil
                    .newFloatBuffer(colorVertices.length);
    
            for (int i = 0; i < cubeVertices.length; i++) {
                tmpVerticesBuf.put(cubeVertices[i]);
            }
            for (int i = 0; i < colorVertices.length; i++) {
            tmpColorVerticesBuf.put(colorVertices[i]);
        }
            tmpVerticesBuf.rewind();
            tmpColorVerticesBuf.rewind();
            gl.glEnableClientState(GL.GL_VERTEX_ARRAY);
            gl.glVertexPointer(3, GL.GL_FLOAT, 0, tmpVerticesBuf);
            gl.glColorPointer(3, GL.GL_FLOAT, 0, tmpColorVerticesBuf);
            // Indices of polygon
            IntBuffer tmpIndicesBuf = BufferUtil.newIntBuffer(this.indices.length);
            for (int i = 0; i < indices.length; i++) {
                tmpIndicesBuf.put(indices[i]);
            }
            tmpIndicesBuf.rewind();
    
            indicesBuf = tmpIndicesBuf ; 
    }