OpenGL-モデル、ビュー、ワールドマトリックスの関係を理解する


8

これらのマトリックスがどのように機能するか、および適切なシステムを実行するために相互に関連してそれらをセットアップする方法を理解するのに少し問題があります。

私の理解では、モデルマトリックスはオブジェクトのマトリックスであり、たとえば立方体や球体です。アプリケーション/ゲームにはこれらの多くが存在します。

ワールドマトリックスは、3Dワールドの原点を定義するマトリックスです。出発点。

そして、ビューマトリックスは、すべてがこれで変換される「カメラ」であり、実際にすべてがこのマトリックスの代わりに動いているときに、実際のカメラのような錯覚を持っていることを確認します。

ここで少し迷ってしまいました。だから私はここの誰かがこれを正しく理解するのを助けてくれることを望んでいた。

すべてのmodelMatrixは、worldMatrixとworldMatrix、次にviewMatrixで変換/乗算されますか?それとも、すべてのmodelMatrixがviewMatrixで翻訳/乗算され、次にworldMatrixで翻訳/乗算されますか?

これらすべてのマトリックスはどのように関連し、複数のオブジェクトと「カメラ」を備えた世界をどのように設定しますか?

編集:

すでにフィードバックをありがとうございました。私はググリングをしましたが、もう少しよく理解できたと思いますが、疑似コードのアドバイスを得ることができますか?

projectionMatrix = Matrix;
makePerspective(45, width, height, 0.1, 1000.0, projectionMatrix);

modelMatrix = Matrix;
identity(modelMatrix);
translate(modelMatrix, [0.0, 0.0, -10.0]);  // move back 10 on z axis

viewMatrix = Matrix;
identity(viewMatrix);
// do some translation based on input with viewMatrix;

viewMatrixをmodelMatrixで乗算または変換しますか、それとも逆にしますか?そしてそれから?私は現在、引数を描画するために2つの行列のみを必要とするような方法で、drawメソッドを持っています。

これが私の描画方法です:

draw(matrix1 matrix2) {

            bindBuffer(ARRAY_BUFFER, cubeVertexPositionBuffer);
            vertexAttribPointer(shaderProgram.getShaderProgram().vertexPositionAttribute, cubeVertexPositionBuffer.itemSize, FLOAT, false, 0, 0);

            bindBuffer(ARRAY_BUFFER, cubeVertexColorBuffer);
            vertexAttribPointer(shaderProgram.getShaderProgram().vertexColorAttribute, cubeVertexColorBuffer.itemSize, FLOAT, false, 0, 0);

            bindBuffer(ELEMENT_ARRAY_BUFFER, cubeVertexIndexBuffer);

            setMatrixUniforms(shaderProgram, matrix1, matrix2);

            drawElements(TRIANGLES, cubeVertexIndexBuffer.numItems, UNSIGNED_SHORT, 0);


}

それらの行列は何であると想定されていますか?みんな、本当にありがとうございました。


1
マトリックスとは何か知っていますか?行列/ベクトルを乗算する方法を知っていますか?あなたは知っていますか、どの行列が(線形/アフィン変換)を表しますか?そうでない場合は、まず数学から始めてください。
Ivan Kuckir 2013年

おそらくそれに集中するのは良い考えでしょう。何を検索すればいいのか、オンラインで知っている良い情報源はありますか?
サム

1
線形代数まで進み、次に基本的な3Dレンダリングを探し、次にチュートリアルを探します。インターチューブには良い情報源がたくさんありますが、一度に1ステップずつ実行する必要があります。そうしないと、気づいたように完全に迷子になります。
Patrick Hughes 2013年

回答:


19

3Dレンダリングされたシーン内には、通常、オブジェクトを自身のローカルスペース(オブジェクト/モデルスペース)からスクリーンスペースと呼ばれる均一なスペースに変換するために使用される3つの主要な行列があります。

世界

  • 最初のワールドマトリックスは、ワールド内のすべてのオブジェクトに固有であり、オブジェクトの頂点を自身のローカルスペースからワールドスペースと呼ばれる共通の座標系に変換します。

見る

  • その後、ビューマトリックスはモバイルカメラの概念を提供しますが、現実には、カメラは実際には世界で唯一の一定の参照ポイントです。ビューマトリックスは、シーン内のすべてのオブジェクトに適用される変換です(ただし、各オブジェクトに固有ではありません)。カメラのような錯覚を提供します。ビューマトリックスは基本的に、カメラのワールドマトリックスと考えられるものの逆です。しかし、カメラ自体を動かすのではなく、シーンの残りの部分に反対の動きを提供します(幻想;))。

投影

  • 最後に、射影行列は、3Dの世界を画面に表示される均一な画面空間に変換する役割を果たします。これは、視錐台を表すために使用される行列であり、通常は正投影または透視投影として表されます。

最も単純なレベルでは、すべてのオブジェクトに独自のワールドマトリックスを含める必要があります。「シーン」または使用するコンテキストには、カメラを表すビューマトリックスと、世界座標を画面座標に変換する投影マトリックスを含める必要があります。次に、これらすべてを頂点シェーダーに渡す必要があります(ワールドマトリックスはオブジェクトごとに変わりますが、必ずしもビューや投影ではありません)変換する必要があります。


投稿を更新しました。答えをよりよく理解するために書いた疑似コードを手伝っていただけませんか。
2013年

著作権を侵害することなく、この回答の正確なテキストを使用できますか?
arandomguy 2016

1
はい、使用できます
Evan

「ワールド」マトリックスは「モデル」マトリックスと呼ばれるべきではなく、モデルとビューの組み合わせである「モデルビュー」マトリックスは「ワールド」マトリックスである必要がありますか?
BAR

正確な用語は、使用されているコードベースによって異なる場合があります。一部のレンダリングパイプラインは、特定の行列を組み合わせるものもあれば、それらを分割したままにするものもあります。ここで説明する用語が一部のシステムで使用されているのを見てきました。
エヴァン

3

良い答えはこちら /programming/6461740/xna-worldmatrix-and-viewmatrix

まず、「ワールドマトリックス」「ビューマトリックス」の間に実際の違いはありません。これらはどちらも変換マトリックスであり、区別はいくぶん任意です。一部のシステムでは、この2つを組み合わせています(OpenGLには「ModelView」マトリックスがあります)。

従来、「ワールドマトリックス」は、個々のモデルを「モデル空間」から「ワールド空間」に移動するために使用されていました。次に、「ビューマトリックス」を使用して、すべてのモデルをワールドスペースからカメラの前の相対位置に移動します(これにより、実際には「カメラを移動」します)。そして最後に、「Projection Matrix」は3D位置を画面上の2D位置に変換します(通常、透視投影を使用)。それらは行列であるため、1つのステップでポイントを変換できる1つの行列に乗算できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.