Hallo, ich habe bei glortho ein Screen von 500x500Pixel. Wenn ich mich dort bewege usw geb ich die Werte sozusagen in Pixel an, wie das im Verhältnis zum Screen steht. Ich habe dann dort eine gute Übersicht über Abstände usw.
Nun möchte ich diese Verhältniss auch im 3d-Raum schaffen, sodas ich Pixelverhältnisse habe. Geht das ? Wenn ja, wie macht man so etwas?
Ich denke unter "3D-Raum" verstehst du eine perspektivische Projektion. Dort werden Objekte mit der Entfernung zur Kamera kleiner und ggf. auch verzerrt. Was nun ein Abstand von 50 Pixel heißt, hängt daher stark davon ab in welcher Entfernung sich die Objekte befinden.
gluProject und gluUnProject könnten dir vielleicht helfen. Diese Rechnen von 3D-Raum in Screenspace um und wieder zurück. Du kannst also die 3D-Positon deines Objektes in gluProject stecken, das Ergebnis z.B. um 50 Pixel nach links verschieben und mit gluUnProject wieder zurück rechnen.
Dir sollte klar sein das insbesondere gluUnProject recht langsam ist, weil eine Matrix invertiert werden muss. Es ist ggf. sinnvoller das ganze selbst zu implementieren. So braucht die Matrix nur dann invertiert werden wenn sie sich ändert und du kannst beliebig viele Positionen hin und her transformieren. Z.B. vec3ProjectCoord() von meinem CoolMath macht letztlich nichts anderes als gluProject. Wenn du vec3ProjectCoord() die inverse Matrix gibst, hast du gluUnProject.
var coord : TGLVectord3; // Datentyp ist in der dglOpenGL.pas definiert screen : TGLVectord3; viewport : TGLVectori4; // Datentyp ist in der dglOpenGL.pas definiert modelview : TGLMatrixd4; // Datentyp ist in der dglOpenGL.pas definiert projection: TGLMatrixd4;
Das geht so nicht weil der Raum nicht linear ist. Die 300 Einheiten bewirken nicht an jeder Stelle des Raumes das gleiche. Wie gesagt, das ist abhängig davon wie weit das Objekt von der Kamera entfernt ist. Das einzige was geht ist zwischen den Koordinatensystemen hin und her zu rechnen und sich so eine Verschiebung herzuleiten. Diese gilt dann aber immer nur für einen bestimmten Punkt, nicht für ganze Objekte. Wie das geht habe ich oben versucht zu erklären.
Nochmal: Erklär uns bitte was du GENAU machen willst. Vielleicht lässt sich für deinen Anwendungsfall eine viel einfachere/elegantere Lösung finden. Z.B. könnte es sein das du versuchst ein grafisches User-Interface (GUI oder HUD) über deine Szene zu rendern?
Registriert: Do Feb 21, 2008 10:49 Beiträge: 55 Wohnort: Dresden
Programmiersprache: FPC/Linux
so wie ich das verstanden habe, möchte er, dass eine raumeinheit einem pixel entspricht. also dass ich ein objekt mittels gltranslatef(1,0,0) um einen pixel nach rechts verschiebe.
@McWurscht: Soweit habe ich ihn verstanden. Es ging mir um eine Erklärung warum er glaubt diese Funktion überhaupt zu benötigen.
@funkheld: Möglicherweise gibt es eine viel einfachere Lösung für das eigentliche Problem, dazu muss ich aber mehr darüber wissen was du da machst/versuchst.
Es geht um eine bessere Raumorientierung. Wenn ich 0.111 Eingebe für eine X-Position oder dafür 50(Pixel) ist das zweite ergebnis für mich vorstellbarer. Zumal ich vorher weiss, wie gross der Raum ist zb 450x450x450.
Registriert: Fr Jan 04, 2008 21:29 Beiträge: 419 Wohnort: Lübeck
Das mit der besseren Orientierung ist ein gar nicht gute Idee.
Gehen wir davon aus, du hättest eine Matrix, die deine Objekt koordinaten anhand von Bildschirm koordinaten im Raum platzieren kann, dann musst du auch zwangsläufig eine Tiefe mit angeben, ansonsten lässt sich die Rechnung nicht durchführen. Diese Tiefe müsste also eine gewisse Konvention haben mit der Bildschirmauflösung. Nur wie soll das Funktionieren, denn die Auflösung eines Pixels geschieht nicht durch eine einfache Zuweisung, sondern durch eine Umrechnung, die einen Pixel auf dem Bildschirm in ein unendlich langes Trapetz deformiert (unendlich nicht, aber es reicht von Nearplane bis farplane). Da deine Pixel mit zunehmender Entfernung also immer ungenauer in den Raum projezieren kannst du keine vernünftige Tiefenkonvention festlegen, anhand derer du das Objekt platzieren kannst.
Davon mal ab macht es in meinen Augen wenig Sinn, denn wenn ich Objekte platziere, beschreibe ich ja auch eher so: "Der Mann steht 2m neben dem Baum." Die absolute Entfernung zwischen beiden beträgt also 2. Nach deiner Methode würde das so aussehen: "Der Mann steht 12pixel neben dem Baum, solange ich 15m vom Baum entfernt bin und genau in seine Richtung schaue." Sobald du dich bewegst oder drehst, verändert sich der Abstand aufgrund der perspektivischen Verzerrung. Es würde reichen sich so zu drehen, dass Baum und Mann nicht mehr in der Mitte des Bildes, sondern rechts am Bildrand stehen, damit der Abstand plötzlich 12pixel auf 30pixel steigt. Nichts hat sich verändert, außer dir, aber trotzdem hätten Baum und Mann verschieden Positionen und Entfernungen zu einander. Das erschwert dir einiges!
Edit: Stell dir die Welt lieber vor wie ein Schachbrett. Wenn du meinst, deine Welt ist 450x450x450 groß, dann hat dein Schachbrett eben so viel Felder. So wie du jetzt Schachfiguren darauf platzieren kannst (in diesem Fall auch mit Stockwerken) bist auch du dort drauf platziert und kannst auch deine Position verschieben (eigentlich verschiebst du den rest der Welt negativ, aber ist ersteinmal egal) und so kannst du deine Objekte vernünftig organisieren im Raum. Möchtest du dennoch, dass zwei im Raum befindliche Objekte einen bestimmten Abstand auf dem Bildschirm haben (oder eine bestimmte Position) musst du zumindest seine Entfernung zum Betrachter kennen und mit der Inversen Projektionsmatrix multiplizieren. So erhälst du dann eine räumliche Position, an der das Objekt die gewünschte Position auf dem Bildschirm hat. Das ist in den meisten Fällen aber etwas sinnbefreit.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Das mit den kleinen Kommawerten kannst du ganz einfach abschaffen, indem du beim Renderstart weiter von der Szene weggehst. AM besten, du positionierst diene Objekte so wie du denkst, dass es sein müsste (also z.B. glTranslate(2,0,0) wenn was 2m in X-Richtung weg sein soll) und passt dann deinen Abstand so an, dass du die Objekte wieder siehst. Also einfach am Anfang viel weiter zurück gehen als in den ersten Tutorials gezeigt.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Wichtig ist, dass du auch zNear und zFar anpasst (Clippingplanes). Ansonsten würde ich sagen: Für die Grafikkarte ist es egal ob du mit 1000 oder 0,1 rechnest. Es sind nur Zahlen. Wichtig ist ihr Verhältnis zueinander.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Für die Grafikkarte ist es egal ob du mit 1000 oder 0,1 rechnest.
Nicht ganz. Die Zahlen werden binär gespeichert, also geht genau 0.1 gar nicht Aber es ist definitiv egal, ob du zB mit 65536 rechnest, oder mit 0.5, mal vorausgesetzt, dass nicht irgendwelche andere Zahlen dann einen overflow/underflow erzeugen (was aber eigentlich nicht vorkommt)
Und grundsätzlich wird 0.1 natürlich auch gut genug angenähert, dass man da keinen Unterschied merkt
Registriert: Di Sep 06, 2005 18:34 Beiträge: 362 Wohnort: Hamburg
So wie ich dich verstehe ist das relativ schwer:
1. du hast eine zweidimensionale Projektion(Welt) die du dreidimensional erweitern willst. 2. du willst die gleichen Einheiten wie für die x+y-Eben für die z-Ebene verwenden, weil die so schön pixelkonform sind. 3. das is voll blöd, weil sich die 3. Dimension einfach nicht an die gleichen Verhältnisse hält!!!! 4. du solltest dich, auch wenn das echt blöd ist und sich nach Schule anhört (was es durchaus soll), über ein paar Dinge in dem Zusammenhang informieren: http://de.wikipedia.org/wiki/Projektion http://de.wikipedia.org/wiki/Frustum
Wenn du in den dreidimensionalen Raum einsteigen willst solltest du über die Sachen bescheid wissen !!!!!!111elf
_________________ Der Mensch hat neben dem Trieb der Fortpflanzung und dem zu essen und zu trinken zwei Leidenschaften: Krach zu machen und nicht zuzuhören. (Kurt Tucholsky)
Schwabbeldiwapp, hier kommt die Grütze. (Der Quästor)
Mitglieder in diesem Forum: 0 Mitglieder und 6 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.