02.トラックOpenGLレンダラクラスを作る
トラッキング(タッチ操作による描画領域の回転、拡大縮小、平行移動)に関する処理を担うトラックOpenGLレンダラクラスを、ベースOpenGLレンダラクラスの派生クラスとして作成します。
解説
トラッキング(タッチ操作による描画領域の回転、拡大縮小、平行移動)をするためにすべきことは、以下です。
- GLSurfaceView.Renderインターフェースを実装したクラス(または、GLSurfaceView.Renderインターフェースを実装したクラスの派生クラス)、に、タッチのドラッグアンドドロップ量に応じて、描画空間を、回転、拡大縮小、平行移動するようにOpenGLの行列計算をする関数を作成する。また、トラッキングの開始、終了に関する関数も作成する。
- GLSurfaceViewの派生クラスを作成し、タッチイベント関数をオーバーライド関数として追加する。
- 3.で作成したタッチイベント関数に、タッチイベントの種類に応じて、1で作成した関数を呼び出す処理を記述する。
- メインアクティビティでは、GLSurfaceViewクラスのオブジェクトの生成を、2.で作成したGLSurfaceViewの派生クラスのオブジェクトの生成に変更する。
実装
プロジェクトを開く
01.で作成したモデルビューアプロジェクトを開きます。
トラックOpenGLレンダラクラスの作成
トラッキング(タッチ操作による描画領域の回転、拡大縮小、平行移動)に関する処理を担うトラックOpenGLレンダラクラスを、ベースOpenGLレンダラクラスの派生クラスとして作成します。
「Project」ペインの「app > java > ドメイン.modelviewertutorial」を右クリックします。
右クリックメニュー「New > Java Class」を選択します。
Nameに、「OpenGLTrackRenderer」、
Superclassに、「ドメイン.modelviewertutorial.OpenGLBaseRenderer」、
を入力し、「OK」ボタンを押します。
トラッキング操作の開始関数、終了関数、トラッキング操作関数の追加
OpenGLTrackRendererクラスに、トラッキング操作の開始関数、終了関数、トラッキング操作関数を追加します。
・トラッキングのモードに関する 列挙型の定義を追加します。
・トラッキングのモードに関するメンバー変数を追加します。
・トラッキング中の直前座標に関するメンバー変数を追加します。
・描画倍率に関するメンバー変数を追加します。
・描画空間のフォームを表す行列メンバー変数を追加します。
・描画中心座標に関するメンバー変数を追加します。
・行列計算で使用するテンポラリな行列メンバー変数を追加します。
・コンストラクタを追加し、必要な初期化を追加します。
・トラッキング操作の開始関数、終了関数を追加します。
・トラッキングのモードに関するアクセサ関数を追加します。
・トラッキング操作関数を追加します。
・トラッキングに対応した視野角錐台設定関数をオーバーライド関数として追加します。
・トラッキングに対応した視点座標変換関数をオーバーライド関数として追加します。
「Cannot resolve symbol」エラーは、「Alt + Enter」で、必要なクラスをimportします。
モデルビューアービュークラスの作成
タッチイベントに関する処理を担うモデルビューアービュークラスを作成します。
GLSurfaceViewの派生クラスとして作成します。
「Project」ペインの「app > java > ドメイン.modelviewertutorial」を右クリックします。
右クリックメニュー「New > Java Class」を選択します。
Nameに、「ModelViewerView」、
Superclassに、「android.opengl.GLSurfaceView」、
を入力し、「OK」ボタンを押します。
モデルビューアービュークラスに、メンバー変数、コンストラクタの追加
作成したモデルビューアービュークラスに、
・Renderereメンバー変数を追加します。
・コンストラクタを追加します。
・コンストラクタに、Rendererメンバー変数の生成および、生成したRendererオブジェクトのセット処理等を追加します。
・モデルビューアービュークラスに、タッチイベント関数を追加します。
「Cannot resolve symbol」エラーは、「Alt + Enter」で、必要なクラスをimportします。
レイアウトの変更
メインアクティビティのレイアウトを変更します。
「Project」ペインの「app > res > layout > activity_main.xml」を開きます。
OpenGL用のViewとして設置した、GLSurfaceViewを、ModelViewerViewに変更します。
activity_main.xmlの内容を以下のようにします。
メインアクティビティクラスの変更
トラックOpenGLレンダラクラス、モデルビューアビュークラスの作成にあわせて、メインアクティビティクラスを変更します。
・GLSurfaceView型のメンバー変数を、ModelViewerView型のメンバー変数に変更。変数名もあわせて変更します。
・ModelViewerView型のメンバー変数の名前の変更を、クラス全体に適用します。
・「GLSurfaceViewの取得」の型キャストを「GLSurfaceView」から「ModelViewerView」に変更します。
・「Rendererの作成と、RendererのViewへのセット」「都度のレンダリングの設定」は、ModelViewerViewのコンストラクタで行うようにしたので、onCreate関数から削除します。
「Cannot resolve symbol」エラーは、「Alt + Enter」で、必要なクラスをimportします。
リビルドし、エラー、警告がないことを確認します。
実行
Android端末にて、動作確認。
・1つの指でドラッグすると、軸が、回転移動します。
・2つの指を揃えて(タッチ時の2つの指先の距離が300ピクセル以下で)タッチし、ドラッグすると、軸が、拡大縮小します。
・2つの指を離して(タッチ時の2つの指先の距離が300ピクセル以上で)タッチし、ピンチすると、軸が、平行移動します。
ダウンロード
サンプルプロジェクト
(github.com上のダウンロードページ)
関連ページ
前項目:01.ベースOpenGLレンダラクラスを作る
次項目:03.モデルOpenGLレンダラクラスを作る