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

Aktuelle Zeit: Mi Jul 09, 2025 19:15

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



Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mo Aug 30, 2010 10:03 
Offline
DGL Member

Registriert: Sa Mai 15, 2010 13:25
Beiträge: 13
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?

Gruss


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Aug 30, 2010 10:19 
Offline
DGL Member
Benutzeravatar

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

P.S.: Willkommen im Forum :)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Aug 30, 2010 11:42 
Offline
DGL Member

Registriert: Sa Mai 15, 2010 13:25
Beiträge: 13
Jup, danke.

Versteh ich als Anfänger und alter Opa nicht.

gluProject und gluUnProject > erklär mir das mal, wie das im Befehl aussieht, damit ich die sogenannten Pixeldaten im Raum nehmen kann?

Gruss


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Aug 30, 2010 12:06 
Offline
DGL Member
Benutzeravatar

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

 // ...
 
  glGetDoublev(GL_MODELVIEW_MATRIX, @modelview);
  glGetDoublev(GL_PROJECTION_MATRIX, @projection);
  glGetIntegerv(GL_VIEWPORT, @viewport);

  // coord enthält die Koordinaten (z.B. Mittelpunkt) des Objektes  das zu verschieben willst.

  // coord in Bildschirmkoordinaten umrechnen => screen
  gluProject(coord[0], coord[1], coord[2], modelview, projection, viewport, @screen[0], @screen[1], @screen[2]);

  // um 50 Pixel auf der X-Achse verschieben
  screen[0] := screen[0] - 50;

  // screen zurück in Weltkoordinaten umrechnen => coord
  gluUnProject(screen[0], screen[1], screen[2], modelview, projection, viewport, @coord[0], @coord[1], @coord[2]);

  // coord enthält die neuen Koordinaten für das Objekt


Möglicherweise solltest du versuchen genauer zu erklären was du möchtest. Ich rate nämlich hier nur rum. ;)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Aug 30, 2010 15:48 
Offline
DGL Member

Registriert: Sa Mai 15, 2010 13:25
Beiträge: 13
Normal würde man doch innerhalb des Screens zb "glTranslated(0, 0.5, 0.010)" eingeben.

ich möchte da jetzt die Pixelgweite nehmen als Wert : glTranslated(0, 300, 10)

Gruss


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Aug 30, 2010 16:07 
Offline
DGL Member
Benutzeravatar

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

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Sep 02, 2010 12:53 
Offline
DGL Member

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.

_________________
Gruß McWurscht - sorry für's Posting.

Wer mal meinen bisher erfolgreichsten Erguss in Sachen Web-Programmierung sehen will: RCV


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Sep 02, 2010 13:10 
Offline
DGL Member
Benutzeravatar

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

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Sep 03, 2010 08:47 
Offline
DGL Member

Registriert: Sa Mai 15, 2010 13:25
Beiträge: 13
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.

Gruss


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Sep 03, 2010 09:56 
Offline
DGL Member
Benutzeravatar

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.

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Sep 03, 2010 12:58 
Offline
Guitar Hero
Benutzeravatar

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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Sep 06, 2010 17:39 
Offline
DGL Member

Registriert: Sa Mai 15, 2010 13:25
Beiträge: 13
Wie verhalten sich dann jetzt die optischen Verhältnisse?
Die Grafikkarte/Rechner muss doch jetzt einen grösseren Raum verwalten, oder?

Gruss


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Sep 06, 2010 21:48 
Offline
Guitar Hero
Benutzeravatar

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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Sep 07, 2010 08:35 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
Zitat:
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 :mrgreen: 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 8) (was aber eigentlich nicht vorkommt)

Und grundsätzlich wird 0.1 natürlich auch gut genug angenähert, dass man da keinen Unterschied merkt ;)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Sep 16, 2010 04:22 
Offline
DGL Member
Benutzeravatar

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)


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


Wer ist online?

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.

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