# Genauigkeit in einem Universum



## Grizzly (13. Aug 2007)

Morgen alle zusammen,

bin u.a. gerade dabei eine kleine 3D Software Engine zu schreiben. Mehr zum Lernen als das nachher auch wirklich produktiv einzusetzen. Aber wer weiß...  :wink: 

Dabei ist mir folgende Problematik aufgefallen:
Aktuell verwalte ich die Koordinaten als double-Werte. Das heist aber, das die Genauigkeit im Ursprung des Universum am größten ist bzw. mit der Entfernung zum Ursprung abnimmt. Hier zwei Beispiele dazu (nur zur Veranschaulichung):

Beispiel 1:
Alte Koordinate 0,010000000000000
Bewegung +0,010000000000000
Neue Koordinate 0,020000000000000

Beispiel 2:
Alte Koordinate 10000000000000,0
Bewegung +0,010000000000000
Neue Koordinate 10000000000000,0

Sprich wenn sich ein Objekt mit einer gleichbleibende Geschwindigkeit zum Rand bewegt, wird u.U. - je nach Bewegungsgeschwindigkeit - immer langsamer und schließlich bleibt es stehen.

Irgendwelche Ideen? Außer das vielleicht irgendwann in Java ein Gleitkommatyp implementiert wird, der eine höhere Genauigkeit hat? 
Man könnte sicher auch einen BigDecimal verwenden. Aber das würde dann ja ziemlich langsam werden, oder.


----------



## SlaterB (13. Aug 2007)

tja, da musst du über deine Anforderungen nachdenken,
wenn du wirklich auch bei Koordinate 10000000000000 auf x Stellen genau sein willst,
dann brauchst du eine entsprechende Genauigkeit, da gibts nichts zu rütteln

statt BigDecimal könntest du eine Stufendarstellung aus double verwenden,
z.B. alle x0.000 ein Quadrant, so dass du eine Quadrant-Koordinate und eine Detailkoordinate darin hast (mit maximal 5 Stellen vor dem Komma)


> Aber das würde dann ja ziemlich langsam werden, oder.

so fragt man meist, wenn man nicht genau darüber Bescheid weiß,
und dann hat man meist nur Auswirkungen im Promille-Bereich, die man gar nicht bemerkt,

also gut möglich, dass alles auch mit BigDecimal läuft


----------



## Marco13 (13. Aug 2007)

Über ähnliche Probleme haben sich schon andere Gedanken gemacht... 
http://download.java.net/media/java3d/javadoc/1.5.1/javax/media/j3d/HiResCoord.html

_This coordinate system is sufficient to describe a universe in excess of several billion light years across, yet still define objects smaller than a proton._

Na, wenn DAS nicht reicht.... :wink:

EDIT: Vielleicht noch als Nachtrag: Das soll nicht heißen, dass man sämtliche Berechnungen in 4 ints auslagern sollte. Für die meisten Fälle dürfte double reichen. Überleg' mal, wie "weit" sich das Objekt bewegen muss, damit es wirklich "ungenau" wird.


----------



## Nikolas (17. Aug 2007)

Die Frage ist eigentlich, ob du so etwas überhaupt brauchst. Wird der ganze Bereich überhaupt ausgenutzt? Der interessante Bereich, von dem der Spieler etwas mitbekommt, wird wohl kaum größer als ein paar Tausend Pixel Kantenlänge haben, und in dem Bereich ist die Genauigkeit kein Problem. Objekte, die extrem weit weg sind, sollten eher gar nicht berechnet werden, da der Spieler sie nicht sieht und somit nur Rechengeschwindigkeit verloren geht. Wenn z.B. ein Spielerraumschiff erstmal eine halbe Stunde fliegen muss, um das entfernte Objekt zu erreichen, sind so kleine Fehler uninteressant. 
Auch wenn dein Level sehr lang ist, so dass du in diesen Koordinatenbereich kommst, kannst du einfach eine Koordinatentransformation machen und von allen Positionen soviel abziehen, dass sie wieder in einem gesunden Bereich sind.


----------



## Grizzly (2. Sep 2007)

@Nikolaus:
Vielleicht sollte ich mich genauer ausdrücken, damit es nicht zu Missverständnissen kommt: Mir geht es nicht um die Darstellung. Die ist eh durch die Auflösung begrenzt. Wenn ein Objekt kleiner als ein Pixel ist, fängt man damit ja nix mehr an.

Ich denke eher an die Abbildung eines 3D Universums auf dem "Server", welcher alle Objekt verwaltet. Als Beispiel könnte man ein Weltraumspiel nehmen, in dem es Raumschiffe, Sterne, Planeten, Monde usw. gibt. Wenn man sich in diesem Universum mit Deinem Raumschiff relativ nahe am Ursprung aufhalten würde, wären die eigenen Bewegung sehr genau. Je weiter man sich jedoch vom Ursprung entfernt, um so ungenauer wären die Berechnungen. Sprich am Ursprung hat man noch bspw. wunderbare Gefechte mit anderen Raumschiffen, Raumstationen, etc. . Bewegt man sich aber soweit wir möglich davon weg, kommt irgendwann nicht mal mehr eine Rakete aus ihrem Werfer an Deinem Raumschiff.

Man könnte auch eine 2. Weltkriegs-Simulation wie bspw. Battlefield 1942 nehmen (Schleichwerbung! :wink: ), welche auf der ganzen Welt spielt. Man könnte also rein theoretisch von Südamerika über Europa bis Asien und Australien fliegen/fahren. Wenn Europa der Ursprung des Universums wäre - wir gehen mal davon aus, dass wir die Erdkrümmung unter den Tisch fallen lassen und das Universum an den Enden einfach "verbunden" ist - wären dort die Bewegung sehr genau. Würde man sich jedoch zu den äußersten Zipfeln bewegen - bspw. China oder die Westküste Amerikas - würden die Bewegungen immer ungenauer werden. Ein Flugzeug würde dann u.U. in der Luft stehen bleiben (okay, würde es wahrscheinlich nicht, da die Höhenkoordinaten noch richtig berechnet würden :wink: ).

@SlaterB: Hm, Du meinst also, dass man es mal auf einen Versuch ankommen lassen sollte und das ganze nach Performance testen. Werde ich mal zu gegeben Zeit machen.  

@Marco13: Die Klasse werde ich mir mal genauer anschauen. Danke für den Link. 
Zu der Geschichte mit der Ungenauigkeit siehe meine Beispiele für Nikolaus. Ist momentan auch eher ein theoretischer Gedanke. Habe es praktisch noch nicht ausprobiert. :wink:


----------

