2016-08-11 4 views
0

Ich möchte den Ansichtsvektor erhalten. Danach möchte ich den Winkel zwischen dem Normal- und dem Ansichtsvektor berechnen, um zu bestimmen, welche Flächen vollständig sichtbar, teilweise sichtbar und nicht sichtbar sind.Verständnis der Mathematik hinter dem View-Vektor in OpenGL

Eine ähnliche Frage sight vector in opengl könnte etwas Licht zu diesem Thema geben. Bitte korrigiere mich, wenn ich falsch liege, die Sichtlinie in 1 ist die gleiche wie der Ansichtsvektor. Wenn dies der Fall ist, werden die Grundlagen nicht klar dargestellt und die Diskussion könnte die Dinge für einen neuen Anfänger klären.

Das Problem ist, die Theorie in Code zu verbinden und zu verstehen, was sind ProjectionMat, ModelView, Vetexpos und wie man es erhält? Ich nehme an, es kann als solches erhalten:

glGetFloatv(GL_PROJECTION_MATRIX, projection);//returns the matrix of projectionview 
    glGetFloatv(GL_MODELVIEW_MATRIX, modelview); //returns the identity matrix of modelview` 

Doch wie man die vertexpos bekommen hat? Finden Sie außerdem das Kreuzprodukt der gesamten Matrix oder nur für die x, y, z-Koordinaten?

Wenn dies nicht der richtige Weg ist, um den Ansichtsvektor zu berechnen, wie erreicht man?

+0

Ich bin verwirrt. Sie benötigen den View-Vektor, um Ihre Kameramatrix (View-Matrix) mit Hilfe von gluLookAt einzurichten. –

+0

Nein meine Kamera ist eingerichtet. Die gluLookAt Werte sind (30,20,35, 0,0,0, 0,1,0). Um besser zu verstehen, in welche Richtung ich gehe [link] (http://forum.devmaster.net/t/which-view-vector-to-use-for-back-face-culling/6319). Der Ansichtsvektor kann in der Rückseitenauslese-Methode verwendet werden. Ich möchte nicht rückwärts cullen. Ich möchte die Gesichter bestimmen, die sichtbar, teilweise sichtbar und nicht sichtbar sind. Dies wird erhalten, indem zuerst der Ansichtsvektor abgerufen wird. Ich verstehe die Theorie, aber ich kämpfe um es zu implementieren. – Sade

+0

(0,0,0) - (30,20,35)? – Mars

Antwort

0

Zum besseren Verständnis der Matrizen Verwendung siehe

zu bekommen Wenn Sie die letzte Kamera Matrix bekam ... dann seine inverse (oder transponieren) enthält die Koordinate System der Kamera. also extrahiere einfach seinen Z-Achsenvektor und das ist es.

Sie können wie diese Matrizen aus Standard-OpenGL-Matrix-Stack erhalten:

float ProjectionMatrix[16]; 
float ModelViewMatrix[16]; 
glGetFloatv(GL_PROJECTION_MATRIX, ProjectionMatrix); 
glGetFloatv(GL_MODELVIEW_MATRIX, ModelViewMatrix); 

jedoch das Problem, dass Sie separates Objekt und Kamera-Matrizen nicht haben, ist statt sie in einzelne Matrix GL_MODELVIEW_MATRIX kombiniert werden. Die andere Matrix GL_PROJECTION_MATRIX wird verwendet, um Kameraparameter wie FOV zu speichern ... Und darf die Ansichtsmatrix überhaupt nicht enthalten, weil das die Funktionalität einiger fortgeschrittener Licht-/Nebel-/etcfähigkeiten der örtlich festgelegten OpenGL-Rohrleitung/Funktion bricht (dh Projektionsmatrix missbraucht).

Wie auch immer in jedem anständigen Rendering-Code sollten Sie separate Matrix für jedes Objekt und Kamera direkt in Form von Variablen, die ihre Koordinatensysteme (ohne gluLookAt ...).

diese Weise können Sie leicht Kameraeffekte wie Folge Objekt etc ... machen

camera_follow = Inverse(object * view_displacement) 

wo view_displacement zu folgen Objekt nur tatsächliche Translation und Rotation der Ansicht ist relativ.

Wenn Sie die endgültige Kameramatrix haben, ist die Blickrichtung die Z-Achse (wie Sie richtig angenommen haben).Sie sollten berücksichtigen, wenn die Matrix direkt oder Umkehrung des Kameraraumes ist so entweder

// direct 
z[0] = camera[ 8] 
z[1] = camera[ 9] 
z[2] = camera[10] 

oder:

// inverse 
z[0] = camera[ 2] 
z[1] = camera[ 6] 
z[2] = camera[10] 
+0

Angenommen, ich habe ein Objekt, in diesem Fall ist meine Kameramatrix meine ModelViewMatrix? – Sade

+1

@Kribz ModelViewMatrix ist eine Kumulation aller Transformationen wie: 'Inverse (Kamera) * Objekt', also nicht, es sei denn, Ihre Objektmatrix ist Einheit. Deshalb sollten Sie für jedes Objekt eine Matrix als separate Variable haben. Die meisten Leute benutzen GLM dafür. – Spektre

+0

Dank habe ich glm enthalten. Ich möchte nur klarstellen, dass Glm nur eine Bibliothek ist, die die Matrizen behandelt und dass Funktionen wie glm :: perspective oder lookAt usw. nur die Matrix aufbauen. Wie ist die Verbindung zurück zu gluPerspective? Ich verwende derzeit gluLookAt oder gluPerspective. Die von gluPerspective erzeugte Matrix wird mit der aktuellen Matrix multipliziert, so als ob glMultMatrix mit der generierten Matrix aufgerufen würde. Um stattdessen die Perspektivematrix auf den aktuellen Matrixstapel zu laden, muss gluPerspective vor Aufruf von glLoadIdentity aufgerufen werden. – Sade

Verwandte Themen