Hallo erstmal zusammen Ich bin neu hier und beschäftige mich derzeit mit webGL.
Habe schon einige Tutorials durchgearbeitet, und das einzige was ich irgendwie nicht so richtig verstehen will ist die Sache mit den Units wie sie in openGL verwendet werden. Die können ja nun alles sein...
Ich muss aber - für das Zusammenspiel mit Javascript und meinem webGL Canvas Element - die Position eines Vertices in Pixeln, relativ zum Rand des Canvas haben. Habe rausgefunden, dass bei einer Perspektive von 45° wenn man auf der Z-Achse bei -50 Units liegt 1 Unit ziemlich genau 10 Pixeln entspricht. Leider ändert sich die Anzahl der Pixel nicht relativ zur Position der Z-Achse, wenn ich also z=-25 habe entspricht eine Unit keinen 20 Pixeln Ich nehme mal an dass das an der Perspective bzw. dem Betrachtungswinkel liegt.
Jetzt ist die Frage ob und wie ich die Pixel Positionen eines Vertices anhand der mir vorliegenden Informationen irgendwie errechnen kann, oder es da fertige Funktionen zu gibt. Ich bin nach einigem Suchen hier im Forum und im Wiki auf 'gluProject' (http://wiki.delphigl.com/index.php/gluProject) gestoßen, bin mir aber nicht sicher ob ich hier richtig bin.
Wäre super wenn mir da jemand Hinweise geben könnte
gluProject ist vom Prinzip richtig. Wenn du aber mit WebGL arbeitest gibt es das nicht.
Letztlich musst du nichts weiter als den Vertex mit der ModelViewProjection-Matrix zu multiplizieren und durch w zu teilen. Dann noch die Viewport-Transformation anwenden.
Damit habe ich mir nun folgenden Code zusammengestellt, der aber leider nicht das gewünschte Ergebnis liefert, was aber wohl daran liegt dass ich nicht alles aus deinem Code Beispiel umsetzen konnte...
Code:
var vec=Vector.create([0.0, 1.0, 0.0, 1]); // x,y,z coordinaten (in units) des zu berechnenden vertices var ndcCoord = pMatrix.multiply(vec); //pMatrix = Projection Matrix //ndcCoord = ndcCoord / ndcCoord[3]; /division durch w, auskommentiert da keine geeignete Methode zum dividieren gefunden var x = (0.5 * ndcCoord.elements[0] + 0.5) * gl.viewportWidth; // was ist viewPortX? var y = (0.5 * ndcCoord.elements[1] + 0.5) * gl.viewportHeight; // was ist viewPortY?
Meine Probleme: - Wie kann ich die ndcCoord nochmal durch w teilen? - Ist w immer = 1? Wenn ja ist dann das teilen nicht überflüssig? - Was ist viewPortX und viewPortY? Der Offset ab dem berechnet werden soll, also im Zweifelsfalle 0?
Im Zweifelsfalle den Vektor mit 1/w multiplizieren
Zitat:
Ist w immer = 1? Wenn ja ist dann das teilen nicht überflüssig?
Nein, nach der Matrix ist w nicht mehr 1. Es handelt sich um homogene Koordinaten, falls dir das etwas sagt. Die Matrix sorgt dafür das in w quasi die Entfernung zur Kamera steckt und man teilt dann durch die Entfernung. Eine Projektion ist letztlich nur Dreisatz
Zitat:
Was ist viewPortX und viewPortY? Der Offset ab dem berechnet werden soll, also im Zweifelsfalle 0?
Das was du bei glViewport benutzt hast. Ja, 0 ist in 99% der Fälle richtig.
Hast du nur die Projektionsmatrix oder auch eine Modelview-Matrix die z.B. eine Rotation, Verschiebung oder Skalierung durchführt. Bzw. wird dein Objekt rotiert, verschoben oder skaliert? Du brauchst die komplette Matrix die du auch dem WebGL-Shader gibst.
To compute the coordinates, let v = objX objY objZ 1.0 represented as a matrix with 4 rows and 1 column. Then gluProject computes v ″ as follows:
v ″ = P × M × v where P is the current projection matrix proj and M is the current modelview matrix model (both represented as 4 × 4 matrices in column-major order).
The window coordinates are then computed as follows:
function gluProject(objx, objy, objz, modelview, projection, viewportHeight, viewportWidth) { var vec=Vector.create([objx, objy, objz, 1.0]); var temp1=projection.multiply(modelview); var temp2=temp1.multiply(vec);
var x = viewportWidth * (temp2.elements[0] + 1) / 2; var y = viewportHeight * (temp2.elements[1] + 1) / 2;
console.log('x: '+x); console.log('y: '+y);
}
Wenn ich die aber mit folgenden Werten aufrufe: gluProject(0.0, 1.0, 0.0, mvMatrix, pMatrix, 500, 500) Bekomme ich folgende Werte raus die leider nicht meinen Erwartungen entsprechen: x: 250 y: 853.5533905932738
In der openGL Spezifikation ist ja auch nichts vom w-Wert beschrieben. Den hab ich jetzt ja in dem Vektor mal auf 1 gesetzt, in temp2 also nach den Multiplikationen ist der aber wieder 0, wodurch ich natürlich nicht teilen kann...
Also irgendwie hab ich wohl noch ein grundlegendes Verständnisproblem
Du musst durch w teilen sonst wird das nix. Ist wohl ein Fehler in der Spec oder man nimmt an das es offensichtlich ist das man bei einer Funktion die "project" heißt irgendwo durch w teilt....den das ist die eigentliche Projektion
Wenn es sonst nicht funktioniert wäre es noch möglich, dass du die Matrizen transponieren musst, bzw. v * M * P statt P * M * v
Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.