▼Androidメモ▼
3Dモデルと2D描画の合成


OpenGL ES 2.0で3Dモデルと2D描画の合成を行うプログラムを作成する。
HelloGL20_26.png

3Dモデルファイル
以下の3つのファイルをプロジェクトのassetsに配置。
ライブラリ
3Dモデルの読み込みで利用した独自ライブラリを追加。

ソースコード
GL20ModelEx4.java
package net.npaka.gl20modelex4;
import android.app.Activity;
import android.opengl.GLSurfaceView;
import android.os.Bundle;

//3Dモデルの読み込み
public class GL20ModelEx4 extends Activity {
private GLSurfaceView glView;

//アクティビティ生成時に呼ばれる
@Override
public void onCreate(Bundle bundle) {
super.onCreate(bundle);

//GLサーフェイスビュー
glView=new GLSurfaceView(this);
glView.setEGLContextClientVersion(2);
glView.setRenderer(new GLRenderer(this));
setContentView(glView);
}

//アクティビティレジューム時に呼ばれる
@Override
public void onResume() {
super.onResume();
glView.onResume();
}

//アクティビティポーズ時に呼ばれる
@Override
public void onPause() {
super.onPause();
glView.onPause();
}
}

GLRenderer.java
package net.npaka.gl20modelex4;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import net.npaka.gles.GLES;
import net.npaka.gles.Graphics;
import net.npaka.gles.ObjLoader;
import net.npaka.gles.Object3D;
import net.npaka.gles.Texture;
import android.content.Context;
import android.opengl.GLES20;
import android.opengl.GLSurfaceView;
import android.opengl.Matrix;

//レンダラー
public class GLRenderer implements
GLSurfaceView.Renderer {
//システム
private float aspect;//アスペクト比
private int angle; //回転角度

//モデル
private Object3D model=new Object3D();

//グラフィックス
private Graphics g;
private Texture texture;

//コンストラクタ
public GLRenderer(Context context) {
GLES.context=context;
}

//サーフェイス生成時に呼ばれる
@Override
public void onSurfaceCreated(GL10 gl10,EGLConfig eglConfig) {
//プログラムの生成
GLES.makeProgram();

//頂点配列の有効化
GLES20.glEnableVertexAttribArray(GLES.positionHandle);
GLES20.glEnableVertexAttribArray(GLES.normalHandle);
GLES20.glEnableVertexAttribArray(GLES.uvHandle);

//光源色の指定
GLES20.glUniform4f(GLES.lightAmbientHandle,0.2f,0.2f,0.2f,1.0f);
GLES20.glUniform4f(GLES.lightDiffuseHandle,0.7f,0.7f,0.7f,1.0f);
GLES20.glUniform4f(GLES.lightSpecularHandle,0.9f,0.9f,0.9f,1.0f);

try {
//モデルの読み込み
model.figure=ObjLoader.load("droid.obj");

//テクスチャの読み込み
texture=Texture.createTextureFromAsset("sample.png");
} catch (Exception e) {
android.util.Log.e("debug",e.toString());
for (StackTraceElement ste:e.getStackTrace()) {
android.util.Log.e("debug"," "+ste);
}
}
}

//画面サイズ変更時に呼ばれる
@Override
public void onSurfaceChanged(GL10 gl10,int w,int h) {
//ビューポート変換
GLES20.glViewport(0,0,w,h);
aspect=(float)w/(float)h;

//グラフィックスの生成
g=new Graphics(w,h);
}

//毎フレーム描画時に呼ばれる
@Override
public void onDrawFrame(GL10 gl10) {
//画面のクリア
GLES20.glClearColor(1.0f,1.0f,1.0f,1.0f);
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT|
GLES20.GL_DEPTH_BUFFER_BIT);

//デプスバッファと光源の有効化
GLES20.glEnable(GLES20.GL_DEPTH_TEST);
GLES20.glUniform1i(GLES.useLightHandle,1);

//射影変換
Matrix.setIdentityM(GLES.pMatrix,0);
GLES.gluPerspective(GLES.pMatrix,
45.0f, //Y方向の画角
aspect, //アスペクト比
0.01f, //ニアクリップ
100.0f);//ファークリップ

//光源位置の指定
GLES20.glUniform4f(GLES.lightPosHandle,5.0f,5.0f,5.0f,1.0f);

//ビュー変換
Matrix.setIdentityM(GLES.mMatrix,0);
GLES.gluLookAt(GLES.mMatrix,
0.0f,0.8f,5.0f, //カメラの視点
0.0f,0.8f,0.0f, //カメラの焦点
0.0f,1.0f,0.0f);//カメラの上方向

//モデル変換
Matrix.rotateM(GLES.mMatrix,0,angle++,0,1,0);

//モデルの描画
model.draw();

//2D描画
g.setup2D();
g.drawImage(texture,0,0);
}
}



−戻る−