11. 「面はすべて同一のマテリアル設定」ではないモデルファイルの描画に対応する

(開発環境として「Eclipse」を使用した、古い情報です。
 開発環境として「Android Studio」を使用した、新しい情報は、
 「ホーム > プログラミング > モデルビューアを作る ( Android + OpenGL ES 1.0/1.1 ) ( Android Studio 2.3.3 版 )」)

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

使用開発環境は、Eclipse 3.7.2 ベースの Pleiades です。

解説

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

以下を行います。

実装

プロジェクトを開く

10.で作成したモデルビューアプロジェクトを開きます。

マテリアルクラスの作成

マテリアル設定を表すデータ構造を作成します。

パッケージエクスプローラで、作成したプロジェクトの下の「src」の下の作成したパッケージを右クリックし、 右クリックメニューの「新規 > クラス」 を選択します。


名前 にクラス名「Material」、
を入力し、「完了」ボタンを押します。

Materialクラスの中身を以下のようにします。

グループクラスの作成

マテリアル設定が同一である面の集まりを表すグループというデータ構造を作成します。

パッケージエクスプローラで、作成したプロジェクトの下の「src」の下の作成したパッケージを右クリックし、 右クリックメニューの「新規 > クラス」 を選択します。


名前 にクラス名「Group」、
を入力し、「完了」ボタンを押します。

Modelクラスの中身をベースに、グループ名メンバ変数の追加、マテリアルメンバ変数の追加、アクセサの追加、メンバ変数追加にあわせてコンストラクタの処理の追加、をします。

Groupクラスの中身を以下のようにします。

モデルクラスの修正

モデルクラスは、グループの集まりを表すデータ構造に変更します。

モデルファイル読み込み処理の修正

モデルデータ構造の変更にあわせて、ファイル読み込み処理を、モデルデータ構造の変更に対応したものへ変更します。

StlFileLoaderクラスのload関数の

return new Model( af3Vertex );

をコメントアウトし、
直後に、

// モデルデータ化
float[] f4Ambient = { 0.25f, 0.20725f, 0.20725f, 1.0f };
float[] f4Diffuse = { 1.0f, 0.829f, 0.829f, 1.0f };
float[] f4Specular = { 0.296648f, 0.296648f, 0.296648f, 1.0f };
float fShininess = 0.088f;
Material material = new Material(f4Ambient, f4Diffuse, f4Specular, fShininess);
Group[] aGroup = new Group[1];
aGroup[0] = new Group( "", af3Vertex, null, material );
return new Model( aGroup );

を追加します。

モデル描画処理の修正

モデルデータ構造の変更にあわせて、モデル描画関数を、モデルデータ構造の変更に対応したものへ変更します。
描画モードとして、グループ別の色で描画するグループ番号ピック描画モードを追加します。
ピック要素として描画するかどうかの判定に、グループ番号に関する判定を追加します。

要素選択関数の修正

ピックOpenGLレンダラクラスの要素選択関数を、モデルデータ構造の変更に対応したものへ変更します。
描画のモードに関する 列挙型の定義に、グループ番号ピック描画モードを追加します。
グループ番号ピック描画モードでモデルを描画し、描画後、ピック領域のピクセルの色を読み取り、グループ番号をピック領域の名前列の1番目にセットする処理を追加します。



ピックOpenGLレンダラクラスのモデルをセットする関数内の要素番号別の色で描画するための色バッファーの構築処理を、モデルデータ構造の変更に対応したものへ変更します。

モデルレンダラクラスのVBO構築関数、VBO破棄関数の修正

モデルレンダラクラスのVBO構築関数、VBO破棄関数も、モデルデータ構造の変更に対応したものへ変更します。

モデルレンダラクラスのマテリアルメンバ変数の削除

モデルビューアレンダラクラスの、マテリアルメンバ変数は、使わなくなったので、コメントアウトします。コンストラクタの関連処理もコメントアウトします。

モデルレンダラクラスのモデル描画処理の削除

モデルデータ構造の変更によって、文法エラーが生じている、OpenGLModelRendererクラスのモデル描画関数は、中身を空にすることで、文法エラーをなくします。

ピックレンダラクラスのモデル描画処理の削除

モデルデータ構造の変更によって、文法エラーが生じている、OpenGLPickRendererクラスのモデル描画関数は、中身を空にすることで、文法エラーをなくします。

実行

Android Virtual Device にて、動作確認。

※ ターゲット:「Android 4.0.3 - API Level 15」、ハードウェア:「GPU emulation」をyes、として作成したAndroid Virtual Device にて動作確認。

実行し、動作を確認します。
(10.で作成したモデルビューアと動作上の変化はありません。)

sphere.stlファイルの読み込み
(点、線を非描画設定)

ダウンロード

サンプルプロジェクト

サンプルモデル(sphere.stl)

関連ページ

前項目:10. マテリアルの効果の利用

次項目:12.「面はすべて同一のマテリアル設定」ではないモデルファイルの読み込みに対応する