02.トラックOpenGLレンダラクラスを作る

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



トラッキング(タッチ操作による描画領域の回転、拡大縮小、平行移動)に関する処理を担うトラックOpenGLレンダラクラスを、ベースOpenGLレンダラクラスの派生クラスとして作成します。

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

解説

トラッキング(タッチ操作による描画領域の回転、拡大縮小、平行移動)をするためにすべきことは、以下です。

  1. GLSurfaceView.Renderインターフェースを実装したクラス(または、GLSurfaceView.Renderインターフェースを実装したクラスの派生クラス)、に、タッチのドラッグアンドドロップ量に応じて、描画空間を、回転、拡大縮小、平行移動するようにOpenGLの行列計算をする関数を作成する。また、トラッキングの開始、終了に関する関数も作成する。
  2. GLSurfaceViewの派生クラスを作成し、タッチイベント関数をオーバーライド関数として追加する。
  3. 3.で作成したタッチイベント関数に、タッチイベントの種類に応じて、1で作成した関数を呼び出す処理を記述する。
  4. メインアクティビティでは、GLSurfaceViewクラスのオブジェクトの生成を、2.で作成したGLSurfaceViewの派生クラスのオブジェクトの生成に変更する。

実装

プロジェクトを開く

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

トラックOpenGLレンダラクラスの作成

トラッキング(タッチ操作による描画領域の回転、拡大縮小、平行移動)に関する処理を担うトラックOpenGLレンダラクラスを、ベースOpenGLレンダラクラスの派生クラスとして作成します。

GLSurfaceView.Renderインターフェースを実装したクラスであるOpenGLBaseRendererの派生クラスとして作成します。

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


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

トラッキング操作の開始関数、終了関数の追加

OpenGLTrackRendererクラスに、トラッキング操作の開始関数、終了関数を追加します。

メンバ変数の宣言も追加します。



・トラッキングのモードに関する 列挙型の定義の追加
・トラッキングのモードに関するメンバ変数の追加
・トラッキング中の直前座標に関するメンバ変数の追加
も行います。

トラッキング操作関数の追加

OpenGLTrackRendererクラスに、トラッキング操作関数を追加します。



・描画倍率に関するメンバ変数の追加
・描画空間のフォームを表す行列変数の追加
・トラッキングのモードに関するアクセサ関数の追加
・描画中心座標に関するメンバ変数の追加
・行列計算で使用するテンポラリな行列メンバ変数の追加
・コンストラクタを追加し、必要な初期化の追加
も行います。

import宣言は、eclipseの「エラーの即時修正」機能を使用して、追加しますが、Matrixという名前のクラスは、android.graphicsパッケージと android.openglパッケージにあります。ここでは、android.openglパッケージのMatrixクラスを使用していますので、eclipseの「エラーの即時修正」機能においては、「android.graphics.Matrixのインポート」を選択します。



OpenGLTrackRendererクラスに、トラッキングに対応した視野角錐台設定関数、視点座標変換関数をオーバーライド関数として追加します。

モデルビューアービュークラスの作成

タッチイベントに関する処理を担うモデルビューアービュークラスを作成します。

GLSurfaceViewの派生クラスとして作成します。

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


名前 にクラス名「ModelViewerView」、
スーパークラスに、「android.opengl.GLSurfaceView」、
を入力し、「完了」ボタンを押します。

モデルビューアービュークラスに、メンバ変数、コンストラクタの追加

作成したモデルビューアービュークラスに、
・Renderereメンバ変数の追加
・コンストラクタの追加
・コンストラクタに、Rendererメンバ変数の生成および、生成したRendererオブジェクトのセット処理等の追加
をします。


モデルビューアービュークラスに、タッチイベント関数の追加

モデルビューアービュークラスに、タッチイベント関数を追加します。

OpenGLの処理は、レンダリングスレッドと呼ばれる、UIスレッドとは別のスレッドで動作しています。
UIスレッドから、レンダリングスレッドの処理を直接呼び出すことはできません(正確には、呼び出すことはできても、期待通りの仕事をしません。)
GLSurfaceViewクラスには、UIスレッドからレンダリングスレッドの処理を簡単に呼び出すことができるイベントキューイングという仕組みが用意されています。
OpenGLに関する処理(OpenGLのgl~関数を使用する処理)をUIスレッドから呼び出す場合には、イベントキューイングします。

メインアクティビティクラスの修正

トラックOpenGLレンダラクラス、モデルビューアビュークラスの作成にあわせて、メインアクティビティクラスを修正します。

・GLSurfaceView型のメンバ変数を、ModelViewerView型のメンバ変数に変更。変数名もあわせて変更します。
・ModelViewerView型のメンバ変数の名前の変更を、クラス全体に適用します。
・「Rendererの作成と、RendererのViewへのセット」「都度のレンダリングの設定」は、ModelViewerViewのコンストラクタで行うようにしたので、onCreate関数から削除します。

実行

Android Virtual Device にて、動作確認。

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

※Android Virtual Device では、マルチタッチができないので、回転のみ動作確認可能です。
 パン、ズームは、実機にて動作確認を行います。

ダウンロード

サンプルプロジェクト

関連ページ

前項目:01.ベースOpenGLレンダラクラスを作る

次項目:03.モデルOpenGLレンダラクラスを作る