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

Aktuelle Zeit: Fr Jul 18, 2025 08:06

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Bildschirmkoordinaten ausgeben
BeitragVerfasst: So Jan 18, 2009 21:17 
Offline
DGL Member

Registriert: So Jan 18, 2009 20:48
Beiträge: 7
Hallo allerseits.

Ich arbeite an einem kleinen Projekt für die Schule, das veranschaulichen soll, wie durch Matrixmultiplikationen Objektkoordinaten in Weltkoordinaten und diese wiederum in Bildschirmkoordinaten überführt werden. Dazu sollen diese drei Koordinatentypen auch nebeneinander angezeigt werden. Die Objektkoordinaten hab ich natürlich schon vorliegen. Die Weltkoordinaten ermittle ich, indem ich die Objektkoordinaten mit der Gesamt-Modelview-Matrix "von Hand" multipliziere. Wie aber lassen sich die Bildschirmkoordinaten eines Vertices, also die Koordinaten auf dem Viewport, ermitteln? Muss ich dazu wirklich die Weltkoordinaten nacheinander mit den Matrizen von Projektions-Transformation, Normierung und Viewport-Transformation multiplizieren? Oder gibt es da auch einen einfacheren Weg? Die Foren-Suche hat mich leider nicht weitergebracht...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 19, 2009 12:48 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Nein, es gibt keinen einfacheren Weg. OpenGL macht es auch so. Wenn es eine Abkürzung gäbe, würde OpenGL die Abkürzung nehmen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 19, 2009 12:55 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jul 29, 2003 00:11
Beiträge: 436
Wobei dir das OpenGL abnehmen kann:
http://wiki.delphigl.com/index.php/gluProject


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 19, 2009 15:26 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Tja, ein Grafikprogrammierer könnte sich das leisten. Aber ich denke mir, der arme Kerl muss das in der Schule dem Lehrer vorhüpfen wie das geht. Oder irre ich mich? In diesem Fall wäre es gut, in den Mesa-Sourcecode von gluProject auf SourceForge hineinzuschauen. Ich habe dort einen Blick drauf gemacht und eigentlich kein SVN gefunden. Es sieht aus, als könnte man sich nur die ganze Library herunterladen. Du kannst aber auch mit der Google-Code-Suche nach „mesa“ und „gluProject“ suchen, es gibt dieses Zeugs tausendfach in irgendwelchen anderen Libraries im Internet. Du solltest ein bisschen C verstehen, dann hast den gesuchten Code, ohne Dich viel anstrengen zu müssen. :wink:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 19, 2009 16:31 
Offline
DGL Member

Registriert: So Jan 18, 2009 20:48
Beiträge: 7
Also müssen tu ich gar nichts, das Projekt ist ja nur ein kleiner praktischer Teil meiner Facharbeit über Matrizenrechnung. ^^ Mathematisch kann ich durchaus erklären, wie man die Objektkoordinaten in Bildschirmkoordinaten umrechnet, nur "von Hand" erledigt erscheint mir das ein wenig kompliziert. In dem Sinne wäre die Funktion gluProject eigentlich genau das, was ich gesucht habe.

Ich hab es damit mal probiert und bekomme deim Funktionaufruf dummerweise eine Zugriffsverletzung gemeldet...

Hier wäre der Code:

Code:
  1. //Objektkoordinaten ermitteln
  2. objx := Objekt.Vertices[i].x;
  3. objy := Objekt.Vertices[i].y;
  4. objz := Objekt.Vertices[i].z;
  5. //Weltkoordinaten ermitteln
  6. Weltkoordinaten[1] := objx*Gesamt_Modelview[0] + objy*Gesamt_Modelview[4] + objz*Gesamt_Modelview[8] + Gesamt_Modelview[12];
  7. Weltkoordinaten[2] := objx*Gesamt_Modelview[1] + objy*Gesamt_Modelview[5] + objz*Gesamt_Modelview[9] + Gesamt_Modelview[13];
  8. Weltkoordinaten[3] := objx*Gesamt_Modelview[2] + objy*Gesamt_Modelview[6] + objz*Gesamt_Modelview[10] + Gesamt_Modelview[14];
  9. //Bildschirmkoordinaten ermitteln
  10. glGetDoublev(GL_VIEWPORT, @Viewport);
  11. if gluProject(objx,objy,objz,ModelviewMatrix,ProjectionMatrix,Viewport,winx, winy, winz) = GL_TRUE then
  12.  begin
  13.   Fensterkoordinaten[1] := winx^;
  14.   Fensterkoordinaten[2] := winy^;
  15.   Fensterkoordinaten[3] := winz^;
  16.  end
  17. else
  18.  begin
  19.   Fensterkoordinaten[1] := 0;
  20.   Fensterkoordinaten[2] := 0;
  21.   Fensterkoordinaten[3] := 0;
  22.  end;


ModelviewMatrix und ProjectionMatrix ermittle ich genau so wie Viewport mit glGetDoublev.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 19, 2009 17:09 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Hach du glücklicher... Hast du ein Schönes Facharbeitsthema :).

Also... Wo ne Zugriffsverletzung auftaucht kann ich mir gerade nicht erklären, das sieht soweit gut aus. Hast du mal die Typen winx, winy und winz mit der Deklaration von gluProject verglichen?

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 19, 2009 18:22 
Offline
DGL Member

Registriert: So Jan 18, 2009 20:48
Beiträge: 7
Das Thema hab ich auch selber vorgeschlagen. ^^ War wirklich eine schöne Sache, auf die Weise einen Grund bekommen zu haben, OpenGL zu lernen. :)
Aber jetzt darf ich langsam schauen dass ich fertig werde, am 30. ist schon Abgabe...


Also die winx, winy und winz sind bei mir auch vom Typ PGLdouble, wie gluProject es haben will. Deswegen muss ich sie ja dann auch dereferenzieren, um den Variablen vom Fensterkoordinaten-Array ihre Werte zuzuweisen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 19, 2009 18:45 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Hallo,

hast du dann auch per New(winx); Speicher angefordert?

Markus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 19, 2009 22:38 
Offline
DGL Member

Registriert: So Jan 18, 2009 20:48
Beiträge: 7
Natürlich nicht, deswegen gabs ja auch ne Zugriffsverletzung! ;)

Danke für den Hinweis, da hab ich irgendwie überhaupt nicht dran gedacht. Man möge mir diesen Anfängerfehler nachsehen. ^^ Fehlermeldung gibts jetzt keine mehr.

Die richtigen Werte spuckt mir aber gluProject leider auch noch nicht aus. Die z-Werte variieren, je nachdem wohin ich den Augenpunkt verschiebe und die x- und y-Werte sind schlicht und einfach immer 0. Hat jemand eine Idee, was ich da noch verkehrt mache? Die Modelview- und Projection-Matrix sowie die Ausmaße vom Viewport ermittle ich ja allesamt mit einem Aufruf von glGetDoublev und ich wüsste nicht, was dabei schief laufen kann...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 19, 2009 23:20 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Hast du beachtet, dass die Werte Spaltenweise geliefert werden, nicht Zeilenweise?

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 19, 2009 23:49 
Offline
DGL Member

Registriert: So Jan 18, 2009 20:48
Beiträge: 7
Bei der Berechnung der Weltkoordinaten, für die ich die Modelview-Matrix in ein Array geschrieben habe, auf jeden Fall.

Bei gluProject bin ich eigentlich davon ausgegangen, dass man die Variablen vom Typ TGLMatrixd4, wie man sie mit glGetDoublev ausliest, direkt als Parameter angeben kann. Steht ja so auch im Wiki: "Die aktuelle Modelviewmatrix. (wie sie mittels glGetDoublev abgefragt werden kann.)"
Ich muss doch bestimmt nicht die transponierten Matrizen ausrechnen und die als Parameter angeben?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 20, 2009 00:00 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Nö nö. Ich wollte nur sicher gehn, dass vorher kein Fehler drinnen war.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 20, 2009 03:30 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Wenn immer 0/0 rauskommt, muss es wohl am Input hängen.

Du musst sicher stellen, dass Deine Objektpunkte zulässig sind (das Objekt muss im Viewport zu sehen sein), und dass die beiden Matrizen und auch der Viewport mit gültigen Werten bestückt sind. Lass Dir mal die Werte der Input-Daten anzeigen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 21, 2009 19:38 
Offline
DGL Member

Registriert: So Jan 18, 2009 20:48
Beiträge: 7
Hab mal das Programm an der Stelle angehalten und mir mit "Auswerten/Ändern" die Werte der Parameter von gluProject ausgeben lassen:

Zitat:
objx: 0.5
objy: 0.5
objz: 0
ModelviewMatrix: ((1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1))
ProjectionMatrix: ((500, 300, 0, 0), (0, 2.2686188221, -0.34270489216, -0.342020154), (0, -0.82570970058, -0.94157385826, -0.93969261646), (0, 0, 3.0080080032, 5))
Viewport: (0, 0, 0, 0)


Also mit Viewport scheint was nicht zu stimmen. Ich hab aber keine Ahnung warum. Der Aufruf von glGetDoublev sieht überall genau so aus wie bei mir (hab mal ein bisschen rumgesucht) und dass ich keinen Viewport habe kann auch nicht sein, da ich ja ein Bild sehe. ;) 500x300 müsste der Viewport eigentlich groß sein...

EDIT: Von wegen sieht überall genau so aus! Ich brauch glGetIntegerV, nicht glGetDoublev! :) Bekomme jetzt die korrekten Bildschirmkoordinaten ausgegeben.

Was mich noch interessieren würde: Was sagt der z-Wert eigentlich über die Darstellung des Vertex am Bildschirm aus? Ein Bildschirm hat doch nur 2 Dimensionen... ^^'


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 21, 2009 20:12 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Eigentlich sollte der Z Wert null werden. Das ist ja gerade das Ergebnis ein (jeden?) Projektion: Informationsverlust.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 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.010s | 15 Queries | GZIP : On ]