旋转的多维空间图形

来源:互联网 发布:淘宝客广告海报 编辑:程序博客网 时间:2024/05/16 12:26

可以旋转的四面体和立方体


public class MyRenderer implements Renderer {
    float[] taperVertices = new float[] {  
            0.0f, 0.5f, 0.0f,  
            -0.5f, -0.5f,-0.2f,  
            0.5f, -0.5f, -0.2f,  
            0.0f, -0.2f, 0.2f };//四个顶点
    int[] taperColors = new int[] { 65535, 0, 0, 0, 0, 65535, 0, 0, 0, 0,
            65535, 0, 65535, 65535, 0, 0 };
    private byte[] taperFacets = new byte[] { 0, 1, 2,  
            0, 1, 3,  
            1, 2, 3,  
            0, 2,3 };//四个面组合
    float[] cubeVertices = new float[] { 0.5f, 0.5f, 0.5f, 0.5f, -0.5f, 0.5f,
            -0.5f, -0.5f, 0.5f, -0.5f, 0.5f, 0.5f, 0.5f, 0.5f, -0.5f, 0.5f,
            -0.5f, -0.5f, -0.5f, -0.5f, -0.5f, -0.5f, 0.5f, -0.5f };//八顶点
    private byte[] cubeFacets = new byte[] { 0, 1, 2, 0, 2, 3, 2, 3, 7, 2, 6,
            7, 0, 3, 7, 0, 4, 7, 4, 5, 6, 4, 6, 7, 0, 1, 4, 1, 4, 5, 1, 2, 6,
            1, 5, 6 };//一十二个三角形
 
    FloatBuffer taperVerticesBuffer;
    IntBuffer taperColorsBuffer;
    ByteBuffer taperFacetsBuffer;
    FloatBuffer cubeVerticesBuffer;
    ByteBuffer cubeFacetsBuffer;
    private float rotate;
 
    public MyRenderer() {
        taperVerticesBuffer = FloatBuffer.wrap(taperVertices);
        taperFacetsBuffer = ByteBuffer.wrap(taperFacets);
        taperColorsBuffer = IntBuffer.wrap(taperColors);
        cubeVerticesBuffer = FloatBuffer.wrap(cubeVertices);
        cubeFacetsBuffer = ByteBuffer.wrap(cubeFacets);
    }
 
    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        gl.glDisable(GL10.GL_DITHER);
        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
        gl.glClearColor(0, 0, 0, 0);
        gl.glShadeModel(GL10.GL_SMOOTH);
        gl.glEnable(GL10.GL_DEPTH_TEST);
        gl.glDepthFunc(GL10.GL_LEQUAL);
    }
 
    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        gl.glViewport(0, 0, width, height);
        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glLoadIdentity();
        float ratio = (float) width / height;
        gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
    }
 
    @Override
    public void onDrawFrame(GL10 gl) {
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
        gl.glMatrixMode(GL10.GL_MODELVIEW);
 
        gl.glLoadIdentity();
        gl.glTranslatef(-0.6f, 0.0f, -1.5f);
 
        gl.glRotatef(rotate, 0f, 0.2f, 0f);//Y
 
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, taperVerticesBuffer);
 
        gl.glColorPointer(4, GL10.GL_FIXED, 0, taperColorsBuffer);
 
        gl.glDrawElements(GL10.GL_TRIANGLE_STRIP,
                taperFacetsBuffer.remaining(), GL10.GL_UNSIGNED_BYTE,
                taperFacetsBuffer);
 
        gl.glLoadIdentity();
        gl.glTranslatef(0.7f, 0.0f, -2.2f);
 
        gl.glRotatef(rotate, 0f, 0.2f, 0f);//Y
 
        gl.glRotatef(rotate, 1f, 0f, 0f);//X
 
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, cubeVerticesBuffer);
 
        gl.glDrawElements(GL10.GL_TRIANGLE_STRIP, cubeFacetsBuffer.remaining(),
                GL10.GL_UNSIGNED_BYTE, cubeFacetsBuffer);
 
        gl.glFinish();
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
 
        rotate += 1;
    }
}