2011年3月28日月曜日

OpenGLES入門 その2

今回は三角ポリゴンを2枚表示させます。
下のような青と緑のポリゴンが表示できると思います。

■MyApplication.java■

import android.app.Activity; import android.opengl.GLSurfaceView; import android.os.Bundle; import android.view.WindowManager; 
public class MyApplication extends Activity {
private GLSurfaceView mGLSurfaceView; private GLRenderer mGLRenderer; @Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); mGLSurfaceView = new GLSurfaceView(this); setContentView(mGLSurfaceView); WindowManager windowmanager = (WindowManager)getSystemService(WINDOW_SERVICE); mGLRenderer = new GLRenderer(this, windowmanager.getDefaultDisplay()); mGLSurfaceView.setRenderer(mGLRenderer);
}
/** * */ public void onPause() {
mGLSurfaceView.onPause(); super.onPause();
}
/** * */ public void onResume() {
super.onResume(); mGLSurfaceView.onResume();
}
}


 ■GLRenderer.java■

import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import android.app.Activity; import android.opengl.GLSurfaceView; import android.opengl.GLU; import android.view.Display; 
public class GLRenderer implements GLSurfaceView.Renderer { private Scene mScene; public GLRenderer(Activity activity, Display display) { mScene = new Scene(display); } @Override public void onDrawFrame(GL10 gl) {//毎フレーム呼ばれるメインループ mScene.draw(gl); } @Override public void onSurfaceChanged(GL10 arg0, int arg1, int arg2) { } @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { } }
 ■Scene.java■

import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; import javax.microedition.khronos.opengles.GL10; import android.opengl.GLU; import android.view.Display; import android.view.MotionEvent; import android.view.View; public class Scene implements View.OnTouchListener{ private FloatBuffer vertexBuffer; private FloatBuffer colorBuffer; private int mWidth; private int mHeight; public Scene(Display display) { mWidth = display.getWidth(); mHeight = display.getHeight(); float x = 0.0f; float y = 0.0f; float z = 0.0f; float sizeX = 10.0f; float sizeY = 10.0f; float sizeZ = 0.0f; float[] vertex = { //左側の三角形 x + sizeX, y - sizeY, z + sizeZ, x - sizeX, y - sizeY, z + sizeZ, x - sizeX, y + sizeY, z + sizeZ, //右側の三角形 x - sizeX, y + sizeY, z + sizeZ, x + sizeX, y + sizeY, z + sizeZ, x + sizeX, y - sizeY, z + sizeZ, }; ByteBuffer vb = ByteBuffer.allocateDirect(6 * 3 * 4); vb.order(ByteOrder.nativeOrder()); //ビッグエンディアンかリトルエンディアンにあわせてくれる vertexBuffer = vb.asFloatBuffer(); vertexBuffer.put(vertex); vertexBuffer.position(0); float[] color = { //左側の三角形(青) 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, //右側の三角形(緑) 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f }; ByteBuffer vbc = ByteBuffer.allocateDirect(6 * 4 * 4); vbc.order(ByteOrder.nativeOrder()); //ビッグエンディアンかリトルエンディアンにあわせてくれる colorBuffer = vbc.asFloatBuffer(); colorBuffer.put(color); colorBuffer.position(0); } public void draw(GL10 gl) { gl.glClearColor(1.0f, 0.0f, 0.0f, 1.0f); gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
//ビューポート行列(ウィンドウへの出力領域)設定 gl.glViewport(0,0,mWidth,mHeight); //射影行列設定 gl.glMatrixMode(GL10.GL_PROJECTION); gl.glLoadIdentity(); //視界(視野角、画面のアスペクト、比近視点、遠視点)の設定 float aspect = (float)mWidth / (float)mHeight; GLU.gluPerspective(gl, 45.0f, aspect, 0.1f, 3000.0f); GLU.gluLookAt(
            gl,       0.0f, 0.0f, 100.0f, //位置(視点)     0.0f, 0.0f, 0.0f, //見つめているところ            0.0f, 1.0f, 0.0f //水平 );
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glEnableClientState(GL10.GL_COLOR_ARRAY); gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); gl.glColorPointer(4, GL10.GL_FLOAT, 0, colorBuffer); int triangleNum = 2; gl.glDrawArrays(GL10.GL_TRIANGLES, 0, triangleNum * 3); } @Override public boolean onTouch(View arg0, MotionEvent arg1) { return false; } }



PR » 看板
PR » 名刺 作成

2011年3月23日水曜日

Androidアプリ公開

「ポリゴンワールド」をマーケットに公開しました。
無料です。
https://market.android.com/developer?pub=minmin0530

初めて作ったAndroidアプリです。
Android持ってる方は是非ダウンロードしてみて下さい。








2011年3月1日火曜日

OpenGLES入門 その1

AndroidでのOpenGLESの使い方をおおまかに書いておきます。

■1
MyApplicationを作る。まずActivityを継承する

class MyApplication extends Activity {
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //AbsoluteLayoutを使うのは、後でボタンやテキストを表示させるため。
    AbsoluteLayout layout=new AbsoluteLayout(this);
    setContentView(layout);

    //GLサーフェイスビューを生成して設定
    GLSurfaceView mGLSurfaceView = new GLSurfaceView(this);
    GLRenderer glRenderer = new GLRenderer(this);
    mGLSurfaceView.setRenderer(glRenderer);
    layout.addView(mGLSurfaceView);
  }
}

■2
GLRendererクラスはGLSurfaceView.Rendererを継承する

public class GLRenderer implements GLSurfaceView.Renderer {
  private Scene mScene;
  private Resources mResource;

  public GLRenderer(Activity activity) {
    mResource = activity.getResources();//これは後でテクスチャを読み込むときに使う。
    mScene = new Scene();
  }

  //このonDrawFrameメソッドが毎フレーム呼ばれるので、ここで描画処理、更新処理を行う。
  public void onDrawFrame(GL10 gl) {
    mScene.draw(gl);
    mScene.update();
  }

  public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    //ここにOpenGLの初期化処理を書いておく
  }
}

■3
SceneクラスはView.OnTouchListenerを継承する

public class Scene implements View.OnTouchListener{
  public void draw(GL10 gl) {
    //ここにポリゴンの描画処理を書く
  }
  public void update() {
    //ここに物体の移動処理などを書く
  }
  public boolean onTouch(View v, MotionEvent event) {
    //ここにタッチ操作処理を書く
    return false;
  }
}

これをコピペしても動きません。すみません。
これで大体の流れをつかんで下さい。