AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Große Koordinaten (OpenGL)
Thema durchsuchen
Ansicht
Themen-Optionen

Große Koordinaten (OpenGL)

Ein Thema von user0 · begonnen am 9. Mär 2007 · letzter Beitrag vom 9. Mär 2007
Antwort Antwort
user0

Registriert seit: 28. Okt 2005
25 Beiträge
 
Delphi 7 Personal
 
#1

Große Koordinaten (OpenGL)

  Alt 9. Mär 2007, 13:00
Hallo,

ich arbeite an einer Software, die Konstruktionen auf Koordinaten > 10.000.000
darstellen muss. Wir verwenden GLScene (OpenGL). Wenn man sich aber Objekte auf
diesen großen Koordinaten anschaut, dann sind Parallelen nicht mehr parallel
und bei jeder Kamerabewegung springen die Enden von Linien hin und her.

OpenGL scheint so große Koordinaten einfach nicht zu unterstüzen. Dabei wurden
alle Koordinaten der Endpunkte der Linien mit glVertex3d übergeben, also als
double.

Gibt es eine Art Flag, den man setzen muss, damit OpenGL mit großen Koordinaten
arbeiten kann? Oder ist das einfach nicht möglich? Wenn ja, wie lößt man dieses
Problem am besten? Ich habe versucht die ganze Scene zu skalieren, aber dann
kann man nicht mehr nah genug ranzoomen. Die Scene zu verschieben ist auch nicht
so einfach, da ein Teil bei (0|0) und ein anderer bei (10000000|-12000000)
liegen kann.
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#2

Re: Große Koordinaten (OpenGL)

  Alt 9. Mär 2007, 16:53
Ich nehme mal an das es an der Kamera liegt. Da ist eine bestimmte "Brennweite" eingestellt.
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#3

Re: Große Koordinaten (OpenGL)

  Alt 9. Mär 2007, 17:14
wenn du hergehst und deine Variablen scallierst ?

in OpenGL sind ja Double Koodrinaten.

D.h. wenn du deine 10.000.00 erst mal sagen wir durch 10.000 Teilst dann wird deine "OpenGL" welt kleiner.

bzw. kannst du denke ich mal nicht den ganzen Bereich auf einmal sehen. Das würde dann wohl recht viel Renderzeit brauchen. und bringt dir auch nichts da du ja in der Regel nur 1280x1024 Pixel zum anzeigen hast.
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Große Koordinaten (OpenGL)

  Alt 9. Mär 2007, 17:24
Also ersteinmal gibt es immer eine Back-Clippingplane, die alles abschneidet, was weiter weg ist als der Wert, den du mit gluPerspective eingestellt hast. Außerdem gibt es da tatsächlich relativ unschöne Ergebnisse mit Rundungsfehlern, auch wenn du es als Double übergibst. Und der Füllrate dürfte das auch nicht allzu gut tun.

Wozu brauchst du denn so hohe Werte?
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Große Koordinaten (OpenGL)

  Alt 9. Mär 2007, 18:58
Das Problem ist das übliche, wenn man mit Gleitpunktwerten rechnet. Bei Werten die stark von 0 verschieden sind, sind einfach nicht mehr genug Werte zwischen 2 anderen überhaupt abbildbar um ein "Scheinkontinuum" zu sein. Am genausten sind Floats (egal wie viele Bits nun) wenn sie möglichst nah an 0 liegen. Wie weit man davon weg kann, hängt dann davon ab was man machen möchte, und wie genau der Datentyp nun ist. Da gibt es kein Patentrezept.
Allerdings ist man bei OpenGL, selbst wenn man Double-Werte übergibt, immer im Beriech von Single! Dass heisst, dass du bei 10mio schon ganz schön arg über der Genauigkeit bist. Skalieren hilft, aber nicht wenn du Details drin hast, die in ihrer Ausdehnung schon weit im Nachkommabereich liegen (das wäre aber eine wahnsinnig rieeeesige Szene mit unglaublichem Detailreichtum. Sowas ist mir zumindest noch nicht begegnet ).

Eine Mögliche Variante das ohne Skalierungen zu erledigen wäre es, den Raum in Octrees zu unterteilen, und mit einer Sichtbarkeitsprüfung nachher die Würfel zu identifizieren, die überhaupt nur dargestellt werden müssen (sollte man bei so großen Szenen ohnehin in Betracht ziehen). Noch netter wirds, wenn du die Geometrie in die Prüfung mit einbeziehst, so dass von Wänden verdeckte Raumwürfel, die zwar im Sichtfeld lägen, trotzdem ausgelassen werden.
Das was du dann noch an Raumteilen über hast, kannst du dann um den Weltmittelpunkt von OpenGL zentrieren, und die Kamera entsprechend anpassen.

Das ganze ist allerdings keine Kleinigkeit, sondern schon eher ein ziemlicher Hammer. Ich weiss ja nicht, wofür du das brauchst, jedoch weiss ich von einigen Spielen, dass sie ähnlich vorgehen (da meist aber mit Unterteilung in Zones von Hand bei Erstellung der Level, und evtl. danach Octrees).
Wenn du zudem in Echtzeit durch die Szene laufen möchtest, dann ist das ganze Prozedere was die Darstellung angeht ein immenser Zetisparer, aber auch nur, wenn man es intelligent und gut implementiert.


Wenn deine Szene also keine winzigen Details enthält, skalier besser einfach. Und wenn du nicht nah genug ran kommst, dann setz die Near-Clipping-Plane näher
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Oxmyx

Registriert seit: 21. Sep 2004
499 Beiträge
 
#6

Re: Große Koordinaten (OpenGL)

  Alt 9. Mär 2007, 21:03
Prinzipiell ist es, wenn man's richtig macht, egal ob man große oder kleine Zahlen verwendet. Die Logik dahinter ist doch recht einfach: Wenn ich in Dimensionen von +- 10.000.000 rechne und darstelle, dann wird wohl ein Detail in einer Dimension von +- 0.1 überhaupt nicht ins Gewicht fallen, weil es einfach untergeht.

Was du bei der Darstellung noch beachten solltest, sind die Clippingebenen. Die nahe Clippingebene sollte nicht zu nahe an 0 sein, sondern so weit weg wie möglich. Die meiste Präzision des Z-Puffers verliert man nämlich nicht dadurch, dass man die ferne Clippingebene zu weit weg setzt, sondern dass man die nahe Clippingebene zu nah setzt.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz