Android で OpenGL ES を使用する
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
]
開始行:
[[Software/Android]]
*AndroidでOpenGL ESを使用する [#q706a0cb]
*1.OpenGL ESについて [#he393c52]
OpenGL ES(OpenGL for Embedded Systems)とは主にスマートフ...
クロスプラットフォーム、ロイヤリティフリーなOpenGLのサブ...
iOS,Andoroid,PS3,Nintendo 3DS等で採用されています。~
OpenGL ES - The Standard for Embedded Accelerated 3D Grap...
http://www.khronos.org/opengles/
*2.OpenGL ESの基礎知識 [#wb395373]
**(1).バージョン [#b482b044]
OpenGL ESには大きくわけて2つのバージョンがあります。
OpenGL ES 1.x~
固定機能パイプラインにて描画されます。
[固定機能パイプライン]~
頂点座標 → モデルビュー変換 → 射影変換 → ビューポート変...
OpenGL ES 2.x~
「固定機能パイプライン」の変わりにプログラマブルシェーダ...
頂点座標 → プログラマブルシェーダ → 描画
今回はOpenGL ES(1.x)(固定パイプライン)について説明をしま...
**(2).座標 [#z5a8f373]
X軸を横、Y軸を上、Z軸を奥行きとします。~
図1:OpenGL ESの座標~
&ref(2.PNG);
**(3).ステートマシン [#y787a8b3]
OpenGL ESはステートマシンです。ステータスを変えて処理、ス...
**(4).行列 [#td2983f4]
OpenGL ESでは2つの行列を使用します。~
モデルを見る方向や視角度等を定める「射影変換行列」、モデ...
行列は4x4の行列です。~
&ref(3.PNG);
**(5).頂点座標 [#ra642317]
点(X,Y,Z,W)の座標の集合です。~
三次元の点は通常 (X, Y, Z, 1) として内部的に表現されてい...
実際は三次元座標は(Y/W, Y/W, Z/W) となります。~
wがゼロの場合は3次元ベクトルとなります。~
頂点座標~
&ref(4.PNG);
**(6).モデルビュー変換 [#m905220c]
モデルビュー変換とはモデルビュー変換行列から平行移動、回...
移動頂点座標とモデル変換行列から自分で計算できますが、通...
移動:glTranslatef()~
回転:glRotatef()~
拡大/縮小:glScalef ()~
図2:元~
&ref(5.PNG);
図3:移動~
&ref(6.PNG);
図4:回転~
&ref(7.PNG);
図5:拡大/縮小~
&ref(8.PNG);
**(7).射影変換 [#pe8cb2c3]
射影変換とは射影変換行列からモデルをどのように表示するか...
視線の方向、角度、表示する画面の縦横比を設定します。~
**(8).ビューポート変換 [#ceb0e032]
シーンを写す画面の形状(比率)を指定します。
図6:射影変換とビューポート~
&ref(9.PNG);
~
w,h:ビューポート(画面比率)
near:近クリップ面
far:遠クリップ面
画面比率はw/h、奥行きはnear〜farの範囲が表示されます。
*[参考] OpenGLから削除された主な機能 [#oc199a98]
OpenGL ESはOpenGLからいくつかの機能が削除されたサブセット...
以下の機能(抜粋)が削除されていますので削除された命令が記...
**[ジオメトリ関連] [#g4821d62]
- glBegin,glEndでの頂点座標入力
- double型命令、glMultMatrixd, glTranslated
- 多角形は三角形に限定
- エバリュエータ
- ディスプレイリスト
- テクスチャ座標生成、glTexGen
**[頂点演算関連] [#d9a19470]
- ユーザークリップ
- 頂点カラーに対するマトリクス演算
**[頂点ライティング関連] [#jae3b19c]
- インデックスカラーモード(RGBAカラーモードのみ)
- バック面に対するマテリアル設定
- ローカルビューワー、セパレートスペキュラーカラー
**[ラスタライズ関連] [#r7615d0b]
- glPolygonMode, glLineStipple, glPoygonStipple
- アンチエイリアスポリゴン
**[テクスチャ関連] [#o856d533]
- 1次元、3次元、キューブマップテクスチャ
- テクスチャフォーマット、テクスチャ関数
**[その他] [#a6682ef0]
- ビットマップ描画、glDrawPixels, glBitmap
- ステート取得glGetFloatv, glIsEnabled等
- カレントラスターポジション、ピクセル処理
- アトリビュートスタック
*3.AndroidでOpenGL ESを利用するには [#pfca96a5]
AndroidではOpenGL ESはJavaとNDK(Android Native Developmen...
ここではJavaで動作させる場合を解説します。
AndroidアプリケーションでOpenGLを使用する際の基本的な構成...
図7:AndroidでのOpenGL ES~
&ref(10.PNG);
**(1).クラス説明 [#h297c189]
AndroidのOpenGL ESで使用する2つのクラスについて解説しま...
GLSurfaceView~
GLSurfaceViewはSurfaceViewのサブクラスでOpenGL ESの処理を...
・UIスレッドとは別に専用のスレッドでレンダリングします。~
・連続したレンダリング、又はオンデマンドのレンダリングに...
・OpenGLの呼び出しのトレースとエラーチェックができます。~
メソッド~
onTouchEvent()~
通常のViewと同じようにタッチスクリーンの操作のハンドリン...
(例:タッチ操作でモデルの移動、回転、拡大/縮小等)~
GLSurfaceView.Renderer~
フレームのレンダリングを行います。~
プログラマはこのクラスを継承したクラスを作成し、GLSurface...
メソッド~
onSurfaceCreated()~
サーフェースが作成されるときに呼び出されます。~
端末がスリープ状態からレジュームされた時などにコンテキス...
コンテキスとが失われるとコンテキストに関連付けられたリソ...
通常はこのメソッド内で行うと良いでしょう。~
onSurfaceChanged()~
画面サイズが変更されたときに呼び出されます。~
通常はここでビューポートの設定をすると良いでしょう。~
onDrawFrame()~
フレームを描画する時に呼び出されます。~
このメソッド内で描画処理を行うようにプログラムを記述する...
**(2).アクティビティの状態変化による操作 [#y988e0bc]
アクティビティのonResume(), onPause() でGLSurfaceViewのon...
これで Android のアクティビティのライフサイクルに合わせた...
アクティビティが一時停止(onPause())するとOpenGLのレンダリ...
**(3).デバッグ [#vbb86b3e]
GLSurfaceView は OpenGL ES をデバッグするための便利な機能...
GLSurfaceView.setDebugFlags() メソッドで OpenGL ES 対する...
GLSurfaceView のコンストラクタで setRenderer() を呼び出す...
setDebugFlags(DEBUG_CHECK_GL_ERROR | DEBUG_LOG_GL_CALLS);~
GLSurfaceView.DEBUG_LOG_GL_CALLS:~
OpenGL ESの命令を実行した時にデバッガ(LogCat)に出力しま...
GLSurfaceView.DEBUG_CHECK_GL_ERROR:~
OpenGL ESの命令を実行した時にエラーがあった場合、デバッ...
図8:出力結果~
&ref(11.PNG);
**(4).多くの端末で動作させるためには [#acf2e826]
現在Androidはさまざまな端末で動作しています。ある端末はOp...
また同じバージョンであっても搭載しているグラフィックチッ...
プログラマはターゲットとする端末で動作させる為に動作する...
どの機能がサポートされているかはglGetString() に以下のパ...
GL_EXTENSIONS:~
GL_RENDERER:グラフィックチップ名~
GL_VENDOR:グラフィックチップ(ドライバ)のベンダー名~
GL_VERSION :OpenGLのバージョン~
OpenGL ES(1.0)で制限される機能一覧(抜粋)~
&ref(12.PNG);
*4.サンプルプログラム [#ede4ca43]
立方体を表示し、タッチ操作による回転を行うプログラムです。
アクティビティ
-[OpenGL1.java]
001:package com.beatcraft.opengl1;
002:
003:import com.beatcraft.opengl1.GLView;
004:
005:import android.app.Activity;
006:import android.os.Bundle;
007:
008:public class OpenGL1 extends Activity {
009: GLView mGLView;
010:
011: @Override
012: public void onCreate(Bundle savedInstanceState) {
013: super.onCreate(savedInstanceState);
014: mGLView = new GLView(this);
015: setContentView(mGLView);
016: }
017: @Override
018: protected void onPause() {
019: super.onPause();
020: mGLView.onPause();
021: }
022: @Override
023: protected void onResume() {
024: super.onResume();
025: mGLView.onResume();
026: }
027:}
9行目: GLSurfaceView の派生クラスのGLViewを変数としていま...
14行目: GLViewのインスタンスを作成~
15行目: GLViewをアクティビティに張り付けます。~
20行目:アクティビティが一時停止(onPause())になるのでGLVie...
25行目: アクティビティが再開(onResume())するのでGLViewを...
ビュー(GLView)
-[GLView.java]
001:package com.beatcraft.opengl1;
002:
003:import android.content.Context;
004:import android.opengl.GLSurfaceView;
005:import android.util.Log;
006:import android.view.MotionEvent;
007:
008:public class GLView extends GLSurfaceView {
009: private GLRenderer mGLRenderer;
010: private final float TOUCH_SCALE_FACTOR = 180.0f ...
011: private float mPreviousX;
012: private float mPreviousY;
013:
014: public GLView(Context context) {
015: super(context);
016: mGLRenderer = new GLRenderer();
017: setDebugFlags(DEBUG_CHECK_GL_ERROR
| DEBUG_LOG_GL_CALLS);
018: setRenderer(mGLRenderer);
019: }
020:
021: @Override
022: public boolean onTouchEvent(MotionEvent event) {
023: float x = event.getX();
024: float y = event.getY();
025: switch (event.getAction()) {
026: case MotionEvent.ACTION_MOVE:
027: float dx = x - mPreviousX;
028: float dy = y - mPreviousY;
029: mGLRenderer.mRotate_x += dx * TOUCH_SCAL...
030: mGLRenderer.mRotate_y += dy * TOUCH_SCAL...
031: }
032: mPreviousX = x;
033: mPreviousY = y;
034:
035: return true;
036: }
037:}
8行目: GLSurfaceViewを継承したGLViewを定義しています。~
9行目: Rendererのインターフェースを実装したクラスGLRender...
16行目: GLRendererのインスタンスを作成~
17行目: OpenGL ESのデバッグモード設定~
18行目: GLRendererのインスタンスをGLSurfaceViewに登録して...
21行目〜:画面をタッチした際の処理です。~
タッチしながら移動したとき(MotionEvent.ACTION_MOVE)の移動...
レンダラ(GLRenderer)
-[GLRenderer.java]
001:package com.beatcraft.opengl1;
002:
003:import java.nio.ByteBuffer;
004:import java.nio.ByteOrder;
005:import java.nio.FloatBuffer;
006:
007:import javax.microedition.khronos.egl.EGLConfig;
008:import javax.microedition.khronos.opengles.GL10;
009:
010:import android.opengl.GLSurfaceView.Renderer;
011:
012:public class GLRenderer implements Renderer {
013:
…
124: @Override
125: public void onSurfaceCreated(GL10 gl, EGLConfig ar...
126: // 座標の初期化
127: gl.glLoadIdentity();
128: // デプスバッファのテスト機能を有効にする
129: gl.glEnable(GL10.GL_DEPTH_TEST);
130: // 陰面消去の動作を設定
131: gl.glDepthFunc(GL10.GL_LEQUAL);
132: // ライトを有効にする
133: gl.glEnable(GL10.GL_LIGHTING);
134: // どの光源を使用するか指定
135: gl.glEnable(GL10.GL_LIGHT0);
136:
137: // 頂点配列、法線配列をBufferに設定
138: setBuffer();
139: }
140:
141: @Override
142: public void onSurfaceChanged(GL10 gl, int width, i...
143: // 画面の縦横比率
144: float ratio = (float) width / height;
145: // ビューポートの設定
146: gl.glViewport(0, 0, width, height);
147: // 射影行列の指定
148: gl.glMatrixMode(GL10.GL_PROJECTION);
149: gl.glLoadIdentity();
150: // 画角の設定(left,right,bottom,top,near,far)
151: gl.glFrustumf(-ratio, ratio, -1, 1, 1, 1000);
152: }
125行目: サーフェースが作成されるときに呼び出されます。~
142行目:サーフェースのサイズが変更されたときにonSurfaceCh...
146行目:ビューポートの設定。幅と高さから適正な比率に設定...
148行目: 射影行列の指定。これ以降の命令は射影変換行列に対...
151行目:視体積の設定。 手前の小さな四角形、奥の大きな四角...
レンダラ(GLRenderer) 続き~
-[GLRenderer.java(続き)]
154: @Override
155: public void onDrawFrame(GL10 gl) {
156: // 表示画面とデプスバッファのクリア
157: gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DE...
158: // モデルビュー行列の指定
159: gl.glMatrixMode(GL10.GL_MODELVIEW);
160: // 座標の初期化
161: gl.glLoadIdentity();
162: // 移動(Z軸:奥に移動させる)
163: gl.glTranslatef(0, 0, -5f);
164: // 回転
165: gl.glRotatef(mRotate_x, 0, 1, 0);
166: gl.glRotatef(mRotate_y, 1, 0, 0);
167: // 頂点配列を有効にする
168: gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
169: // 法線配列を有効にする
170: gl.glEnableClientState(GL10.GL_NORMAL_ARRAY);
171: // 頂点配列のセット
172: gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mVertexB...
173: // 法線配列のセット
174: gl.glNormalPointer(GL10.GL_FLOAT, 0, mNormalBuff...
175: // 描画(GL_TRIANGLES:三角形)
176: gl.glDrawArrays(GL10.GL_TRIANGLES, 0, mVertexBuf...
177: }
…
193:}
155行目:描画の度に実行される~
159行目:モデルビュー行列の指定。これ以降の命令はモデルビ...
165-166行目:タッチ操作から計算した回転角を設定(図3参照)~
176行目:立方体の頂点配列から三角形(GL_TRIANGLES,)を描画~
スクリーンショット~
画面をタッチしてスライドさせると立方体が回転します。~
#ref(./13.png,50%);
~
*5.3Dモデルデータ(.obj)の表示 [#t24a2a4d]
.objファイルについて
Wavefront Technologies社のAdvanced Visualizerというアプリ...
拡張子は.obj、ファイル形式はテキスト形式、格納されるデー...
・コメント~
#で始まる行はコメント行となります。
・頂点座標~
vで始まり、頂点の座標が並びます
・テクスチャ座標~
vtで始まり、テクスチャ頂点の座標が並びます
・法線座標~
vn で始まり、法線ベクトルの座標が並びます
・face~
faceは頂点に対応する頂点座標、テクスチャ座標、法線座標の...
fで始まり、以下の形で記述されます。~
f 数値/数値/数値/ ... -> 頂点座標/テクスチャ座標/法線座標…~
f 数値//数値 ...-> 頂点座標//法線座標...~
f 数値 ... -> 頂点座標...~
インデックスは1から始まる値で、ファイルの先頭から連番にな...
-obj のサンプル(立方体)
#
# cube.obj
#
v 0.0 0.0 0.0
v 0.0 0.0 1.0
v 0.0 1.0 0.0
v 0.0 1.0 1.0
v 1.0 0.0 0.0
v 1.0 0.0 1.0
v 1.0 1.0 0.0
v 1.0 1.0 1.0
f 1//2 7//2 5//2 1//2 3//2 7//2
f 1//6 4//6 3//6
vn 0.0 0.0 1.0
vn 0.0 0.0 -1.0
vn 0.0 1.0 0.0
vn 0.0 -1.0 0.0
vn 1.0 0.0 0.0
vn -1.0 0.0 0.0
f 1//6 2//6 4//6
f 3//3 8//3 7//3
f 3//3 4//3 8//3
f 5//5 7//5 8//5
f 5//5 8//5 6//5
f 1//4 5//4 6//4
f 1//4 6//4 2//4
f 2//1 6//1 8//1
f 2//1 8//1 4//1
3Dモデルデータ(.obj)を表示した例~
#ref(./14.png,50%);
~
#ref(./15.png,50%);
~
----
RIGHT:矢代
終了行:
[[Software/Android]]
*AndroidでOpenGL ESを使用する [#q706a0cb]
*1.OpenGL ESについて [#he393c52]
OpenGL ES(OpenGL for Embedded Systems)とは主にスマートフ...
クロスプラットフォーム、ロイヤリティフリーなOpenGLのサブ...
iOS,Andoroid,PS3,Nintendo 3DS等で採用されています。~
OpenGL ES - The Standard for Embedded Accelerated 3D Grap...
http://www.khronos.org/opengles/
*2.OpenGL ESの基礎知識 [#wb395373]
**(1).バージョン [#b482b044]
OpenGL ESには大きくわけて2つのバージョンがあります。
OpenGL ES 1.x~
固定機能パイプラインにて描画されます。
[固定機能パイプライン]~
頂点座標 → モデルビュー変換 → 射影変換 → ビューポート変...
OpenGL ES 2.x~
「固定機能パイプライン」の変わりにプログラマブルシェーダ...
頂点座標 → プログラマブルシェーダ → 描画
今回はOpenGL ES(1.x)(固定パイプライン)について説明をしま...
**(2).座標 [#z5a8f373]
X軸を横、Y軸を上、Z軸を奥行きとします。~
図1:OpenGL ESの座標~
&ref(2.PNG);
**(3).ステートマシン [#y787a8b3]
OpenGL ESはステートマシンです。ステータスを変えて処理、ス...
**(4).行列 [#td2983f4]
OpenGL ESでは2つの行列を使用します。~
モデルを見る方向や視角度等を定める「射影変換行列」、モデ...
行列は4x4の行列です。~
&ref(3.PNG);
**(5).頂点座標 [#ra642317]
点(X,Y,Z,W)の座標の集合です。~
三次元の点は通常 (X, Y, Z, 1) として内部的に表現されてい...
実際は三次元座標は(Y/W, Y/W, Z/W) となります。~
wがゼロの場合は3次元ベクトルとなります。~
頂点座標~
&ref(4.PNG);
**(6).モデルビュー変換 [#m905220c]
モデルビュー変換とはモデルビュー変換行列から平行移動、回...
移動頂点座標とモデル変換行列から自分で計算できますが、通...
移動:glTranslatef()~
回転:glRotatef()~
拡大/縮小:glScalef ()~
図2:元~
&ref(5.PNG);
図3:移動~
&ref(6.PNG);
図4:回転~
&ref(7.PNG);
図5:拡大/縮小~
&ref(8.PNG);
**(7).射影変換 [#pe8cb2c3]
射影変換とは射影変換行列からモデルをどのように表示するか...
視線の方向、角度、表示する画面の縦横比を設定します。~
**(8).ビューポート変換 [#ceb0e032]
シーンを写す画面の形状(比率)を指定します。
図6:射影変換とビューポート~
&ref(9.PNG);
~
w,h:ビューポート(画面比率)
near:近クリップ面
far:遠クリップ面
画面比率はw/h、奥行きはnear〜farの範囲が表示されます。
*[参考] OpenGLから削除された主な機能 [#oc199a98]
OpenGL ESはOpenGLからいくつかの機能が削除されたサブセット...
以下の機能(抜粋)が削除されていますので削除された命令が記...
**[ジオメトリ関連] [#g4821d62]
- glBegin,glEndでの頂点座標入力
- double型命令、glMultMatrixd, glTranslated
- 多角形は三角形に限定
- エバリュエータ
- ディスプレイリスト
- テクスチャ座標生成、glTexGen
**[頂点演算関連] [#d9a19470]
- ユーザークリップ
- 頂点カラーに対するマトリクス演算
**[頂点ライティング関連] [#jae3b19c]
- インデックスカラーモード(RGBAカラーモードのみ)
- バック面に対するマテリアル設定
- ローカルビューワー、セパレートスペキュラーカラー
**[ラスタライズ関連] [#r7615d0b]
- glPolygonMode, glLineStipple, glPoygonStipple
- アンチエイリアスポリゴン
**[テクスチャ関連] [#o856d533]
- 1次元、3次元、キューブマップテクスチャ
- テクスチャフォーマット、テクスチャ関数
**[その他] [#a6682ef0]
- ビットマップ描画、glDrawPixels, glBitmap
- ステート取得glGetFloatv, glIsEnabled等
- カレントラスターポジション、ピクセル処理
- アトリビュートスタック
*3.AndroidでOpenGL ESを利用するには [#pfca96a5]
AndroidではOpenGL ESはJavaとNDK(Android Native Developmen...
ここではJavaで動作させる場合を解説します。
AndroidアプリケーションでOpenGLを使用する際の基本的な構成...
図7:AndroidでのOpenGL ES~
&ref(10.PNG);
**(1).クラス説明 [#h297c189]
AndroidのOpenGL ESで使用する2つのクラスについて解説しま...
GLSurfaceView~
GLSurfaceViewはSurfaceViewのサブクラスでOpenGL ESの処理を...
・UIスレッドとは別に専用のスレッドでレンダリングします。~
・連続したレンダリング、又はオンデマンドのレンダリングに...
・OpenGLの呼び出しのトレースとエラーチェックができます。~
メソッド~
onTouchEvent()~
通常のViewと同じようにタッチスクリーンの操作のハンドリン...
(例:タッチ操作でモデルの移動、回転、拡大/縮小等)~
GLSurfaceView.Renderer~
フレームのレンダリングを行います。~
プログラマはこのクラスを継承したクラスを作成し、GLSurface...
メソッド~
onSurfaceCreated()~
サーフェースが作成されるときに呼び出されます。~
端末がスリープ状態からレジュームされた時などにコンテキス...
コンテキスとが失われるとコンテキストに関連付けられたリソ...
通常はこのメソッド内で行うと良いでしょう。~
onSurfaceChanged()~
画面サイズが変更されたときに呼び出されます。~
通常はここでビューポートの設定をすると良いでしょう。~
onDrawFrame()~
フレームを描画する時に呼び出されます。~
このメソッド内で描画処理を行うようにプログラムを記述する...
**(2).アクティビティの状態変化による操作 [#y988e0bc]
アクティビティのonResume(), onPause() でGLSurfaceViewのon...
これで Android のアクティビティのライフサイクルに合わせた...
アクティビティが一時停止(onPause())するとOpenGLのレンダリ...
**(3).デバッグ [#vbb86b3e]
GLSurfaceView は OpenGL ES をデバッグするための便利な機能...
GLSurfaceView.setDebugFlags() メソッドで OpenGL ES 対する...
GLSurfaceView のコンストラクタで setRenderer() を呼び出す...
setDebugFlags(DEBUG_CHECK_GL_ERROR | DEBUG_LOG_GL_CALLS);~
GLSurfaceView.DEBUG_LOG_GL_CALLS:~
OpenGL ESの命令を実行した時にデバッガ(LogCat)に出力しま...
GLSurfaceView.DEBUG_CHECK_GL_ERROR:~
OpenGL ESの命令を実行した時にエラーがあった場合、デバッ...
図8:出力結果~
&ref(11.PNG);
**(4).多くの端末で動作させるためには [#acf2e826]
現在Androidはさまざまな端末で動作しています。ある端末はOp...
また同じバージョンであっても搭載しているグラフィックチッ...
プログラマはターゲットとする端末で動作させる為に動作する...
どの機能がサポートされているかはglGetString() に以下のパ...
GL_EXTENSIONS:~
GL_RENDERER:グラフィックチップ名~
GL_VENDOR:グラフィックチップ(ドライバ)のベンダー名~
GL_VERSION :OpenGLのバージョン~
OpenGL ES(1.0)で制限される機能一覧(抜粋)~
&ref(12.PNG);
*4.サンプルプログラム [#ede4ca43]
立方体を表示し、タッチ操作による回転を行うプログラムです。
アクティビティ
-[OpenGL1.java]
001:package com.beatcraft.opengl1;
002:
003:import com.beatcraft.opengl1.GLView;
004:
005:import android.app.Activity;
006:import android.os.Bundle;
007:
008:public class OpenGL1 extends Activity {
009: GLView mGLView;
010:
011: @Override
012: public void onCreate(Bundle savedInstanceState) {
013: super.onCreate(savedInstanceState);
014: mGLView = new GLView(this);
015: setContentView(mGLView);
016: }
017: @Override
018: protected void onPause() {
019: super.onPause();
020: mGLView.onPause();
021: }
022: @Override
023: protected void onResume() {
024: super.onResume();
025: mGLView.onResume();
026: }
027:}
9行目: GLSurfaceView の派生クラスのGLViewを変数としていま...
14行目: GLViewのインスタンスを作成~
15行目: GLViewをアクティビティに張り付けます。~
20行目:アクティビティが一時停止(onPause())になるのでGLVie...
25行目: アクティビティが再開(onResume())するのでGLViewを...
ビュー(GLView)
-[GLView.java]
001:package com.beatcraft.opengl1;
002:
003:import android.content.Context;
004:import android.opengl.GLSurfaceView;
005:import android.util.Log;
006:import android.view.MotionEvent;
007:
008:public class GLView extends GLSurfaceView {
009: private GLRenderer mGLRenderer;
010: private final float TOUCH_SCALE_FACTOR = 180.0f ...
011: private float mPreviousX;
012: private float mPreviousY;
013:
014: public GLView(Context context) {
015: super(context);
016: mGLRenderer = new GLRenderer();
017: setDebugFlags(DEBUG_CHECK_GL_ERROR
| DEBUG_LOG_GL_CALLS);
018: setRenderer(mGLRenderer);
019: }
020:
021: @Override
022: public boolean onTouchEvent(MotionEvent event) {
023: float x = event.getX();
024: float y = event.getY();
025: switch (event.getAction()) {
026: case MotionEvent.ACTION_MOVE:
027: float dx = x - mPreviousX;
028: float dy = y - mPreviousY;
029: mGLRenderer.mRotate_x += dx * TOUCH_SCAL...
030: mGLRenderer.mRotate_y += dy * TOUCH_SCAL...
031: }
032: mPreviousX = x;
033: mPreviousY = y;
034:
035: return true;
036: }
037:}
8行目: GLSurfaceViewを継承したGLViewを定義しています。~
9行目: Rendererのインターフェースを実装したクラスGLRender...
16行目: GLRendererのインスタンスを作成~
17行目: OpenGL ESのデバッグモード設定~
18行目: GLRendererのインスタンスをGLSurfaceViewに登録して...
21行目〜:画面をタッチした際の処理です。~
タッチしながら移動したとき(MotionEvent.ACTION_MOVE)の移動...
レンダラ(GLRenderer)
-[GLRenderer.java]
001:package com.beatcraft.opengl1;
002:
003:import java.nio.ByteBuffer;
004:import java.nio.ByteOrder;
005:import java.nio.FloatBuffer;
006:
007:import javax.microedition.khronos.egl.EGLConfig;
008:import javax.microedition.khronos.opengles.GL10;
009:
010:import android.opengl.GLSurfaceView.Renderer;
011:
012:public class GLRenderer implements Renderer {
013:
…
124: @Override
125: public void onSurfaceCreated(GL10 gl, EGLConfig ar...
126: // 座標の初期化
127: gl.glLoadIdentity();
128: // デプスバッファのテスト機能を有効にする
129: gl.glEnable(GL10.GL_DEPTH_TEST);
130: // 陰面消去の動作を設定
131: gl.glDepthFunc(GL10.GL_LEQUAL);
132: // ライトを有効にする
133: gl.glEnable(GL10.GL_LIGHTING);
134: // どの光源を使用するか指定
135: gl.glEnable(GL10.GL_LIGHT0);
136:
137: // 頂点配列、法線配列をBufferに設定
138: setBuffer();
139: }
140:
141: @Override
142: public void onSurfaceChanged(GL10 gl, int width, i...
143: // 画面の縦横比率
144: float ratio = (float) width / height;
145: // ビューポートの設定
146: gl.glViewport(0, 0, width, height);
147: // 射影行列の指定
148: gl.glMatrixMode(GL10.GL_PROJECTION);
149: gl.glLoadIdentity();
150: // 画角の設定(left,right,bottom,top,near,far)
151: gl.glFrustumf(-ratio, ratio, -1, 1, 1, 1000);
152: }
125行目: サーフェースが作成されるときに呼び出されます。~
142行目:サーフェースのサイズが変更されたときにonSurfaceCh...
146行目:ビューポートの設定。幅と高さから適正な比率に設定...
148行目: 射影行列の指定。これ以降の命令は射影変換行列に対...
151行目:視体積の設定。 手前の小さな四角形、奥の大きな四角...
レンダラ(GLRenderer) 続き~
-[GLRenderer.java(続き)]
154: @Override
155: public void onDrawFrame(GL10 gl) {
156: // 表示画面とデプスバッファのクリア
157: gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DE...
158: // モデルビュー行列の指定
159: gl.glMatrixMode(GL10.GL_MODELVIEW);
160: // 座標の初期化
161: gl.glLoadIdentity();
162: // 移動(Z軸:奥に移動させる)
163: gl.glTranslatef(0, 0, -5f);
164: // 回転
165: gl.glRotatef(mRotate_x, 0, 1, 0);
166: gl.glRotatef(mRotate_y, 1, 0, 0);
167: // 頂点配列を有効にする
168: gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
169: // 法線配列を有効にする
170: gl.glEnableClientState(GL10.GL_NORMAL_ARRAY);
171: // 頂点配列のセット
172: gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mVertexB...
173: // 法線配列のセット
174: gl.glNormalPointer(GL10.GL_FLOAT, 0, mNormalBuff...
175: // 描画(GL_TRIANGLES:三角形)
176: gl.glDrawArrays(GL10.GL_TRIANGLES, 0, mVertexBuf...
177: }
…
193:}
155行目:描画の度に実行される~
159行目:モデルビュー行列の指定。これ以降の命令はモデルビ...
165-166行目:タッチ操作から計算した回転角を設定(図3参照)~
176行目:立方体の頂点配列から三角形(GL_TRIANGLES,)を描画~
スクリーンショット~
画面をタッチしてスライドさせると立方体が回転します。~
#ref(./13.png,50%);
~
*5.3Dモデルデータ(.obj)の表示 [#t24a2a4d]
.objファイルについて
Wavefront Technologies社のAdvanced Visualizerというアプリ...
拡張子は.obj、ファイル形式はテキスト形式、格納されるデー...
・コメント~
#で始まる行はコメント行となります。
・頂点座標~
vで始まり、頂点の座標が並びます
・テクスチャ座標~
vtで始まり、テクスチャ頂点の座標が並びます
・法線座標~
vn で始まり、法線ベクトルの座標が並びます
・face~
faceは頂点に対応する頂点座標、テクスチャ座標、法線座標の...
fで始まり、以下の形で記述されます。~
f 数値/数値/数値/ ... -> 頂点座標/テクスチャ座標/法線座標…~
f 数値//数値 ...-> 頂点座標//法線座標...~
f 数値 ... -> 頂点座標...~
インデックスは1から始まる値で、ファイルの先頭から連番にな...
-obj のサンプル(立方体)
#
# cube.obj
#
v 0.0 0.0 0.0
v 0.0 0.0 1.0
v 0.0 1.0 0.0
v 0.0 1.0 1.0
v 1.0 0.0 0.0
v 1.0 0.0 1.0
v 1.0 1.0 0.0
v 1.0 1.0 1.0
f 1//2 7//2 5//2 1//2 3//2 7//2
f 1//6 4//6 3//6
vn 0.0 0.0 1.0
vn 0.0 0.0 -1.0
vn 0.0 1.0 0.0
vn 0.0 -1.0 0.0
vn 1.0 0.0 0.0
vn -1.0 0.0 0.0
f 1//6 2//6 4//6
f 3//3 8//3 7//3
f 3//3 4//3 8//3
f 5//5 7//5 8//5
f 5//5 8//5 6//5
f 1//4 5//4 6//4
f 1//4 6//4 2//4
f 2//1 6//1 8//1
f 2//1 8//1 4//1
3Dモデルデータ(.obj)を表示した例~
#ref(./14.png,50%);
~
#ref(./15.png,50%);
~
----
RIGHT:矢代
ページ名:
BC::labsへの質問は、bc9-dev @ googlegroups.com までお願い致します。