モデルビューアを作る ( Android + OpenGL ES 1.0/1.1 ) ( Android Studio 2.3.3 版 )

Android SDK と OpenGL ES 1.0/1.1 を用いて再利用可能なOpenGLレンダラクラスを作成し、作成したOpenGLレンダラクラスを用いてモデルビューアを作成する方法を解説します。

使用開発環境は、Android Studio 2.3.3 です。

01.ベースOpenGLレンダラクラスを作る
OpenGLの初期化処理と終了処理を行い、OpenGLを用いた描画処理の骨格を担う、ベースOpenGLレンダラクラスを作成します。

02.トラックOpenGLレンダラクラスを作る
トラッキング(タッチ操作による描画領域の回転、拡大縮小、平行移動)に関する処理を担うトラックOpenGLレンダラクラスを、ベースOpenGLレンダラクラスの派生クラスとして作成します。

03.モデルOpenGLレンダラクラスを作る
モデル描画に関する処理を担うモデルOpenGLレンダラクラスを、トラックOpenGLレンダラクラスの派生クラスとして作成します。

04.ピックOpenGLレンダラクラスを作る
ピッキング(要素選択)に関する処理を担うピックOpenGLレンダラクラスを、モデルOpenGLレンダラクラスの派生クラスとして作成します。

05.モデルビューアレンダラクラスを作る
・描画要素(点、線、面)のON/OFF
・ピック要素(点、線、面)のON/OFF

上記機能を有するモデルビューアレンダラクラスを、ピックOpenGLレンダラクラスの派生クラスとして作成します。

・1本指ドラッグのトラッキングモード切り替え

上記機能を有するようにモデルビューアビュークラスを変更します。

06.モデルデータファイル読み込みを作る
05.で作成したモデルビューアは、表示するモデルデータをアプリケーション内で定義していました。
モデルデータファイル読み込み処理を作成し、05.で作成したモデルビューアを、ファイルからモデルデータを読み込んで描画するようにします。(アスキー形式STLファイル読み込み処理を作成します。)

07.描画速度の計測
06.で作成したモデルビューアに、描画速度を表示する機能を付加します。

08.描画の高速化(頂点バッファオブジェクトの利用)
07.で作成したモデルビューアの描画処理は、頂点配列を用いた描画処理でした。
頂点配列を用いた描画処理では、glDrawArrays や glDrawElements の呼び出しのたびに、頂点データが、クライアントメモリからグラフィックスメモリへコピーされます。

頂点バッファオブジェクト ( Vertex Buffer Object : VBO ) を用いた描画処理では、頂点データを、事前にクライアントメモリからグラフィックスメモリにコピーしておき、glDrawArrays や glDrawElements の呼び出しのときには、コピー済みの頂点データを用いて描画します。

頂点バッファオブジェクト ( Vertex Buffer Object : VBO ) を用いた描画処理は、頂点配列を用いた描画処理よりも高速に描画されます。

09.光源の効果の利用
光源の効果を利用すると、描画されるモデルの面に陰影ができ、より立体感がでます。
08.で作成したモデルビューアに光源の効果を付加します。

10. マテリアルの効果の利用
マテリアルの効果を利用すると、描画されるモデルに質感を与えることができます。
09.で作成したモデルビューアにマテリアルの効果を付加します。

11. 「面はすべて同一のマテリアル設定」ではないモデルファイルの描画に対応する
10.で作成したモデルビューアは、モデルファイルの「面はすべて同一のマテリアル設定」としていました。
マテリアル設定が同一である面の集まりに対してグループというデータ構造を用意し、モデルはグループの集まりであるとするデータ構造を用意することで、「面はすべて同一のマテリアル設定」ではないモデルファイルの描画に対応します。

12.「面はすべて同一のマテリアル設定」ではないモデルファイルの読み込みに対応する
「面はすべて同一のマテリアル設定」ではないモデルファイルの読み込みに対応します。
11.のファイル読み込み処理は、アスキー形式STLファイル読み込み処理でしたが、新たに、OBJファイル読み込み処理を追加し、読み込むファイルの拡張子により、アスキー形式STLファイル読み込み処理とOBJファイル読み込み処理のどちらかが呼び出されるように変更します。
※STLファイルは、「面はすべて同一のマテリアル設定」であるモデルしか表現できませんが、OBJファイルは、「面はすべて同一のマテリアル設定」でないモデルも表現できます。

13.モデルファイル読み込みの進捗表示
12.で作成したモデルビューアは、ファイルサイズの大きなモデルファイルを読み込んだ際など、ファイル読み込み開始からファイル読み込み完了まで時間を要する場合に、ソフトウェアが固まったかのような状態になります。
モデルファイル読み込みの進捗表示ダイアログを表示し、ファイル読み込み開始からファイル読み込み完了まで時間を要する場合でも、ソフトウェアが固まったかのような状態にならないようにします。

参考書籍

書籍名 コメント
OpenGLプログラミングガイド 第5版 OpenGLを使用してプログラミングをするならばこれがなくてははじまりません。必要な時に必要な箇所を参照する辞書本です。