2011-01-27 12 views
1

私は、Visual C++を使って何らかの3Dモデラーアプリケーションを作成してOpenGLを学ぼうとしています。画面は3つのウィンドウに分割されます:パースペクティブ、フロントとトップ(等角)。 そして、私はほとんどトップビューを実装しようとします。これは私の現在のトップビューコードですglOrthoがトップビューを作成するための適切なパラメータは何ですか?

 

glOrtho(-1,1,-1,1,1,3.5f); 
gluLookAt(
    0,2,0,//eye 
    0,0,0,//center 
    0,0,-1);//up 
 

私は遠くのZにオブジェクトを移動すると、それは確かに消えます。どのようにして、トップビューがシーン内のすべてのオブジェクトを見ることができるようにすることができますか?

glOrthoとglLookAtの必須パラメータはどのように計算できますか?

答えて

1

ジオメトリに応じてz値を調整する必要があります。あなたは、あなたのモデルの境界球またはバウンディングボックスを計算し、Z範囲を見つけてそれに従ってカメラを適応させるべきです。

+0

実際には、正射影ビューを使用して頂点シェーダユニフォームのモデルビュー投影行列を計算して設定するために使用されるglmです。境界ボックスを見つけると、私は何を実装すべきかと思います!ありがとう – swdev

4

gluLookAtを使用しないでください(gluLookの 'u'に注意してください、gluLookAtはOpenGLの一部ではありません)。ただし、modelview行列を直接設定してください。まず、遠く、横にあるものを定義する必要があります。 OpenGLを使用するほとんどの人は右利きの座標系(RHCS)を好む。第1の基底はX、第2のYおよび第3のZである。RHCS Xは横方向(右方向)にYが遠方にあり、Zが上方向である。 OpenGLのデフォルトの投影は、カメラがZ軸を負の方向に見下ろしているかのように、つまり見た目が下がったかのようになります。

だから我々は、マトリックス

1 0 0 0 
0 1 0 0 
0 0 1 0 
0 0 0 1 

を見下ろしていると言うことができます。遠くを見て、あなたは起き上がれています。 Xは同じままですが、YとZは入れ替えられます。これに対応する行列は

0 1 0 0 
0 0 1 0 
1 0 0 0 
0 0 0 1 

今、あなたはおそらく必要が生じYにZとグローバルZマップへ

1 0 0 0 
0 0 1 0 
0 1 0 0 
0 0 0 1 

とビューのXへのグローバルYマップ横向き探して、グローバルXマップになりますそのビューをパンおよびズームする。 glScaleとglTranslateのどちらかを使用するか、またはマトリックス内で直接行うことができます。

s 0 0 pan.x 
0 s 0 pan.y 
0 0 s pan.z 
0 0 0 1 

s 0 0 pan.x 
0 0 s pan.y 
0 s 0 pan.z 
0 0 0 1 

0 s 0 pan.x 
0 0 s pan.y 
s 0 0 pan.z 
0 0 0 1 

ここで、Z方向のパンニングは正射投影ではほとんど意味がありません。だから、pan.zをゼロのままにすることができます。

これで、深みの問題を解決できます。 othographic投影の優れた特性の1つは、depth clip-rangeは、depth bufferに直線的に写像されますが、透視投影では、1/xの法則に従うことです。また、遠距離および近距離の混在した標識も完全に許容されており、また、| near | < |遠く|。したがって、各ビューのために、すべてのオブジェクトの変換された頂点の最小位置と最大位置を決定し、それらを使用して各ビューの投影に適切なクリップ値を設定します。良い近似は、各頂点を反復処理する必要がないように、オブジェクトの境界球と位置(境界球半径をその位置に追加/引く)を使用して最小/最大範囲を得ることです。

+0

それは素晴らしいです!今私はglu/glについて理解しています。だから、私のアプリの互換性を高めるために、私はglライブラリに依存するのではなく、gluライブラリを使う必要があります。 – swdev

+0

GLUは通常OpenGLと一緒に出荷されるので、安全に使用できます。しかし、OpenGLバージョンが3以上の場合、GLUのツールの多くは、もはや仕事にかかっていません。遅かれ早かれ誰か(おそらく私)がそれに対応するために別のGLUを書くつもりです。たとえば、OpenGL-4では、行列スタック全体が削除されています。 glMatrixMode、glLoadMatrixの代わりに、ユニファイドを介してシェーダに行列を提供しています。 ATMではカスタムまたは第三者のコードを使用して行列を生成しています。それのための種類のGLUを持つことはいいでしょう。 – datenwolf

1

glm(GL数学、http://glm.g-truc.net/)はおそらく、答えが書かれた時点でdatenwolfが探していたものです。これはGLUの施設を提供しますが、現代のGLと協力することを意図しています。たとえば、glm :: ortho関数があります。たとえば、GLM:

glm::mat4 model = ... 
glm::mat4 view = ... 

glm::mat4 projection = glm::ortho(-xrange, xrange, 
            -yrange, yrange, 
            -10.0f, 10.0f); 

glm::mat4 mvp = projection * view * model; 

glUniformMatrix4fv(uniform_mvp, 1, GL_FALSE, glm::value_ptr(mvp)); 
関連する問題