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

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

解説

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

以下を行います。

実装

プロジェクトを開く

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

マテリアルクラスの作成

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

「Project」ペインの「app > java > ドメイン.modelviewertutorial」を右クリックします。
右クリックメニュー「New > Java Class」を選択します。


Nameに、「Material」、
を入力し、「OK」ボタンを押します。

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



「Cannot resolve symbol」エラーは、「Alt + Enter」で、必要なクラスをimportします。

グループクラスの作成

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

「Project」ペインの「app > java > ドメイン.modelviewertutorial」を右クリックします。
右クリックメニュー「New > Java Class」を選択します。


Nameに、「Group」、
を入力し、「OK」ボタンを押します。

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

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



「Cannot resolve symbol」エラーは、「Alt + Enter」で、必要なクラスをimportします。

モデルクラスの変更

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



「Cannot resolve symbol」エラーは、「Alt + Enter」で、必要なクラスをimportします。

モデルファイル読み込み処理の変更

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

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 );

を追加します。



「Cannot resolve symbol」エラーは、「Alt + Enter」で、必要なクラスをimportします。

モデル描画処理の変更

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



「Cannot resolve symbol」エラーは、「Alt + Enter」で、必要なクラスをimportします。

要素選択関数の変更

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



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



「Cannot resolve symbol」エラーは、「Alt + Enter」で、必要なクラスをimportします。

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

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



「Cannot resolve symbol」エラーは、「Alt + Enter」で、必要なクラスをimportします。

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

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

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

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

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

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



リビルドし、エラー、警告がないことを確認します。

実行

Android端末にて、動作確認。

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

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

ダウンロード

サンプルプロジェクト
github.com上のダウンロードページ

関連ページ

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

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