Jump to content
Unity Insider Forum

Generelle Frage zu 3D Welten


markusk

Recommended Posts

Hallo,

ich habe bisher noch nie mit Unity gearbeitet, mich würden aber einige Dinge in Bezug auf die Realisierung von 3D Spielen interessieren.

Mir ist natürlich klar daß das keine Sache ist die man so nebenher am Wochenende erledigt sondern daß da ein sehr hoher Aufwand an Programmierung und Erstellung der 3D Modelle dahintersteckt (bin selbst Software-Entwickler).

Aber angenommen ich möchte mit Unity eine Eisenbahn-Simulation in der Art von Railroad Tycoon erstellen falls das noch jemand kennt.

Man müsste da ja eine relativ weitläufige Landschaft erstellen in der man dann Schienen verlegt, Bahnhöfe platziert und natürlich sollen sich auch Züge zwischen den Bahnhöfen bewegen. 

Aber wie ist das hier mit Positionsangaben von diesen dreidimensionalen Objekten? Ein solches Objekt wie beispielsweise ein Gebäude besteht ja aus einer Unzahl von Punkten die letztendlich seine Form bestimmen, aber auf welchen Punkt bezieht sich die Positionsangabe dann?

Und wie kriegt man das Ganze einigermaßen maßstabsgetreu hin? Ein Zug ist ja viel kleiner als eine Stadt und die Stationen in der Realität kilometerweit voneinander entfernt. Wenn man das verkleinert nach Unity übertägt, dann müsste der Zug ja eigentlich kaum mehr zu sehen sein oder?

Mir geht's jetzt nicht um eine detaillierte Erklärung wie man das in Unity nun im Detail macht, eher um eine Erklärung wie das von der Geometrie her funktioniert sodaß es auch von den Distanzen und der Größe der Objekte realistisch wirkt.

lg, Markus

Link zu diesem Kommentar
Auf anderen Seiten teilen

Moin!

Coole Fragen :)

vor 48 Minuten schrieb markusk:

Aber wie ist das hier mit Positionsangaben von diesen dreidimensionalen Objekten? Ein solches Objekt wie beispielsweise ein Gebäude besteht ja aus einer Unzahl von Punkten die letztendlich seine Form bestimmen, aber auf welchen Punkt bezieht sich die Positionsangabe dann?

Ein Objekt hat eine Transformationsmatrix, die von der passend benannten Transform-Komponente verwaltet wird. Position, Rotation und Skalierung werden in diese Matrix gefüttert. Zu Beginn des Rendervorgangs wird das Inverse der Transformationsmatrix der Kamera mit der Matrix des Objekts multipliziert. Wenn Objekte einander untergeordnet sind, werden der Reihe nach alle Matrizen der Hierarchie aufeinander gerechnet.So erhält man am Ende eine Transformation eines Objekts relativ zum Bildschirm. Und dann werden die ganzen Vertex-Positionen durch die Matrix gejagt und dort gerechnet. Ein 3D-Modell hat also einfach nur eine Liste von Vektoren relativ zum Nullpunkt/Ursprung des Objekts, und durch die Transformations-Matrix-Kette landet der Punkt dann, relativ zu Kamera- und Objektposition an der richtigen Stelle auf dem Bildschirm.

Wenn du in einem Modelling-Programm ein 3D-Modell baust, dann tust du das auch immer relativ zu einem Nullpunkt. Und diesen Nullpunkt kannst du dann in deiner Unity-Szene verschieben.

vor 48 Minuten schrieb markusk:

Und wie kriegt man das Ganze einigermaßen maßstabsgetreu hin? Ein Zug ist ja viel kleiner als eine Stadt und die Stationen in der Realität kilometerweit voneinander entfernt. Wenn man das verkleinert nach Unity übertägt, dann müsste der Zug ja eigentlich kaum mehr zu sehen sein oder?

Die Kamera macht das alles für dich. Wenn du dein Projekt als 3D-Projekt erstellt oder deine Kamera sonst nachträglich auf perspektivisch gestellt hast, dann sind Dinge, die weiter weg sind, automatisch kleiner. Das ist Teil der Matrix der Kamera. Um diese ganze Rendermathematik musst du dir keine Sorgen machen, weil Game-Engines das alles schon können. Man muss auch Matrizen kein einziges Mal selber anfassen, weil's alles schön verpackt ist - funktioniert in 99.9% der Spiele sowieso immer genau gleich.

"Maßstabsgetreu" ist schon genau das richtige Wort für dich. Du brauchst einen Maßstab und bleibst ihm treu. Unity hat als Standard, dass eine Einheit einem Meter entspricht. Aber da musst du dich halt nicht dran halten. Wenn du ein Ameisen-Spiel machst und dann alle deine Werte im <0.01-er-Bereich rumgurken, haste da auch nix von. Für Spiele mit Menschen drin ist 1 Einheit = 1 Meter schon ne gute Sache.

Ein viel größeres Problem ist, dass du nicht beliebig viel in beliebiger Entfernung rendern solltest. Heutige Computer sind krasse Teile, aber wenn man 20 Lokomotiven in voller Qualität rendert, obwohl man sie sowieso nur zwei als Pixel sieht, dann macht man was falsch. Stichwort hier wäre schon einmal "LOD" (Level of Detail). Mit einer LODGroup-Komponente kannst du Unity sagen, ab welcher Distanz zur Kamera ein Objekt mit niedrigerer Qualität (eine Variante des Modells mit weniger Polygonen) oder gar nicht mehr gerendert werden soll.

Darüber hinaus sollte man auch nicht Millionen von Objekten haben, dann geht irgendwann auch der stärkste Rechner in die Knie. Mit ECS geht da einiges, aber das ist nicht der Sinn der Übung und sowieso eine Wissenschaft für sich :) Stattdessen willst du bei größeren Welten "streamen". Das geht bei Zugsimulatoren sogar etwas einfacher als bei Open World-Spielen. Prinzipiell teilst du deine Welt in mehrere Szenen auf und lädst immer die nächste, in die der Zug gleich fahren wird, bevor er in Sichtweite ist. Was hinter dem Zug aus dem Sichtfeld verschwindet, wird entladen.

vor einer Stunde schrieb markusk:

Mir geht's jetzt nicht um eine detaillierte Erklärung wie man das in Unity nun im Detail macht, eher um eine Erklärung wie das von der Geometrie her funktioniert sodaß es auch von den Distanzen und der Größe der Objekte realistisch wirkt.

Hoffe, das hast du gekriegt :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

vor einer Stunde schrieb markusk:

Aber wie ist das hier mit Positionsangaben von diesen dreidimensionalen Objekten? Ein solches Objekt wie beispielsweise ein Gebäude besteht ja aus einer Unzahl von Punkten die letztendlich seine Form bestimmen, aber auf welchen Punkt bezieht sich die Positionsangabe dann?

Jedes Objekt hat eine Ursprungskoordinate (x,y,z) die beim Modellieren festgelegt wird, auf diese Koordinaten beziehen sich alle Punkte des Modells.

Die Positionsangabe bezieht sich immer auf die Ursprungskoordinate des Modells, über diese wird auch die Drehung durchgeführt, das heißt zum Beispiel, wenn der Ursprung in der Mitte eines Gebäudes sich befindet wird das Gebäude auf der entsprechenden Achse in der Mitte gedreht, beziehungsweise  wird der Abstand von Punkt(A) bis zum Mittelpunkt des Gebäudes berechnet und nicht bis zum Anfang des Gebäudes.

vor einer Stunde schrieb markusk:

Und wie kriegt man das Ganze einigermaßen maßstabsgetreu hin? Ein Zug ist ja viel kleiner als eine Stadt und die Stationen in der Realität kilometerweit voneinander entfernt. Wenn man das verkleinert nach Unity übertägt, dann müsste der Zug ja eigentlich kaum mehr zu sehen sein oder?

Eine Einheit in Unity ist 1m oder 1 cm oder ein Salatblatt😉, du musst halt wie bei einer Technischen Zeichnung einen Maßstab festlegen nach der du dich richtest.

@SaschaSchreib immer so schnell oder hat eine Bibliothek, war schon wieder zu späht.

 Gruß Jog

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Sascha,

Hallo Jog,

danke für eure ausführlichen Anworten :) Jetzt kann ich mir das schon etwas besser vorstellen. Mit einigen Begriffen fang ich im Moment klarerweise nocht net viel an, aber das wird schon nach und nach wenn man sich mit der Materie beschäftigt und rumexperimentiert.

lg, Markus

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...