web-dev-qa-db-ja.com

眼球座標とは正確には何ですか?

私がOpenGLを学んでいるとき、私はしばしばいわゆる目空間座標に出会います。

私が正しければ、通常3つの行列があります。モデル行列、ビュー行列、射影行列。その背後にある数学がどのように機能するかは完全にはわかりませんが、座標をワールドスペース、ビュースペース、スクリーンスペースに変換することは知っています。

しかし、目の空間はどこにあり、何かを目の空間に変換するためにどの行列が必要ですか?

28
danijar

おそらく、さまざまなスペース間の関係を示す次の図が役立ちます。The OpenGL transformation pipeline

固定関数パイプラインを使用している場合(たとえば、glMatrixMode()を呼び出している場合)、またはシェーダーを使用している場合は、操作は同じです-直接コード化するかどうかの問題です。シェーダー、またはOpenGLパイプラインが作業を支援します。

固定関数パイプラインの観点から物事を議論することには嫌悪感がありますが、会話がより簡単になるので、それから始めます。

レガシーOpenGL(つまり、OpenGL 3.1より前のバージョン、または互換性プロファイルを使用)では、2つのマトリックススタックが定義されています:model-view、およびprojection、およびアプリケーションの起動時各スタックの一番上の行列は単位行列です(対角線上に1.0、他のすべての要素に対して0.0)。その空間に座標を描画すると、正規化デバイス座標(NDCs)で効果的にレンダリングされます。これにより、X、Y、および両方の範囲[-1,1]の範囲外の頂点が切り取られますZ. ビューポート変換glViewport()を呼び出すことで設定される)は、NDCをウィンドウ座標にマップするものです(まあ、ビューポート座標、実際には、ほとんどの場合、ビューポートとウィンドウは同じサイズと場所)、および深さの値を深さの範囲(デフォルトでは[0,1])にします。

現在、ほとんどのアプリケーションでは、最初に指定される変換はprojection transformです。これは、正投影と透視投影の2種類があります。 orthographic投影は角度を保持し、ラインセグメントの相対的な長さを歪めないため、通常、科学およびエンジニアリングアプリケーションで使用されます。レガシーOpenGLでは、正投影はglOrthoまたは_gluOrtho2D_のいずれかで指定されます。より一般的に使用されるperspective transformsは、目がどのように機能するかを模倣しており(つまり、目から遠いオブジェクトは近くのオブジェクトよりも小さい)、glFrustumまたはgluPerspectiveのいずれかで指定されます。透視投影の場合、それらはviewing frustumを定義しました。これは、目の位置にアンカーされた切り詰められたピラミッドで、目の座標で指定されています。目の座標では、「目」は原点にあり、-Z軸を見下ろしています。 nearおよびfar clipping planesは、-Z軸に沿ってdistancesとして指定されます。アイ座標でレンダリングする場合、ニアクリッピングプレーンとファークリッピングプレーンの間、および視錐台の内側で指定されたジオメトリはカリングされず、ビューポートに表示されるように変換されます。これは、透視投影の図と、イメージプレーンとの関係です Viewing frustum

目は視錐台の頂点にあります。

最後に説明する変換はmodel-view変換です。これは、座標系(およびオブジェクトではなく、それについては後で説明します)を移動して、目と錐台を見る。一般的なモデリング変換はtranslationsscalesrotations、およびshearsです(OpenGLにはネイティブサポートがありません)。 。

一般的に言って、3Dモデルはローカル座標系を中心にモデル化されます(たとえば、原点を中心とした球の座標を指定します)。モデリング変換は、「現在の」座標系を新しい場所に移動するために使用されます。これにより、ローカルでモデル化されたオブジェクトをレンダリングしたときに、適切な場所に配置されます。

モデリング変換と表示変換の間に数学的な違いはありません。通常、モデリング変換は特定のモデルに使用され、glPushMatrix()およびglPopMatrix()操作によって制御されます。これらは通常、表示変換が最初に指定され、後続のすべてのモデリング操作に影響します。

今、この最新のOpenGL(コアプロファイルバージョン3.1以降)を実行している場合は、これらすべての操作を論理的に自分で行う必要があります(モデルビュー変換と投影変換の両方を単一の行列乗算に折りたたむ1つの変換のみを指定する場合があります)。 。行列は通常、シェーダーuniformsとして指定されます。マトリックススタック、モデルビューと射影変換の分離はありません。パイプラインをエミュレートするには、計算を正しく行う必要があります。 (ところで、perspective Divisionとビューポート変換ステップは、頂点シェーダーの完了後にOpenGLによって実行されます-計算を行う必要はありません[できます。 _gl_Position_頂点シェーダー出力でwを1.0に設定できませんでした)。

58
radical7

アイスペース、ビュースペース、カメラスペースはすべて同じものの同義語です。つまり、カメラに対する世界です。

37
Nicol Bolas