2016-07-08 7 views
0

Ich versuche, meine Kameraprojektion von Perspektive zu orthographisch zu ändern. mein Code Im Moment arbeitet gut mit der perspektivischen ProjektionVon Perspektive zu orthographischen Projektionen

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); 

Aber sobald ich es Orthogonalprojektion ändere ich nicht mehr meine Masche sehen kann.

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); 

Ich verstehe nicht, was ich falsch mache.

+0

Haben Sie versehentlich die Argumente in 'ortho' getauscht? Die Signatur sollte "ortho (links, rechts, unten, oben, nah, weit)" sein. Was ist das 5.0? – peppe

+0

Eigentlich ja, setze oben auf 0.0f erlauben mir zumindest eine extrem kleine Reihe von Pixeln in der oberen linken Ecke meines Fensters zu sehen. Bei Verwendung der perspektivischen Projektion wird mein Netz jedoch in der Mitte des Bildschirms angezeigt und hat eine "normale" Größe. Dennoch verstehe ich nicht, warum es so weit weg und nicht zentriert angezeigt wird. Hast du eine Ahnung? – Izzy88

+0

In Anbetracht dessen, dass meine DISPLAY_WIDTH und DISPLAY_HEIGHT jeweils 800 und 600 sind, ändern Sie diese Werte von 'm_ortho = glm :: ortho (0.0f, 800.0f, 600.0f, 5.0f, 0.01f, 1000.0f);' zu 'm_ortho = glm :: ortho (8,0 f, 0,0 f, 0,0 f, 6,0 f, 0,1 f, 100,0 f); ' macht die Größe wieder normal (mehr oder weniger). Aber ich verstehe nicht, ob es eine Regel oder eine spezifische Beziehung gibt, um die Größenwerte von der perspektivischen Projektion in die orthographische Projektion zu ändern. (Nur um zu vermeiden, sie jedes Mal manuell zu ändern) – Izzy88

Antwort

2

In der perspektivischen Projektion bewertet der Begriff (float)DISPLAY_WIDTH/(float)DISPLAY_HEIGHT das Bildseitenverhältnis. Diese Zahl wird nahe bei 1 liegen. Die Abstände der linken und rechten Clippläne in der nahen Ebene für die perspektivische Projektion sind aspect * near_distance. Interessanter ist jedoch die Ausdehnung von links-rechts im Betrachtungsabstand, die in Ihrem Fall abs(m_position.z)= abs(mesh.radius) ist.

Bei der orthografischen Projektion sollten die Abstände der linken, rechten, oberen und unteren Clip-Ebene in der gleichen Größenordnung liegen. Da der Aspekt nahe bei 1 liegt, sollten die Werte für links, rechts, unten und oben angegeben werden nahe dem Wert von abs(mesh.radius). Die Auflösung der Anzeige in Pixeln ist außer für das Seitenverhältnis völlig irrelevant.

Außerdem sollte bei Verwendung einer perspektivischen Projektion der Wert für near so groß wie möglich gewählt werden, damit die gewünschte Geometrie sichtbar ist. Anderenfalls wird wertvolle Tiefenpuffer-Auflösung verschwendet.

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

Vielen Dank @datenwolf, sowohl für Ihre Erklärung als auch für Ihren sehr weisen Vorschlag in Ihrer vorherigen Nachricht. Ich stimme Ihnen vollkommen zu und das würde ich normalerweise tun. Leider habe ich in diesem Fall nicht viel Zeit, um dieses Thema zu vertiefen und zu erforschen, und das ist nicht gerade ein Schlüsselargument für das, was ich gerade erstellen möchte. Es wurde ziemlich frustrierend. Vielen Dank auch für Ihren Code, es funktioniert perfekt (ich musste nur ein - vor dem dritten Parameter hinzufügen, falls jemand anderes es braucht). – Izzy88