Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 04, 2025 13:55

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Fr Dez 17, 2010 16:45 
Offline
DGL Member

Registriert: Fr Dez 17, 2010 09:58
Beiträge: 3
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 :-)

Danke und Gruß
Jan


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Dez 17, 2010 17:27 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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.
Code:
worldCoord = (x,y,z,1)     // w=1 ist wichtig!
ndcCoord = MVP * worldCoord    // Matrixmultiplikation!
ndcCoord = ndcCoord / ndcCoord.w
pixelCoord.x = (0.5*ndcCoord.x+0.5) * viewportWidth + viewportX
pixelCoord.y = (0.5*ndcCoord.y+0.5) * viewportHeight + viewportY
pixelCoord.z = 0.5 * ndcCoord.z + 0.5      // nur falls du die Tiefe brauchst


Für weitere Details müsste ich wissen welche Mathebiliothek du für WebGL benutzt.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Dez 17, 2010 21:41 
Offline
DGL Member

Registriert: Fr Dez 17, 2010 09:58
Beiträge: 3
Huhu :)

vielen Dank schonmal für die schnelle Antwort!

Also ich nutze die sylvester.js Bibliothek.

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?


Der Inhalt der ProjectionMatrix ist:
Code:
pMatrix: Matrix
elements: Array[4]
0: Array[4]
0: 2.4142135623730954
1: 0
2: 0
3: 0
length: 4
__proto__: Array[0]
1: Array[4]
0: 0
1: 2.4142135623730954
2: 0
3: 0
length: 4
__proto__: Array[0]
2: Array[4]
0: 0
1: 0
2: -1.002002002002002
3: -0.20020020020020018
length: 4
__proto__: Array[0]
3: Array[4]
0: 0
1: 0
2: -1
3: 0
length: 4
__proto__: Array[0]


Die pMatrix erfolgt durch den Aufruf von
Code:
gluPerspective(fovy=45, aspect=1, znear=0.1, zfar=100);

gluPerspective ist in meinem Fall eine Erweiterung der sylvester.js Funktionen von Vladimir Vukićević.

Schonmal vielen Dank für weitere Hinweise :)


Gruß
Jan


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Dez 17, 2010 22:13 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Wie kann ich die ndcCoord nochmal durch w teilen?

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.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Dez 21, 2010 17:27 
Offline
DGL Member

Registriert: Fr Dez 17, 2010 09:58
Beiträge: 3
Huhu nochmal :)

Also ich habe auch eine Modelview Matrix.

Jetzt habe ich mal versucht die stumpf die gluProject() funktion nachzubauen, bekomme aber immer noch nix vernünftiges dabei raus :(

Spezifikation von openGL: http://www.opengl.org/sdk/docs/man/xhtml/gluProject.xml
Zitat:
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:

winX = view ⁡ 0 + view ⁡ 2 × v ″ ⁡ 0 + 1 2
winY = view ⁡ 1 + view ⁡ 3 × v ″ ⁡ 1 + 1 2
winZ = v ″ ⁡ 2 + 1 2


Meine Implementation:
Code:
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 :(


Bin wie immer für jeden Hinweis dankbar :)

Gruß
Jan


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Dez 21, 2010 20:01 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 14 Queries | GZIP : On ]