モデルビュー投影マトリックスの目的


102

モデルビューの射影行列をどのような目的で使用していますか?シェーダーにモデルビュー投影行列が必要なのはなぜですか?


12
このリンクを確認してください:songho.ca/opengl/gl_transform.html
iKushal

3
Computer Graphics専用のStack Exchangeサイトを開くことを提案し、この質問を例の質問として選択しました。サイトの立ち上げに興味がある場合は、computergraphics.stackexchange.comをフォローしてください。
wip

回答:


196

モデル、ビュー、および射影行列は、3つの別々の行列です。オブジェクトのローカル座標空間からワールド空間へのマップ、ワールド空間からカメラ空間へのビュー、カメラからスクリーンへの投影。

3つすべてを構成する場合、1つの結果を使用してオブジェクト空間から画面空間までずっとマッピングできます。これにより、入力頂点位置からプログラム可能なパイプラインの次のステージに渡す必要があるものを計算できます。

古い固定機能パイプラインでは、モデルとビューを一緒に適用し、それらから派生した別の結果を使用してライティングを実行します(オブジェクトに何らかのスケーリングを適用した場合でも、法線がユニット長であるように、いくつかの修正を加えます) )、次に投影を適用します。OpenGLに反映されていることがわかります。モデルとビューマトリックスを分離することはなく、それらを単一のモデルビューマトリックススタックとして保持します。したがって、シェーダーに反映されることもあります。

そのため、構成されたモデルビューの投影行列は、多くの場合、シェーダーが各モデルに読み込んだ頂点から画面にマッピングするために使用されます。これは必須ではありません。同じことを実現する方法はたくさんあります。可能なすべての線形変換を可能にするため、これは通常の方法です。そのため、それよりも少ない構成のバージョンも、昔ながらの固定パイプラインの世界では標準でした。


3
したがって、いくつかのオブジェクト(メッシュ)には、いくつかのmodelViewマトリックスが必要です。
Yuriy Vikulov

5
それらが独立して動くか、別々に配置されていると仮定すると、はい。つまり、これが最も一般的な方法です。modelViewまたはProjectionModelViewをユニフォームとしてシェーダープログラムに渡し、CPU上の現在のモデルに設定します。
トミー

こんにちはトミー、可能であれば、このモデルビュー投影マトリックスを使用して、AndroidのOpengl Es2.0のパン機能のサンプルコードを提案できます。私はより多くのリンクを参照しましたが、明確なアイデアを得ることができませんでした。サンプルコードが意味するものであれば、理解しやすいです
。–

1
質問があります。MVマトリックスを1つとして使用するopenGLで、カメラ空間からワールド空間に移動する場合、(投影マトリックス*ビューマトリックス)*(カーソル位置)を逆にする必要がありますが、モデルビューが1つの合成マトリックスである場合。モデルとビューマトリックスを分離して、計算にビューマトリックスを使用する方法 だから私はそれらを別々に保つ必要がありますか?
EvrenBingøl2013

@EvrenBingøl答えはもうわかりましたか?私はモデルとビューマトリックスを分離したままにしましたが、引き続き分離する必要があるかどうかについて、質問に対する実際の回答を知りたいのですが。
tom_mai78101

9

行列が便利だから。行列は、さまざまなスペースに関する位置/方向の変換に役立ちます(スペースは、3つの垂直軸と原点によって定義できます)。

@ legends2kによってコメントで指定された本の例を以下に示します。

カルテシアの居住者は、原点が町の中心にかなり敏感に中心に置かれ、軸がコンパスの基点に沿って向けられている自分の都市の地図を使用します。ディスレクシアの住民は、座標が任意の点を中心とし、軸が任意の方向に走り、おそらく当時は良い考えであった都市の地図を使用します。両方の都市の市民はそれぞれのマップに非常に満足していますが、カルテシアとディスレクシアの間の最初の高速道路の予算を立てるタスクを割り当てた州交通機関のエンジニアは、両方の都市の詳細を示すマップが必要であるため、3番目の座標を導入します必ずしも誰よりも優れているわけではないが、彼よりも優れているシステム。

ここに別の例があります

ワールド座標を使用して、頂点位置を持つゲームで自動車オブジェクトを作成したとします。まったく異なる世界の他のゲームでこの同じ車を使用しなければならない場合、位置を再度定義する必要があり、計算は複雑になります。これは、車内のウィンドウ、フード、ヘッドライト、ホイールなどの位置を、新しい世界に対して再度計算する必要があるためです。

モデル、ビュー、および投影の概念を理解するには、このビデオを参照してください。(強くお勧めします)

次に、これを見て、世界の頂点がどのように行列として表され、どのように変換されるかを理解してください。


深く考えると、変換はオブジェクトの原点(つまり、単一の点)に基づいていますが、オブジェクトのすべての頂点(メッシュ/モデル)は変換されます。つまり、1000の頂点すべてが乗算されます。モデル行列による。したがって、あなたのポイントは整形式ではありません。モデル行列は、単にモデル空間の頂点をワールド空間に変換する行列です。ここにはパフォーマンス上の利点はありませんが、それは単に便利です。
legends2k 2014年

もしそうなら、なぜそれらは単一の3D空間のすべての点を表現しないのですか?別の移動可能なシーンへの入力である可能性がある別のシーンへのシーンの出力を使用すると、利点があります:)
cegprakash

1
世界のようなより広い空間よりも相対的な空間で作業する方が便利なため、単一の空間ですべての頂点を表すわけではありません。ロボットが2メートル前方に移動するように命じられたときに、世界の中心を特定して正しい結果の座標を計算するよりも、その目でロボットを実行するほうが適切だと言います。
legends2k 2014年

私はあなたが正しいと思います。とにかくフラグメントシェーダーはすべてのピクセルに対して呼び出され、複雑なメッシュの場合はすべてのピクセルに対して行列乗算を実行します。:|
cegprakash 14年

2
フラグメントシェーダーでは、ライティング/カラーリング計算のみが実行され、データがフラグメントシェーダーに到達するまでに、すべての位置計算が完了します(つまり、頂点シェーダーで)。複数の座標系を使用する理由については、こちらをご覧ください。この本は、優れた3Dゲーム数学リソースです。本ウェブサイトからサンプルPDFと同じ章
legends2k 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.