05.モデルビューアレンダラクラスを作る
・描画要素(点、線、面)のON/OFF
・ピック要素(点、線、面)のON/OFF
上記機能を有するモデルビューアレンダラクラスを、ピックOpenGLレンダラクラスの派生クラスとして作成します。
・1本指ドラッグのトラッキングモード切り替え
上記機能を有するようにモデルビューアビュークラスを変更します。
解説
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レンダラクラスの派生クラスとして作成します。
「Project」ペインの「app > java > ドメイン.modelviewertutorial」を右クリックします。
右クリックメニュー「New > Java Class」を選択します。
Nameに、「ModelViewerRenderer」、
Superclassに、「com.hiramine.modelviewertutorial.OpenGLPickRenderer」、
を入力し、「OK」ボタンを押します。
モデルビューアレンダラクラスにメンバー変数、コンストラクタの追加の追加
モデルビューアレンダラクラスに、描画要素(点、線、面)のON/OFF、ピック要素(点、線、面)のON/OFF、の状態変数メンバー変数として追加します。
また、コンストラクタを追加、状態変数の初期値を設定します。
モデル描画関数のオーバーライド
モデルビューアのレンダラクラスに描画要素のON/OFFに対応した要素描画処理 RenderScene関数 を追加します。
ModelViewerRendererクラスに、シーン描画関数をオーバーライド関数として追加します。
「Cannot resolve symbol」エラーは、「Alt + Enter」で、必要なクラスをimportします。
ピックピクセルを一つに絞る関数のオーバーライド
モデルビューアのレンダラクラスにピック要素のON/OFFに対応した「ピックピクセルを一つに絞る関数」をオーバーライド関数として追加します。
「Cannot resolve symbol」エラーは、「Alt + Enter」で、必要なクラスをimportします。
モデルビューアビュークラスのレンダラオブジェクトの型の変更
モデルビューアレンダラクラスの作成にあわせて、モデルビューアビュークラスのレンダラオブジェクトの型を変更します。
・m_rendererメンバー変数を、ModelViewerRenderer型に変更します。
・m_rendererメンバー変数の生成を、ModelViewerRendererオブジェクト生成に変更します。
モデルビューアビュークラスに1本指ドラッグのトラッキングモードの切り替え処理の追加
1本指ドラッグのトラッキングモードの切り替え処理を行うために、以下を、モデルビューアビュークラスに追加します。
・1本指ドラッグで行うトラッキングモードを保持するメンバー変数を追加します。
・コンストラクタで、1本指ドラッグで行うトラッキングモードの初期値を設定します。
・タッチイベント処理関数である onTouchEvent関数内の、1本指ドラッグの開始処理で、1本指ドラッグのトラッキングモードを指定します。
・Rendererメンバー変数のゲッターを追加します。
・2本指ドラッグは、ドラッグ開始時の2つの指の距離に応じてズームとパンを切り替えていたのを、2本指ドラッグは、ズームだけに変更します。
「Cannot resolve symbol」エラーは、「Alt + Enter」で、必要なクラスをimportします。
文字列リソースの追加
必要な文字列定義を追加します。
「Project」ペインの「app > res > values > strings.xml」を開きます。
メインアクティビティのメニュー用の文字列の定義を追加します。
strings.xml の内容を、以下のようにします。
メインアクティビティのメニューリソースの追加
メインアクティビティのメニューリソースを作成します。
「Project」ペインの「app > res」を右クリックします。
右クリックメニュー「New > Android resource file」を選択します。
File nameに、「activity_main」を入力し、
Resource typeに、「menu」を選択し、
「OK」ボタンを押します。
activity_main.xmlが作成されます。
・1本指ドラッグのトラッキングモード切り替え、
・描画要素(点、線、面)のON/OFF、
・ピック要素(点、線、面)のON/OFF
を、オプションメニューとして作成します。
activity_main.xml の内容を以下のようにします。
メインアクティビティクラスにオプションメニューの追加
メインアクティビティクラスにオプションメニュー作成処理を追加します。オプションメニュー項目選択時の処理も追加します。
「Cannot resolve symbol」エラーは、「Alt + Enter」で、必要なクラスをimportします。
画面の縦横切り替えに対応する
画面の縦横切り替えに対応します。
画面の縦横が切り替わると、アクティビティは、onPause()、onStop()、onDestroy()、と処理され、アクティビティは終了し、再度、アクティビティの生成、onCreate()、onStart()と処理されます。
なぜこのような動作をするのかというと、デフォルトの実装として、アクティビティのコンフィギュレーションが変更された場合には、コンフィギュレーションにあうようにアクティビティを再構築する実装がなされているためです。
「特定のコンフィギュレーション(今回は画面の向き)の変更には、自前で対応する」という宣言することで、アクティビティの再構築を回避することができます。
AndroidManifest.xml のメインアクティビティの設定に、
android:configChanges="orientation|screenSize"
という記述を追記します。
上記記述により、画面の縦横の切り替え時の、アクティビティの再構築は行われなくなります。(代わりに、onConfigurationChanged()が呼ばれます。)
リビルドし、エラー、警告がないことを確認します。
実行
Android端末にて、動作確認。
オプションメニューから
1本指ドラッグのトラッキングモード切り替え
描画要素(点、線、面)のON/OFF
ピック要素(点、線、面)のON/OFF
を変更することが可能となっていること、
オプションメニューの変更が画面、操作に反映されていることを確認します。
画面の縦横切り替えたときに、アクティビティの再構築が起こらない(初期状態に戻らず、縦横切り替え前のデータが表示され、縦横切り替え前の描画倍率、描画中心、描画回転角で表示される)ことを確認します。
ダウンロード
サンプルプロジェクト
(github.com上のダウンロードページ)
関連ページ
前項目:04.ピックOpenGLレンダラクラスを作る
次項目:06.モデルデータファイル読み込みを作る