« Androidでメインループ | トップページ | Androidで作られたゲーム第一号 »

AndroidのOpenGLで3D描画

AndroidではOpenGLを使って3Dを描画できるらしいので、早速使ってみた

以下はただ四角いポリゴンを書くだけの簡単なサンプルです。

OpenGLに関してはwisdomsoftのOpenGL入門を参考にしました。

package net.chephes.graphics;

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

import javax.microedition.khronos.opengles.GL10;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.graphics.*;
import android.content.Context;

public class Android3D extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(new View3D(this));
    }
}

class View3D extends View{
private float angle = 0;
private OpenGLContext glContext;
    private ByteBuffer  mIndexBuffer;
    private IntBuffer   mVertexBuffer;
    private IntBuffer   mColorBuffer;
    int one = 0x10000;
    int vertices[] = {
           -one, -one, -one,
            one, -one, -one,
            one,  one, -one,
           -one,  one, -one,
        };
       
    int colors[] = {
              0,    0,    0,  one,
            one,    0,    0,  one,
            one,  one,    0,  one,
              0,  one,    0,  one,
        };
    byte indices[] = {
            0, 1, 2,    2, 3, 0
    };

    public View3D(Context context){
super(context);
glContext = new OpenGLContext(0);
    ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length*4);
    vbb.order(ByteOrder.nativeOrder());
    mVertexBuffer = vbb.asIntBuffer();
mVertexBuffer.put(vertices);
mVertexBuffer.position(0);

    ByteBuffer cbb = ByteBuffer.allocateDirect(colors.length*4);
    cbb.order(ByteOrder.nativeOrder());
mColorBuffer = cbb.asIntBuffer();
mColorBuffer.put(colors);
mColorBuffer.position(0);
mIndexBuffer = ByteBuffer.allocateDirect(indices.length);
mIndexBuffer.put(indices);
mIndexBuffer.position(0);
}

    @Override
    protected void onDraw(Canvas canvas) {
GL10 gl = (GL10)(glContext.getGL());
glContext.waitNative(canvas, this);

gl.glClear(gl.GL_COLOR_BUFFER_BIT);

        gl.glMatrixMode(gl.GL_MODELVIEW);
        gl.glLoadIdentity();
        gl.glTranslatef(0, 0, -3.0f);
        gl.glScalef(0.5f, 0.5f, 0.5f);
        gl.glRotatef(angle += 1.2f, 0, 0, 1);

        gl.glColor4f(0.7f, 0.7f, 0.7f, 1.0f);
        gl.glEnableClientState(gl.GL_VERTEX_ARRAY);
        gl.glEnableClientState(gl.GL_COLOR_ARRAY);
        gl.glDisable(gl.GL_CULL_FACE);

gl.glFrontFace(gl.GL_CW);
        gl.glVertexPointer(3, gl.GL_FIXED, 0, mVertexBuffer);
        gl.glColorPointer(4, gl.GL_FIXED, 0, mColorBuffer);
        gl.glDrawElements(gl.GL_TRIANGLES, 6, gl.GL_UNSIGNED_BYTE, mIndexBuffer);
invalidate();
glContext.waitGL();
    }
}

OpenGLを以前から利用している人にとっては簡単そう。僕は今回が初めての利用だったので、 いろいろわからずとりあえずこれだけは書いてみた、という感じ。

3Dに関してはなかなか面白そうなので、また別のサンプルを作ったらソースを公開します。

|

« Androidでメインループ | トップページ | Androidで作られたゲーム第一号 »

Android」カテゴリの記事

コメント

こんにちは、codesと言います。
お尋ねいたしますが、このポリゴン表示が私のversion m5-rc15だと表示しないのです。対応を教えていただければ幸いです。

投稿: codes | 2008年4月26日 (土) 11時06分

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/486213/8929309

この記事へのトラックバック一覧です: AndroidのOpenGLで3D描画:

« Androidでメインループ | トップページ | Androidで作られたゲーム第一号 »