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

・描画要素(点、線、面)のON/OFF
    ・ピック要素(点、線、面)のON/OFF
    
    上記機能を有するモデルビューアレンダラクラスを、ピックOpenGLレンダラクラスの派生クラスとして作成します。
    
    ・1本指ドラッグのトラッキングモード切り替え
    
    上記機能を有するようにモデルビューアビュークラスを修正します。
    
    使用開発環境は、Eclipse 3.7.2 ベースの Pleiades です。
解説
02.で作成したモデルビューアは、スピンは1本指ドラッグ、ズームは2本指ドラッグ、パンも2本指ドラッグで、2本指ドラッグの開始時の2本の指の距離に応じて、パンとズームを切り替えるとしていました。
    この方式の場合、パンしたいのにズームになる、ズームしたいのにパンになることが結構な頻度で起こるので、2本指ドラッグは、ズームに固定し、1本指ドラッグは、スピン、ズーム、パンに切り替えられるように、モデルビューアビュークラスを修正します。
    
    ワイヤーフレーム表示にしたり、サーフェース表示にしたりできるように、描画要素(点、線、面)のON/OFFの設定に応じて描画処理を行うレンダラクラスを作成します。
    
    ピックする要素として、点のみピックできるようにしたり、面のみピックできるようにしたりできるように、ピック要素(点、線、面)のON/OFFの設定に応じてピック処理を行うレンダラクラスを作成します。
    
    1本指ドラッグのトラッキングモード切り替え、描画要素(点、線、面)のON/OFF、ピック要素(点、線、面)のON/OFFに関するGUIを、オプションメニューとして作成します。
実装
プロジェクトを開く
04.で作成したモデルビューアプロジェクトを開きます。
モデルビューアレンダラクラスの作成
1本指ドラッグのトラッキングモード切り替え、描画要素(点、線、面)のON/OFF、ピック要素(点、線、面)のON/OFF、の状態変数を持ち、状態変数に応じた処理を行う、モデルビューアレンダラクラスを、ピックOpenGLレンダラクラスの派生クラスとして作成します。
    
    パッケージエクスプローラで、作成したプロジェクトの下の「src」の下の作成したパッケージを右クリックし、 右クリックメニューの「新規 >
    クラス」 を選択します。
    
    
    名前 にクラス名「ModelViewerRenderer」、
    スーパークラスに、「OpenGLPickRenderer」、
    を入力し、「完了」ボタンを押します。
モデルビューアレンダラクラスにメンバ変数、コンストラクタの追加の追加
モデルビューアレンダラクラスに、描画要素(点、線、面)のON/OFF、ピック要素(点、線、面)のON/OFF、の状態変数メンバ変数として追加します。
    
    また、コンストラクタを追加、状態変数の初期値を設定します。
    
    
モデル描画関数のオーバーライド
モデルビューアのレンダラクラスに描画要素のON/OFFに対応した要素描画処理 RenderScene関数 を追加します。
    
    ModelViewerRendererクラスに、シーン描画関数をオーバーライド関数として追加します。
    
    
ピックピクセルを一つに絞る関数のオーバーライド
モデルビューアのレンダラクラスにピックピクセルを一つに絞る関数のオーバーライドし、ピック要素の設定がOFFの要素は選ばれないような処理を追加します。
    
    
モデルビューアビュークラスのレンダラオブジェクトの型の修正
モデルビューアレンダラクラスの作成にあわせて、モデルビューアビュークラスのレンダラオブジェクトの型を修正します。
    
    ・m_rendererメンバ変数を、ModelViewerRenderer型に変更します。
    ・m_rendererメンバ変数の生成を、ModelViewerRendererオブジェクト生成に変更します。
モデルビューアビュークラスに1本指ドラッグのトラッキングモードの切り替え処理の追加
1本指ドラッグのトラッキングモードの切り替え処理を行うために、以下を、モデルビューアビュークラスに追加します。
- 1本指ドラッグで行うトラッキングモードを保持するメンバ変数の追加
- コンストラクタで、1本指ドラッグで行うトラッキングモードの初期値の設定
- タッチイベント処理関数である onTouchEvent関数内の、1本指ドラッグの開始処理で、1本指ドラッグのトラッキングモードを指定する。
また、2本指ドラッグは、ドラッグ開始時の2つの指の距離に応じてズームとパンを切り替えていたのを、2本指ドラッグは、ズームだけに変更します。
    
    また、Rendererメンバ変数のゲッターを追加します。
    
    
メインアクティビティクラスにオプションメニューの追加
1本指ドラッグのトラッキングモード切り替え、描画要素(点、線、面)のON/OFF、ピック要素(点、線、面)のON/OFFに関するGUIを、オプションメニューとして作成します。オプションメニュー作成処理を追加します。オプションメニュー項目選択時の処理も追加します。
    
    
画面の縦横切り替えに対応する
画面の縦横切り替えに対応します。
    
    画面の縦横が切り替わると、アクティビティは、onPause()、onStop()、onDestroy()、と処理され、アクティビティは終了し、再度、アクティビティの生成、onCreate()、onStart()と処理されます。
    
    なぜこのような動作をするのかというと、デフォルトの実装として、アクティビティのコンフィギュレーションが変更された場合には、コンフィギュレーションにあうようにアクティビティを再構築する実装がなされているためです。
    
    「特定のコンフィギュレーション(今回は画面の向き)の変更には、自前で対応する」という宣言することで、アクティビティの再構築を回避することができます。
    
    AndroidManifest.xml のメインアクティビティの設定に、
    android:configChanges="keyboardHidden|orientation"
    という記述を、直接追記、もしくは、GUI操作で追記します。
    
    上記記述により、画面の縦横の切り替え時の、アクティビティの再構築は行われなくなります。(代わりに、onConfigurationChanged()が呼ばれます。)
    
    (上記追記を実施したところ、「targetSdkVersionに関する記述をすべき」という旨の警告が出たので、
     <uses-sdk android:minSdkVersion="7"/>
 を
 <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="7"    />
 と書き換えました。)
    
    
実行
Android Virtual Device にて、動作確認。
    
    ※ ターゲット:「Android 4.0.3 - API Level 15」、ハードウェア:「GPU emulation」をyes、として作成したAndroid
    Virtual Device にて動作確認。
    
    オプションメニューから
1本指ドラッグのトラッキングモード切り替え
    描画要素(点、線、面)のON/OFF
    ピック要素(点、線、面)のON/OFF
を変更することが可能となっていること、
    オプションメニューの変更が画面、操作に反映されていることを確認します。
    
    
    
    CTRL+F12で画面の縦横切り替えたときに、アクティビティの再構築が起こらない(初期状態に戻らず、縦横切り替え前のデータが表示され、縦横切り替え前の描画倍率、描画中心、描画回転角で表示される)ことを確認します。
    
ダウンロード
関連ページ
前項目:04.ピックOpenGLレンダラクラスを作る
    
    次項目:06.モデルデータファイル読み込みを作る

