OpenGL ES例2:上下に転がる立方体

6410 ワード

最近生存の圧力に迫られて、アルバイトをしなければなりません.だからブログにクリックを求めるリンクを追加しました.時間のあるブロガーの皆さん、クリックしてください.時間がないから無理しなくてもいいよ.しかし、安心してください.私は技術をしています.きっとリンクにウイルスがありません.私がアルバイトをしている淘宝店です.にこにこ.http://shop108130013.taobao.com.ありがとうございます.これから毎週オリジナルの技術ブログを書いて、みんなに報いるのは、本当に生計に追われて、何でもない.ご了承ください.
本の第3章の作成した3次元の実例、上下に転がる立方体.
完全なインスタンスはcsdnのリソースページにアップロードされます.http://download.csdn.net/download/fener10289/5265296
コードは次のとおりです.
package book.BouncyCube;


import android.app.Activity;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.view.WindowManager;

public class BouncyCubeActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);        
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
     		GLSurfaceView view = new GLSurfaceView(this);
       		view.setRenderer(new BouncyCubeRenderer(true));
       		setContentView(view);
    }
}

 
package book.BouncyCube;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import javax.microedition.khronos.opengles.GL11;

import android.opengl.GLSurfaceView;
import java.lang.Math;


class BouncyCubeRenderer implements GLSurfaceView.Renderer 
{
    public BouncyCubeRenderer(boolean useTranslucentBackground) 
    {
        mTranslucentBackground = useTranslucentBackground;	
        mCube = new Cube();
    }

    public void onDrawFrame(GL10 gl) 
    {
    	gl.glClearColor(0.0f,0.5f,0.5f,1.0f);
        gl.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);

        gl.glMatrixMode(GL11.GL_MODELVIEW);
        gl.glLoadIdentity();
        gl.glTranslatef(0.0f,(float)Math.sin(mTransY), -7.0f);

        gl.glRotatef(mAngle, 0.0f, 1.0f, 0.0f);
        gl.glRotatef(mAngle, 1.0f, 0.0f, 0.0f);

        gl.glEnableClientState(GL11.GL_VERTEX_ARRAY);
        gl.glEnableClientState(GL11.GL_COLOR_ARRAY);

        mCube.draw(gl);

        mTransY += .075f;
        mAngle+=.4;
    }

    public void onSurfaceChanged(GL10 gl, int width, int height) 
    {
        gl.glViewport(0, 0, width, height);

        float aspectRatio;
        float zNear =.1f;
        float zFar =1000;
        float fieldOfView = 30.0f/57.3f;                                                                       
        float size;
        	
        gl.glEnable(GL10.GL_NORMALIZE);
        	
        aspectRatio=(float)width/(float)height;                       
    	    	
        gl.glMatrixMode(GL10.GL_PROJECTION);                                  
        	
        size = zNear * (float)(Math.tan((double)(fieldOfView/2.0f)));   

        gl.glFrustumf(-size, size, -size /aspectRatio,                    
                               size /aspectRatio, zNear, zFar);
        	
        gl.glMatrixMode(GL10.GL_MODELVIEW);                              
    }


    public void onSurfaceCreated(GL10 gl, EGLConfig config) 
    {

        gl.glDisable(GL11.GL_DITHER);

        gl.glHint(GL11.GL_PERSPECTIVE_CORRECTION_HINT,
                 GL11.GL_FASTEST);

        if (mTranslucentBackground) 
        {
             gl.glClearColor(1,0,0,0);
        } 
        else 
        {
             gl.glClearColor(1,1,1,1);
        }
        
        gl.glEnable(GL11.GL_CULL_FACE);
        gl.glShadeModel(GL11.GL_SMOOTH);
        gl.glEnable(GL11.GL_DEPTH_TEST);
    }
    private boolean mTranslucentBackground;
    private Cube mCube;
    private float mTransY;
    private float mAngle;
}


 
package book.BouncyCube;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;

import javax.microedition.khronos.opengles.GL10;
import javax.microedition.khronos.opengles.GL11;

/**
 * A vertex shaded square.
 */
class Cube
{
    public Cube()
    {
        float vertices[] = 
        {
                -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
        }; 

        byte maxColor=(byte)255;
        
        byte colors[] = 
        {
        		maxColor,maxColor,       0,maxColor,
                0,       maxColor,maxColor,maxColor,
                0,              0,       0,maxColor,
                maxColor,       0,maxColor,maxColor,
                
        		maxColor,		0,       0,maxColor,
                0,       maxColor,		 0,maxColor,
                0,              0,maxColor,maxColor,
                0,       		0,		 0,maxColor
        }; 


        byte tfan1[] =					
        	{
        		1,0,3,
        		1,3,2,
        		1,2,6,
        		1,6,5,
        		1,5,4,
        		1,4,0
        		
        		
        	};

        byte tfan2[] =					
        	{
        		7,4,5,
        		7,5,6,
        		7,6,2,
        		7,2,3,
        		7,3,0,
        		7,0,4
        	};

        	
        ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);
        vbb.order(ByteOrder.nativeOrder());
        mFVertexBuffer = vbb.asFloatBuffer();
        mFVertexBuffer.put(vertices);
        mFVertexBuffer.position(0);
        
        mColorBuffer = ByteBuffer.allocateDirect(colors.length);
        mColorBuffer.put(colors);
        mColorBuffer.position(0);
       
        mTfan1 = ByteBuffer.allocateDirect(tfan1.length);
        mTfan1.put(tfan1);
        mTfan1.position(0);
        
        mTfan2 = ByteBuffer.allocateDirect(tfan2.length);
        mTfan2.put(tfan2);
        mTfan2.position(0);
    }

    public void draw(GL10 gl)
    {
        gl.glVertexPointer(3, GL11.GL_FLOAT, 0, mFVertexBuffer);
        gl.glColorPointer(4, GL11.GL_UNSIGNED_BYTE, 0, mColorBuffer);
        
    	gl.glDrawElements( gl.GL_TRIANGLE_FAN, 6 * 3, gl.GL_UNSIGNED_BYTE, mTfan1);
    	gl.glDrawElements( gl.GL_TRIANGLE_FAN, 6 * 3, gl.GL_UNSIGNED_BYTE, mTfan2);
    }

    private FloatBuffer mFVertexBuffer;
    private ByteBuffer  mColorBuffer;
    private ByteBuffer  mIndexBuffer;
    private ByteBuffer  mTfan1;
    private ByteBuffer  mTfan2;
}