Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Pecadis

Frischling

  • »Pecadis« ist der Autor dieses Themas

Beiträge: 29

Wohnort: München

Beruf: Fachinformatiker für Systemintegration

  • Private Nachricht senden

1

18.04.2012, 12:38

Skalierung des Koordinatensystems

Hallo Spieleprogrammierer,

ich habe mich gefragt wie Koordinatensysteme in modernen Spielen Skaliert werden und wie man es selber umsetzten müsste wenn man ein eigenes Spiel macht.

Frühere Spiele waren ja einfach gesehen nur irgendwelche Punkte die in der gegend von Koordinatenfeld zu Koordinatenfeld gesprungen sind. (modernes Browsergame wie Freewar macht es heute immer noch so) aber mit steigender Rechenkapazität wurden zum einen die einzelnen Punkte immer enger aneinanderliegend sodass der Übergang "flüssig" läuft, zum anderen aber auch die Animationen Koordinatenübergreifend zurechtgebastelt (zumindest stell ich mir das so vor).

Wie wird das jetzt aber konkret gemacht also z.b. bei Battlefield3 oder anderen Spielen wo die Karte Besonders groß sind sind die Koordinaten dann Millimeteraufgelöst oder behelfen sich die Macher anderer Tricks?

Und wie müsste man das (rein Hypothetisch) koordinatensystem für ein ganzes Sonnensystem zusammenstellen damit man die Position eines jeden Objektes auf den z.b. Zentimeter genau festgestellt werden kann.

Zudem kommt man ja irgendwann an Technische grenzen da es bei C++ meines wissens nach ja nur bis zu 64 bit geht und alles drüber hinaus speziell berechnet werden müsste (z.b. die entfernung zwischen Objekten).

Ich habe zu dem Thema bereits Onkel Google, Tante Wiki und die Sufu hier totgesucht aber irgendwie nicht das gefunden was ich erhofft hatte.

Wenn mir jemand dabei helfen kann wäre es sehr freundlich =)

Mfg
Pecadis.

2

18.04.2012, 13:16

Naja, biespielsweise mit mehrstufigen Koordinatensystemen.
Im Sonnensystem könnten die Korrdinaten für die Planeten in Lichtminuten oder was auch imemr angegeben sein. Auf einem Planeten haben alle Objekte dann nur eine Position relativ zum Planetenmittelpunkt, die dann halt in Kilometern oder so angegeben wird. Und in der konkreten Spielinstanz oder so entspricht eine Einheit dann einen Meter oder so.
Jetzt kann man vielleicht nicht mehr Millimeter genau die Entfernung eines Menschen auf der Erde zu einem Menschen am Jupiter oder so berechnen, (weil das nicht in eine Fließkommazahl passt), aber das braucht man ja eh nicht. Man kann immer noch mit genügender Genauigkeit Objekte von dem einen in das andere System bewegen, (statt der Koordinate 1000,54 kriegt das Objekt die Koordinate 0,54 und in der nächsthöheren Stufe erhöt man den Wert nur um 1, oder so). Für die Darstellung ist es ja eh egal, ob ein Objekt in 1km Entfernung jetzt 1cm weiter links oder rechts ist, es landet eh auf dem selben Pixel. Und Spiellogikberechnungn (z.B. Phyik) können in dessen lokalen Koordinatensystem laufen und sind genau.

Für wissenschafltiche Berechnungen kann man natürlich beliebig genaue Zahlen benutzen, für die es dann extra BigNumber Objekte gibt. Aber die sind sehr viel langsamer, deshalb wird man die wohl kaum in PC Spielen einsetzen. Aber ein 32-bit float hat ja auch schon ~8 Stellen Genauigkeit, das wäre bei 100km immer noch auf den Millimeter genau. Double (64-bit Fließkommazahl) hat so um die 17 Stellen, für Battlefield reicht das mehr als aus und für Raumfahrspiele würde man wie gesagt verschachtelte Koordinatensysteme benutzen.
Lieber dumm fragen, als dumm bleiben!

Sp3iky

Treue Seele

Beiträge: 232

Beruf: Entwicklungsingenieur

  • Private Nachricht senden

3

18.04.2012, 13:22

Was du suchst ist die allgemeine Funktionsweise von 3D-Visualisierungen. Stichworte dazu wären Modelspace, Worldspace, Viewspace, Projectionspace, Transformationsmatrix, homogene Koordinaten.

Ich versuch es mal ganz kurz zusammen zu fassen:

Am Anfang hast du ein 3D-Objekt, das im eigenen Koordinatensystem erstellt wurde (Modelspace). Damit du es in deiner Szene (Worldspace) platzieren kannst, benötigst du eine Transformationsmatrix (Modelmatrix genannt). Jeder Punkt deines Objektes wird mit dieser Matrix multipliziert und so an eine Position in deiner Szene transformiert. Inbegriffen sind Translation, Rotation und Skalierung.

Der nächste Schritt ist, die Kamera. Du möchtest ja am Ende einen Ausschnitt aus deiner Szene auf dem Bildschirm darstellen. Die Kamera ist definiert durch Position, Ausrichtung und Öffnungswinkel (und noch ein paar andere Dinge wie Near- und Farplane). Um nun deine Szene aus der Kameraperspektive zu zeigen musst du wieder alle Punkte transformieren. Das machst du mit der Viewmatrix. Hast du alle Punkt deiner Szene damit multipliziert, hast du alle Punkte im Viewspace.

Am Ende kommt die Projektion vom 3D-Raum auf dein 2D-Bildschirm. Dafür brauchst du die Projectionmatrix. Wieder mit allen Punkten multipliziert, hast du alle Punkte im Projectionspace. In diesem Projectionspace sind (nach der Normalisierung...ein Detail, was du in anderen Quellen findest) alle Punkte innerhalb eines Einheitswürfels von -1 bis 1 in alle 3 Achsen. Diese Punkte können dann anhand der x- und y-Achse in Pixelkoordinaten transformiert werden. -1 entspricht dann 0 und 1 deiner maximalen Auflösung.

Das war wirklich nur sehr grob erklärt, wie es abläuft. Details musst du mit Hilfe der Stichworte finden. Das ist ein sehr wichtiges, aber auch sehr weitreichendes Thema. Man sollte es auf jeden Fall verstanden haben, wenn man in 3D arbeiten möchte.

Abgeleitet davon beantworten sich auch die meisten deiner Fragen. Für Animationen transformierst du deine Objektpunkte eben jeden Frame mit einer anderen Matrix.

Hinsichtlich der Genauigkeit hast du recht, dass es da Grenzen gibt. Sehr sehr große Zahlen sind genauso schlecht wie sehr sehr kleine Zahlen. Dabei kommt es dann zu verschiedensten Problemen.

Allerdings ist auch zu sagen, dass eine 64-bit Float im Normalfall Zahlen von −10^308 bis +10^308 (laut Wiki) darstellen kann (die Präzision mal außer acht gelassen). Das sollte für alle Spiele ausreichen. Du würdest auch kein Universum in einer Szene erstellen. Das wäre nämlich an den meisten Stellen leer und für den Spieler extremst langweilig ;)

Edit: Vielleicht hast du das auch nicht gesucht^^Aber es erklärt trotzdem, dass die gesamte 3D-Darstellung absolut nichts mit menschlichen Einheitensystemen zu tun hat. Ob jetzt eine Koordinatenverschiebung um 1 bedeutet, dass das Objekt 1mm, 1m, 1km oder 1 Lichtjahr weit verschoben wurde, ist ganz dem Entwickler überlassen.

Pecadis

Frischling

  • »Pecadis« ist der Autor dieses Themas

Beiträge: 29

Wohnort: München

Beruf: Fachinformatiker für Systemintegration

  • Private Nachricht senden

4

18.04.2012, 15:33

Zitat

Allerdings ist auch zu sagen, dass eine 64-bit Float im Normalfall Zahlen von −10^308 bis +10^308 (laut Wiki) darstellen kann (die Präzision mal außer acht gelassen). Das sollte für alle Spiele ausreichen. Du würdest auch kein Universum in einer Szene erstellen. Das wäre nämlich an den meisten Stellen leer und für den Spieler extremst langweilig ;)
Naja Prinzipiell hast du recht aber wie müsste ich das dann machen wenn ich in diesem universum direkt zu bestimmten Koordinaten springen will (die im leeren Raum stehen). Dann würde das ja bedeuten dass ich auch gleich den leeren Raum mit einer Koordinate ausstatten müsste.

Naja deine Erklärung selber finde ich an sich sehr Schlüssig aber es beantwortet leider nicht meine Frage.

Wenn ich mich jetzt von Koordinate x,y,z zu x1,y1,z1 bewegen will dann wird es umso flüssiger je kleiner das Koordinatensystem aufgelöst wird (so zumindest mein derzeitiges Verständnis) oder gibt es irgendwelche algorythmen die den Totraum zwischen den Koordinatenpunkten "Simulieren". Wie aufgelöst müsste ich dazu das Koordinatensystem Skalieren?

Also als Beispiel nehme ich jetzt mal ne Ameise und eine 100m mal 100m große Fläche die auf 1m genau skaliert wird. So wie ich das verstehe müsste die Ameise (die ja definitiv kleiner als 1 m ist) ja von Feld zu Feld "Springen" d.h. Sie taucht einfach im Feld daneben auf und wartet da bis ihre reale geschwindigkeit sie dazu bewegt im nächsten feld zu erscheinen. Wie müsste ich es in dem Fall angehen dass der Beobachter auch sieht dass sich die Ameise bewegt.

Wie löst man es eigentlich Rechnerisch wenn die quadrierung einer Zahl über den 64 bit bereich gehen würde (Entfernungsberechnung)? Würde das die größe der Spielwelt nicht eigentlich einschränken?

Ok ein bisschen viele fragen fällt mir gerade auf ^^

Grüße
Pecadis

5

18.04.2012, 16:57

Wie löst man es eigentlich Rechnerisch wenn die quadrierung einer Zahl über den 64 bit bereich gehen würde (Entfernungsberechnung)? Würde das die größe der Spielwelt nicht eigentlich einschränken?

Natürlich, da muss man halt extrem aufpassen. Wenn Eingabewerte und Endergebnisse im darstellbaren Bereich liegen, heißt das noch lange nicht, dass durch die Berechnung nicht sehr große Fehler reingekommen sind. Stichwort wäre hier "numerisch Stabil", ist quasi ein eigenes Forschungsgebiet, wie man es hinkriegt, dass Algorithmen möglichst stabil sind.

Für das Ameisenproblem will ich meine Antwort nochmal umformulieren: Stell dir vor, du speicherst die Kachel, auf der die Ameise ist in der einen Variable und die Position auf der jeweiligen Kachel (relativ zur Kachelmitte) in einer Zweiten. Man kann natürlich auch mehrere Stufen haben, aber nötig ist das quasi nie.
Lieber dumm fragen, als dumm bleiben!

Pecadis

Frischling

  • »Pecadis« ist der Autor dieses Themas

Beiträge: 29

Wohnort: München

Beruf: Fachinformatiker für Systemintegration

  • Private Nachricht senden

6

18.04.2012, 17:57

Ok danke für die Erklärung.. Gut ich habe mir das schon so gedacht und deine antwort war mir schon Schlüssig, nur dachte ich dass es in der Programmierszene irgendwelche "magischen" algorythmen gäbe. Diese Verschachtelung kam mir auch bereits schon in den Sinn, jedoch kam mir das extrem unperformant vor.

Aber ok wenn es derzeit keine besseren möglichkeiten gibt dann danke ich euch für eure antworten =)

Grüße
Pecadis

7

18.04.2012, 18:19

Aber ok wenn es derzeit keine besseren möglichkeiten gibt dann danke ich euch für eure antworten =)

Naja, es gibt da sicherlich noch so einiges. Müsste man halt mal ein bisschen nach Veröffentlichungen zu diesem Thema suchen. Aber so würde es gewiss funktionieren und sollte auch locker schnell genug sein. Aber wie gesagt, so groß sollte das Problem in den meisten Fällen gar nicht sein.
Lieber dumm fragen, als dumm bleiben!

Werbeanzeige