-1

OpenGLのスペースのコアコンセプトを理解するのに苦労しています。現代の3Dグラフィックスに関するオンラインの本を数週間読んでいますが、プログラムで使用されているすべてのスペースに戸惑うことがよくあります。具体的には、モデルスペース、ワールドスペース、カメラスペース、クリップスペースなどのスペース。チュートリアルプログラムの1つからの例のように、行列を変換する順序と変換する順序に頭を悩ませているようには見えません。

//.vert shader of a program
#version 330

layout(location = 0) in vec4 position;

uniform mat4 cameraToClipMatrix;
uniform mat4 worldToCameraMatrix;
uniform mat4 modelToWorldMatrix;

void main()
{
    vec4 temp = modelToWorldMatrix * position;
    temp = worldToCameraMatrix * temp;
    gl_Position = cameraToClipMatrix * temp;
}

cameraToClip、worldToCamera、XtoY、ZtoQ、OpenGL、Webサイトのこれらのスペースをどのように理解できますか?ビデオ?参照?または、戻ってチュートリアルのこれらのスペースの情報を、脳に付着するまで読み直してください。

4

2 に答える 2

1

私はそれを私よりもうまく説明する方法を本当に知りません。特に、マトリックスができるだけ明確に名前が付けられている場合。

行列を関数のように考えてください。関数には入力があり、値を返します。正しい入力を渡す必要があります。そうしないと、コンパイラが文句を言います。

次の関数を検討してください。

Float intToFloat(Int i);
Double floatToDouble(Float f);
Real doubleToReal(Double d);

IntFloatDouble、およびRealは、ユーザー定義の C++ 型です。

この関数を書く必要があるとしましょう:

Real intToReal(Int i);

だから私が持っているのはInt. 上記の関数のうち、呼び出すことができる関数は1 つだけintToFloatです。その名前がす​​べてを物語っています。int を取り、それを float に変換します。したがって、 が与えられたInt場合、それでできることは callだけintToFloatです。

Int i = ...;
Float f = intToFloat(i);

さて、今私は持っていFloatます。ここでも、呼び出すことができる関数は 1 つだけですfloatToDouble

Double d = floatToDouble(d);

それで、私は を呼び出すことしかできませんdoubleToReal。つまり、私たちのintToReal機能は次のとおりです。

Real intToReal(Int i)
{
  Int i = ...;
  Float f = intToFloat(i);
  Double d = floatToDouble(d);
  return doubleToReal(d);
}

マトリックスの例と同じです。

頂点シェーダーが行う最も重要なことは、元の空間 (モデル空間と呼ばれる) から OpenGL が定義するクリップ空間と呼ばれる空間に位置を変換することです。これは、ほとんどの頂点シェーダーにとって 1 番の仕事です。

行列はこれらの関数と同様で、途中で位置を中間スペースに変換します。

于 2012-11-17T22:51:36.533 に答える
0

この問題は、解決してからでなければ答えられません。一部の人々に、概念を理解するのに十分なほど十分に教えられることは、すべての人に同じように役立つわけではありません. 私の最善のアドバイスは、3D プログラマーになる前に 3D モデラーになることを学ぶことです。それが私がしたことです。データの視覚化に慣れると、メンタル モデルをより簡単に形成し、それらを念頭に置いてコーディングすることができます。また、アルゴリズムを作成するためにさらに視覚化が必要な場合は、コードを使用せずに作成できます。

于 2012-11-20T14:44:19.620 に答える