2016-07-08 14 views
0

私は、カメラ投影を視点から正射影に変更しようとしています。 現時点では私のコードは、透視投影視点から正投影へ

m_prespective = glm::perspective(70.0f, (float)DISPLAY_WIDTH/(float)DISPLAY_HEIGHT, 0.01f, 1000.0f); 
m_position = glm::vec3(mesh.centre.x, mesh.centre.y, -mesh.radius); 
m_forward = centre; 
m_up = glm::vec3(0.0f, 1.0f, 0.0f); 
return m_prespective * glm::lookAt(m_position, m_forward, m_up); 

で正常に動作しているしかし、すぐに私は正投影に変更するように私はもう私のメッシュを見ることができません。

m_ortho = glm::ortho(0.0f, (float)DISPLAY_WIDTH, (float)DISPLAY_HEIGHT,5.0f, 0.01f, 1000.0f); 
m_position = glm::vec3(mesh.centre.x, mesh.centre.y, -mesh.radius); 
m_forward = centre; 
m_up = glm::vec3(0.0f, 1.0f, 0.0f); 
return m_ortho * glm::lookAt(m_position, m_forward, m_up); 

私は間違っていることを理解していません。

+0

誤って引数を 'ortho'に入れ替えましたか?署名は 'ortho(left、right、bottom、top、near、far)'でなければなりません。その5.0は何ですか? – peppe

+0

実際にはyes、topを0.0fに設定すると、少なくともウィンドウの左上隅に極端に小さなピクセルが表示されます。ただし、透視投影を使用すると、メッシュは画面中央に表示され、「通常」のサイズになります。それでも、なぜ遠く離れて表示されているのか、中心にないのか分かりません。何か手掛かりはありますか? – Izzy88

+0

DISPLAY_WIDTHとDISPLAY_HEIGHTがそれぞれ800と600であることを考慮して、これらの値を 'm_ortho = glm :: ortho(0.0f、800.0f、600.0f、5.0f、0.01f、1000.0f);から' m_ortho = glm ::オルト(8.0f、0.0f、0.0f、6.0f、0.1f、100.0f); ' は、サイズを通常(多かれ少なかれ)に戻します。しかし、サイズの値を透視投影から正射影投影に変更するためのルールまたは特定の関係があるかどうかはわかりません。 (毎回手動で変更するのを避けるため) – Izzy88

答えて

2

透視投影では、(float)DISPLAY_WIDTH/(float)DISPLAY_HEIGHTという用語は画像のアスペクト比を評価しています。この数値は、1に近づくはずです。透視投影の近平面における左右のクリップ面の距離は、aspect * near_distanceです。さらに興味深いのは、表示距離で左右に広がっています。あなたの場合はabs(m_position.z)= abs(mesh.radius)です。

これを正射影投影にすると、左、右、上、下のクリップ面の距離は同じ桁でなければなりません。アスペクトが1に近い場合、左、右、下、 abs(mesh.radius)の値に近い。ピクセル単位での表示の解像度は、アスペクト比を除いて全く関係ありません。

さらに、透視投影を使用する場合は、希望のジオメトリがすべて表示されるように、できるだけ大きくなるようにnearの値を選択する必要があります。さもなければ貴重な深さのバッファー解像度を無駄にするでしょう。

float const view_distance = mesh.radius + 1; 

float const aspect = (float)DISPLAY_WIDTH/(float)DISPLAY_HEIGHT; 
switch(typeof_projection){ 
case perspective: 
    m_projection = glm::perspective(70.0f, aspect, 1.f, 1000.0f); 
    break; 

case ortho: 
    m_projection = glm::ortho(
     -aspect * view_distance, 
     aspect * view_distance, 
     view_distance, 
     view_distance, 
     -1000, 1000); 
    break; 
} 

m_position = glm::vec3(mesh.centre.x, mesh.centre.y, -view_distance); 
m_forward = centre; 
m_up = glm::vec3(0.0f, 1.0f, 0.0f); 

return m_projection * glm::lookAt(m_position, m_forward, m_up); 
+0

あなたの説明とあなたの前のメッセージのあなたの非常に賢明な提案の両方のために、とても@datenwolfに感謝します。私はあなたに完全に同意し、それは私が通常行うことです。残念なことに、この場合、私はこのトピックを深く探検するための時間があまりありませんが、これは私が現在作成しようとしているものの重要な議論ではありません。それはかなりイライラするようになり始めました。 あなたのコードもありがとう、それは完璧に働いています(私は、誰かがそれを必要とする場合は、3番目のパラメータの前に - を追加する必要があります)。 – Izzy88

関連する問題