2013-04-21 25 views
14

現在、OpenGL搭載のレンダラを2Dゲームエンジンに実装しようとしています。2Dワールドをスクリーン座標に変換する方法OpenGL

OpenGLの画面座標空間は[-1,1]なので、一般的なデカルト座標系のワールド座標系とのインターフェース方法について少し混乱します。

私の世界のビューポートは[-500、-500]から[1200、1200]までですが、[0、0]は世界の起源です。 -1と1の間の座標に変換して縮小するだけですか?あるいは、実行する必要のある他の形式の変換がありますか?

自分の座標系で位置が定義されているオブジェクトを画面上で描画する方法をどのように計算しますか?

私は、glOrthoの有無に関わらず説明していただきたいと思います(視点効果のためにZ軸も使用できます)。

答えて

13

まず、OpenGLは複数の座標系を使用しているため、「 OpenGL座標系」はありません。あなたが指しているのは、3つの座標すべてが[-1,1]の範囲にある正規化されたデバイス座標(NDC)です。異なる座標系とその名前については、hereのセクション「9.011座標がどのように変換されますか?異なる座標空間は何ですか?」で説明されています。 1)

第2に、混乱を避けるために、OpenGLでは、「ビューポート」という用語は、レンダリングするウィンドウの一部を指し、ウィンドウ座標です。あなたの質問では、ワールド座標系でレンダリングしたいあなたの世界の部分(l、r、t、b)=( - 500、-500、1200、1200)を記述するために使用しました。

「画面上でオブジェクトを描画する場所を計算する」方法を尋ねました。あなたがする必要があるのは、ある座標系から別の座標系に写像する変換(4×4行列)を定義することです。あなたの2D世界は世界座標で与えられますので、世界座標をNDCに変換する行列、つまり投影行列を定義する必要があります。シェーダでは、頂点にこの投影行列を単純に掛けて、NDCを取得します。 glm::ortho/glOrthoは、そのような投影行列を計算する。透視投影については、あなたが何をしたいのかははっきりしませんが、perspectivelookat関数をglmで試してみる必要があります。

明確にするには、任意の座標系(ワールド座標系と呼ばれます)で頂点を定義し、単にこれらの頂点を描画します。頂点シェーダーの仕事は、定義した変換を適用することです。

また、正方形を指定していることに注意してください。通常、これはあなたが望むものではありません。モニターとほとんどのウィンドウは正方形ではありません。したがって、その正方形を典型的なビューポートにマップすると、あなたの世界が歪んで見えます。ビューポートのアスペクト比(幅:高さ)を考慮する必要があります。私はそれを説明しようとしたhere


1)補足として、FAQはかなり古く、古いバージョンのOpenGLを指します。現在、プログラマは、シェーダで必要となるため、モデルビューと投影行列の両方を管理することが期待され、奨励されています。私はglmを強く推奨します。ヘッダーのみのため、統合が非常に簡単で、GLSLを反映する素晴らしい構文があります。

+0

正射影投影行列を使用している場合、ビューはZ軸を無視するので2Dになります。正しいでしょうか?私がやっているほとんどのことについては問題ありませんが、私は、Z軸を使って2D世界で平らではない視点を作り出すことを実験したいと考えています。ですから、オルソではなく、パースペクティブの変換マトリックスをどのように定義しますか?どのGL関数がそれをするのですか? – bgroenks

+0

1)いいえ、Z軸を無視しないで、同じピクセルに同じxy座標のものを投影します。しかし、あなたはまだ深さテストを行うことができます。 2) 'glm :: perspective'。 –

+0

どのようにglm :: perspectiveを使用しますか?それは 'gl_ModelViewProjectionMatrix'とどのように対話しますか? – bgroenks

1

投影行列にglOrthoを使用し、次に正常に描画します。あなたの例では、ビューポートに幅1000単位、高さ3000単位を与えるglOrtho(0、1000、0、3000、-1,1)があると推測します。

0

シーンを任意の座標系欲しいです。 glm(http://glm.g-truc.net/)を使用して行列を初期化し、数学演算などを実行することをお勧めします。2D/3D世界のすべてのオブジェクトを管理するシーングラフエンジンがおそらくあります。単にglmで表示と投影を正しく設定します。実際には、グラフィックパイプラインの実装の詳細は必要ありません。そのため、ゲームエンジンに設計上の決定が悪い可能性があります。

関連する問題