blog

Android - OpenGL ESで投影とカメラ・ビューを適用する

この記事では、投影ビューとカメラビューを作成し、描画されたグラフィックスに適用する方法に焦点を当てます。投影ビューとカメラビューを使うと、目で見た物理オブジェクトに近いオブジェクトを描くことができます...

Jul 3, 2025 · 3 min. read
シェア

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); 
  ... 
  } 
Read next

ステップバイステップでUbuntu 13.10 Server Editionをインストールする

Ubuntu 13.10 Service Editionの***バージョンをダウンロードし、焼いたUbuntu 13.10 Service Editionディスクでサーバーを起動すると、以下のような表示が出ます。\n最初に言語を選択します:\n\nInstall Ubuntu Service Editionをクリックします:\n\nインストールを選択

Jul 3, 2025 · 3 min read