-1

次のような射影行列を使用する必要がありますか?

Matrix.frustumM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7);

and

Matrix.setLookAtM(mVMatrix, 0, 0, 0, 3, 0f, 0f, 0f, 0f, 1.0f, 0.0f);

// Calculate the projection and view transformation and store results in mMVPMatrix
Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mVMatrix, 0);

z軸を中心とした単純な2D(スプライト)回転を行うのに問題はありません。

これまでで最も成功したのは、回転行列を操作 (回転と移動) し、頂点シェーダーに直接渡すことです。

完璧ではなく、多少のせん断/ゆがみ/歪みが伴いますが、少なくともクワッドの「ピボット」/中心点を移動できます。上記の行を全体に配置すると、すべてが壊れて、あらゆる種類の奇妙な結果が得られます。

What is the actual purpose of the lines above (I have read the android docs but I dont understand them) and are they necessary?  Do people write OpenGl apps without them?

ありがとう!!

4

1 に答える 1

0

OpenGL は C API ですが、多くのフレームワークはその関数を他の関数にラップして作業を容易にします。たとえば、OpenGL ES 2.0 では、行列を作成して OpenGL に渡す必要があります。しかし、OpenGL には、これらの行列を実際に作成して計算するためのツールはありません。これは、この行列の作成を行うための他の多くのライブラリが存在する場所であり、これらの構築された行列を OpenGL に渡します。または、計算を行った後、関数が行列を OpenGL に渡すこともできます。ライブラリに依存するだけです。

これらのフレームワークを簡単に使用せず、自分で行うことができます。これは、3D グラフィックスの数学を学ぶのに最適な方法です。数学は、この分野のすべての鍵となります。

Android の OpenGL API に直接アクセスできると確信していますが、おそらく Android がネイティブに提供するライブラリを使用することを選択しています (Apple が iOS のフレームワークに最近追加された GLKit を提供する方法と同様です)。しかし、それはそのライブラリを使用しなければならないという意味ではありませんが、ライブラリが何をしているかを知っていれば、より迅速な開発が提供される可能性があります。

この場合、上記の 3 つの関数は、かなり一般的なマトリックス/グラフィックス ユーティリティのように見えます。3D 空間で投影を設定するフラストラム関数があります。カメラのビューが何であるかを決定する lookAt 関数があります。カメラはどこを見ているのか、そこを見ているときにカメラはどこにあるのか。

最後に、すべての行列を 3D オブジェクトの頂点に適用する前に結合する必要があるため、行列乗算機能があります。

一般的なモデルビュー マトリックスにはカメラの向き/位置が含まれますが、オブジェクトの回転とスケーリングも含まれることを理解することが重要です。そのため、オブジェクトを回転せずに画面の中心にとどめたい場合を除き、(LookAt から) カメラに基づいてモデルビューを送信するだけでは十分ではありません。

行列の乗算に入るすべての計算を展開すると、典型的な設定では次のようになります。

錐台 * カメラ * 平行移動 * 回転 * 頂点

中間の 3 つ、カメラ、平行移動、回転は、通常、一緒にモデル ビューに結合されるため、その特定のマトリックスに対してこれらを掛け合わせてから、モデル ビューに錐台投影マトリックスを掛けると、この全体の結果を頂点に適用できます。

行列の乗算の順序には十分注意する必要があります。錐台にモデルビューを掛けることは、モデルビューに錐台を掛けることと同じではありません。

ここで、ゆがみやゆがみなどについて言及されています。考えられる理由の 1 つは、ビューポートです。API のどこかに、ビューポートの高さと幅 (通常は画面の高さと幅) を設定するオプションがあると確信しています。設定が異なると、アスペクト比が不適切になり、ゆがみが見られます。考えられる説明は 1 つだけです。または、錐台へのパラメータが正しくない可能性があります。これは、スキューなどにも確実に影響するためです。

于 2013-04-06T00:25:17.140 に答える