OpenGL ES環境では、投影とカメラビューによって、目で見た物理的なオブジェクトにより近い表示でオブジェクトを描くことができます。
この物理的ビューのシミュレーションは、身体を通して描画されるオブジェクトの座標の数学的変換によって達成されます:
投影 - この変換は、オブジェクトが描画されるGLSurfaceViewの幅と高さに基づいて座標を調整します。この計算がないと、OpenGL ESで描画されたオブジェクトはビューウィンドウのスケールの違いによって非対称になります。
投影変換は通常、OpenGLビューが作成されたとき、またはレンダラーのonSurfaceChanged()メソッドで変更が行われたときにのみ計算されます。OpenGL ESの投影と座標マッピングの詳細については、「描画オブジェクトの座標マッピング」を参照してください。
Camera View - この変換は、仮想カメラの位置に基づいて描画オブジェクトの座標を調整します。OpenGL ESは実際のカメラオブジェクトを定義しているのではなく、描画オブジェクトの表示を変換するためにカメラをシミュレートする実用的な方法を提供していることに注意することが重要です。カメラビューの変換は、GLSurfaceViewの作成時に一度だけ計算されるか、ユーザーアクションやアプリケーション機能の動的な変化に基づいて計算されます。
この記事では、投影ビューとカメラビューを作成し、GLSurfaceViewで描画された図形に適用する方法について説明します。
予測の定義
投影変換に使用されるデータは、GLSurfaceView.RendererクラスのonSurfaceChanged()メソッドで計算されます。以下のサンプルコードでは、GLSurfaceViewの高さと幅を使用し、Matrix.frustumM()メソッドを使用して投影変換を完了しています:
@Override
public void onSurfaceChanged(GL10unused, int width, int height) {
GLES20.glViewport(0, 0, width, height);
float ratio = (float) width / height;
// this projection matrixis applied to object coordinates
// in the onDrawFrame()method
行列.frustumM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7);
}
このコードは射影行列 mProjMatrix を生成し、これを以下のコード例のように onDrawFrame() メソッドでカメラビューの変換と組み合わせます。
注:通常、投影トランスフォームだけを使用すると、描画するオブジェクトが空洞になります。したがって、任意の画面に表示するには、カメラビュートランスフォームを同時に使用する必要があります。
カメラビューの定義
描画オブジェクトの変換処理は、描画処理の一部としてカメラビュー変換を追加することで行われます。次のサンプルコードでは、Matrix.setLookAtM() メソッドを使用してカメラビュー変換を計算し、それを前の投影行列の計算と組み合わせています。この結合された変換行列を使用して、グラフィックが描画されます。
@Override
public void onDrawFrame(GL10unused) {
...
// Set the camera position(View matrix)
行列.setLookAtM(mV 行列, 0, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
// Calculate theprojection and view transformation
Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mVMatrix, 0);
// Draw shape
mTriangle.draw(mMVPMatrix);
}
投影とカメラ変換の適用
上で示した投影とカメラビューの変換行列を使うには、graphicsオブジェクトのdraw()メソッドを編集して、この結合された変換行列を受け取り、グラフィックスに適用するようにする必要があります:
publicvoid draw(float[] mvpMatrix){// pass inthe calculated transformation
matrix
...
// get handle to shape'stransformation matrix
mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
// Apply the projectionand view transformation
GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);
// Draw the triangle
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);
...
}





