Java OpenGL Rubic';s立方边旋转

Java OpenGL Rubic';s立方边旋转,java,android,opengl-es,Java,Android,Opengl Es,我正在尝试使用Java和OpenGL在Android Studio中实现Rubic立方体 渲染和旋转整个立方体效果很好,但仅旋转一侧(9个立方体)不行 据我所知,glTranslatef(x,y,z)方法只是将当前矩阵乘以我可以指定为x,y,z的转换矩阵。我很确定我可以用它和glRotatef()方法只旋转一面,但我不知道怎么做 @Override public void onDrawFrame(GL10 gl) { // Clear color and depth b

我正在尝试使用Java和OpenGL在Android Studio中实现Rubic立方体

渲染和旋转整个立方体效果很好,但仅旋转一侧(9个立方体)不行

据我所知,glTranslatef(x,y,z)方法只是将当前矩阵乘以我可以指定为x,y,z的转换矩阵。我很确定我可以用它和glRotatef()方法只旋转一面,但我不知道怎么做

 @Override
    public void onDrawFrame(GL10 gl) {
        // Clear color and depth buffers using clear-value set earlier
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);



        //Front-Faces
        gl.glLoadIdentity();                // Reset the current matrix to the Identity matrix
        gl.glTranslatef(0.0f, 0.0f, z);   // Translate into the screen
        gl.glRotatef(angleX, 1.0f, 0.0f, 0.0f);
        gl.glRotatef(angleY, 0.0f, 1.0f, 0.0f);

        gl.glRotatef(angleCube, 0.0f, 0.0f, 1.0f); // Rotate
        cube.draw(gl);

        gl.glTranslatef(offSetPositive, 0.0f, 0.0f);  //Middle-Right
       cube.draw(gl);

        gl.glTranslatef(0.0f, offSetPositive, 0.0f); //Top-Right
      cube.draw(gl);

        gl.glTranslatef(offSetNegative, 0.0f, 0.0f); //Top-Middle
      cube.draw(gl);

        gl.glTranslatef(offSetNegative, 0.0f, 0.0f); //Top-Left
      cube.draw(gl);

        gl.glTranslatef(0.0f, offSetNegative, 0.0f); //Middle-Left
      cube.draw(gl);

        gl.glTranslatef(0.0f, offSetNegative, 0.0f); //Bottom-Left
       cube.draw(gl);

        gl.glTranslatef(offSetPositive, 0.0f, 0.0f); //Bottom-Middle
       cube.draw(gl);

        gl.glTranslatef(offSetPositive, 0.0f, 0.0f); //Bottom-Right
        cube.draw(gl);




        //Middle
        gl.glTranslatef(0.0f, 0.0f, -2.1f); //Bottom-Right-Middle
        cube.draw(gl);

        gl.glTranslatef(offSetNegative, 0.0f, 0.0f); //Bottom-Middle-Middle
        cube.draw(gl);

        gl.glTranslatef(offSetNegative, 0.0f, 0.0f); //Bottom-Left-Middle
        cube.draw(gl);

        gl.glTranslatef(0.0f, 2.1f, 0.0f); //Middle-Right-Middle
        cube.draw(gl);

        gl.glTranslatef(offSetPositive+offSetPositive, 0.0f, 0.0f); //Middle-Left-Middle
        cube.draw(gl);

        gl.glTranslatef(0.0f, 2.1f, 0.0f); //Top-Right-Middle
        cube.draw(gl);

        gl.glTranslatef(offSetNegative, 0.0f, 0.0f); //Top-Middle-Middle
        cube.draw(gl);

        gl.glTranslatef(offSetNegative, 0.0f, 0.0f); //Top-Left-Middle
        cube.draw(gl);



        // Update the rotational angle after each refresh
        angleX += speedX;  
        angleY += speedY;  

        // On ArrowDown-Key Rotate 90 degrees
        if((angleCube > -90.0f) && (rotate == true)) {
            angleCube += speedCube;
            System.out.println(angleCube +"  " +rotate);
        } else if((angleCube < 0.0f) && (rotate == false)) {
            angleCube -= speedCube;
            System.out.println(angleCube +"  " +rotate);

        }

    }
} 
@覆盖
公共框架(GL10 gl){
//使用先前设置的清除值清除颜色和深度缓冲区
gl.glClear(GL10.gl_颜色_缓冲_位| GL10.gl_深度_缓冲_位);
//正面
gl.glLoadIdentity();//将当前矩阵重置为标识矩阵
gl.glTranslatef(0.0f,0.0f,z);//翻译到屏幕中
gl.glRotatef(角x,1.0f,0.0f,0.0f);
gl.glRotatef(角度,0.0f,1.0f,0.0f);
gl.glRotatef(angleCube,0.0f,0.0f,1.0f);//旋转
立方体绘制(gl);
gl.glTranslatef(偏移正,0.0f,0.0f);//右中
立方体绘制(gl);
gl.glTranslatef(0.0f,偏移正,0.0f);//右上角
立方体绘制(gl);
gl.glTranslatef(偏移负,0.0f,0.0f);//上中
立方体绘制(gl);
gl.glTranslatef(偏移负,0.0f,0.0f);//左上角
立方体绘制(gl);
gl.glTranslatef(0.0f,偏移负,0.0f);//左中
立方体绘制(gl);
gl.glTranslatef(0.0f,偏移负,0.0f);//左下角
立方体绘制(gl);
gl.glTranslatef(偏移正,0.0f,0.0f);//底部中间
立方体绘制(gl);
gl.glTranslatef(偏移正,0.0f,0.0f);//右下角
立方体绘制(gl);
//中间的
gl.glTranslatef(0.0f,0.0f,-2.1f);//右下中
立方体绘制(gl);
gl.glTranslatef(偏移负,0.0f,0.0f);//中底
立方体绘制(gl);
gl.glTranslatef(offSetNegative,0.0f,0.0f);//左下中
立方体绘制(gl);
gl.glTranslatef(0.0f,2.1f,0.0f);//中-右-中
立方体绘制(gl);
gl.glTranslatef(偏移正+偏移正,0.0f,0.0f);//左中
立方体绘制(gl);
gl.glTranslatef(0.0f,2.1f,0.0f);//右上中
立方体绘制(gl);
gl.glTranslatef(偏移负,0.0f,0.0f);//中上部
立方体绘制(gl);
gl.glTranslatef(偏移负,0.0f,0.0f);//左上中
立方体绘制(gl);
//每次刷新后更新旋转角度
角度x+=速度x;
角度+=快速;
//按向下箭头键旋转90度
如果((angleCube>-90.0f)和((rotate==true)){
angleCube+=speedCube;
System.out.println(角度立方体+“”+旋转);
}否则如果((角立方体<0.0f)和((旋转==假)){
angleCube-=speedCube;
System.out.println(角度立方体+“”+旋转);
}
}
} 
公共作废提取(GL10 gl){
gl.glFrontFace(GL10.gl_CCW);//逆时针方向的正面
gl.glEnable(GL10.gl_CULL_FACE);//启用消隐面
gl.glCullFace(GL10.gl_BACK);//剔除背面(不显示)
gl.glEnableClientState(GL10.gl_顶点数组);
gl.glVertexPointer(3,GL10.gl_FLOAT,0,vertexBuffer);
//渲染所有面
对于(int face=0;face
    public void draw(GL10 gl) {
        gl.glFrontFace(GL10.GL_CCW);    // Front face in counter-clockwise orientation
        gl.glEnable(GL10.GL_CULL_FACE); // Enable cull face
        gl.glCullFace(GL10.GL_BACK);    // Cull the back face (don't display)

        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);

        // Render all the faces
        for (int face = 0; face < numFaces; face++) {
            // Set the color for each of the faces
            gl.glColor4f(colors[face][0], colors[face][1], colors[face][2], colors[face][3]);
            // Draw the primitive from the vertex-array directly
            gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, face*4, 4);
        }
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glDisable(GL10.GL_CULL_FACE);
    }
}