Jump to content
Unity Insider Forum
  • Einträge
    9
  • Kommentare
    52
  • Aufrufe
    34.858

Modellieren für Spieleengines


Sascha

1.588 Aufrufe

Dieser Blogeintrag ist an alle gerichtet, die 3D-Modelle für Spiele entwerfen.

Man findet ja überall im Internet Modelle, die primär für die Verwendung in Spielen gemacht wurden. Auch wenn hier und da an die spezifischen Anforderungen von Modellen für Spiele gedacht wurde, so schauen Blender-, 3DS-, Cinema- oder SoftImage-Nutzer * doch oftmals nicht über das Modelling-Programm hinaus und übersehen einige Dinge, die das Designen von Spielszenen mit ihren Modellen erheblich vereinfachen würden. Denn Spieleengines rendern nicht wie Modellingprogramme, und ein Leveldesigner arbeitet meist anders als ein Modeller.

Darum würde ich hiermit gerne eine zusammenfassende Liste mit Dingen, deren Beachtung eine deutliche Verbesserung der Qualität von Modellen für Spiele bewirken kann, anführen.[list=1]
[*][size=5][u]Einheitliche Größen in Serien[/u][/size]
Da Modellingprogramme alle unterschiedliche Größeneinheiten suggerieren, es bei 3D-Engines nicht anders ist und sogar von Spiel zu Spiel die Einheiten gerne mal neu interpretiert werden **, kann man von Modellern, die nicht an einem bestimmten Projekt arbeiten, nicht erwarten, dass die Modelle alle in der richtigen Größe beim Leveldesigner ankommen.
Was allerdings schön wäre, wäre eine einheitliche Skalierung.
Beim Importieren kann man dann allen Modellen den selben Skalierungsfaktor geben.
Muss man aber für 30 Gebäude bei jedem auf's Neue per Augenmaß einen Skalierungsfaktor finden, wird's nervig.
Die Lösung: Alle Modelle einer Serie, also einer Menge zusammen gehörender Modelle benutzen die selben Größeneinheiten.
[*][size=5][u]Objektmittelpunkt bei 0,0,0[/u][/size]
Die Grund für diesen Punkt ist verteilt auf die Vorlieben verschiedener Engines.
In einigen Fällen fährt man komplett problemlos, wenn man die Objekte beliebig im Raum verteilt. Spätestens bei der Benutzung von Bones in der Unreal Engine sollte man aber das Skelett auf 0,0,0 platzieren. Das ist aber nicht der einzige Fall, in dem das sinnvoll bzw. sogar nötig sein kann.
Zusammenfassend gesagt: Ein 3D-Modell ist nur dann mit allen Engines kompatibel, wenn die Objekte auf 0,0,0 platziert sind.
Darauf zu achten schränkt aber keinesfalls ein: Man kann ja anstatt des Objekts dessen Punkte verschieben.
In z.B. Blender heisst das: Edit Mode statt Object Mode.
[b][u][color=#ff0000]Falsch:[/color][/u][/b]
[img]http://bytezero.de/files/uin/objektverschiebung.jpg[/img]
[b][u][color=#009900]Richtig:[/color][/u][/b]
[img]http://bytezero.de/files/uin/meshverschiebung.jpg[/img]
Ausnahme sind allerdings Objekte, die anderen untergeordnet sind, siehe Punkt 5.
[*][size=5][u]Skalierung auf 1,1,1[/u][/size]
In diesem Fall sind sich die Engines schon eher einig: Objekte sollten nicht skaliert werden, also die Standardskalierung von 1,1,1 behalten.
Spätestens bei Modellen mit Bones wird das in allen Engines sehr wichtig.
Das ganze lässt sich genau so umsetzen wie bei der Objektverschiebung.
[b][u][color=#ff0000]Falsch:[/color][/u][/b]
[img]http://bytezero.de/files/uin/objektskalierung.jpg[/img]
[b][u][color=#009900]Richtig:[/color][/u][/b]
[img]http://bytezero.de/files/uin/meshskalierung.jpg[/img]
[*][size=5][u]Kontaktpunkt auf den Objektmittelpunkt setzen[/u][/size]
Damit versüßt man jedem Leveldesigner den Tag.
So gut wie jedes Objekt hat einen Kontaktpunkt *** (/-Kante /-Fläche).
Dieser Punkt definiert sich dadurch, genau an der Position zu sein, wo das Objekt an andere Objekte angrenzt.
Ein Mensch oder ein Tisch z.B. stehen auf dem Boden, und zwar mit der Unterseite der Füße. Der Kontaktpunkt liegt also unter den Füßen.
Eine Wandlampe dagegen hängt an der Wand, also ist der Kontakpunt an der Seite, mit der die Lampe die Wand berühren soll.
Positioniert man den Mesh so, dass dieser Kontaktpunkt auf dem Objektmittelpunkt liegt, so bringt das einige Vorteile für den Leveldesigner.
Will dieser z.B. das Objekt skalieren, so wird das Objekt ja vom Objektmittelpunkt hin bzw. weg skaliert.
Der Objektmittelpunktliegt dabei, wie der Name schon sagt, in der Mitte und wird nicht bewegt.
Liegt der Kontakpunkt woanders, dann skaliert man in die Wand hinein oder davon weg:
[img]http://bytezero.de/files/uin/inwand.jpg[/img]
Liegt der Kontaktpunkt aber genau an dieser Stelle, dann ist dieser nach dem Skalieren immernoch an der Wand (/auf dem Boden /...) und das Objekt muss nicht noch einmal neu positioniert werden.
Auch beim Drehen des Objekts ergeben sich daraus Vorteile.
Also merken:
[b][u][color=#ff0000]Falsch:[/color][/u][/b]
[img]http://bytezero.de/files/uin/objekt010.jpg[/img]
[b][u][color=#009900]Richtig:[/color][/u][/b]
[img]http://bytezero.de/files/uin/objekt000.jpg[/img]
[*][size=5][u]Objekte unterodnen[/u][/size]
In keinem Modellingprogramm, das ich kenne, fehlt die Möglichkeit, Objekte einander unterzuordnen.
Objekte eines 3D-Modells, das aus mehreren zueinander beweglichen Teilen besteht, werden spätestens im Leveleditor einander untergeordnet.
Diesen Schritt schon im Modellingprogramm zu machen halte ich für eine sinnvolle Idee.
Erstellt man also einen Roboter aus mehreren Einzelteilen, heißt es:
Beine, Kopf und Arme dem Körper, Füße den Beinen und Hände den Armen unterordnen.
Dabei sollten auf jeden Fall der vorherige und der nächste Punkt beachtet werden!
[*][size=5][u]Objektmittelpunkt auf den Drehpunkt setzen[/u][/size]
Nicht nur der Kontaktpunkt ist interessant, sondern auch der Drehpunkt eines Objekts kann es sein.
Modelliert man z.B. ein Karussell, dann sollte man den Objektmittelpunkt nicht außerhalb der Mittelachse wählen.
Im Spiel soll sich das Karussell nämlich ggf. drehen, und es ist schon ein wenig schade, wenn dazu beim Leveldesign rumgetrichst werden muss.
Setzt man den Objektmittelpunkt auf den Drehpunkt, so muss man das Objekt einfach nur noch um die richtige Achse drehen.
Kombiniert mit dem Kontaktpunkt-Ansatz kommt bei einem Karussell nur ein Objektmittelpunkt in Frage: Unten in der Mitte.
[/list]

Beachtet man als Modellierer für Spiele diese recht einfachen Punkte, dann macht man sich eine Menge Freunde unter den Leveldesignern :)

[size=2]* Ich erhebe keinen Anspruch auf Vollständigkeit dieser rein zur Textzierde erstellen Liste.
** Gears of War benutzt 156UU (Unreal Units) als Charakterhöhe, Unreal Tournament ungefähr 200UU.
*** Namenskreation von mir, also beim Googlen nicht wundern ;)[/size]

2 Kommentare


Recommended Comments

Mh, hätte ich das nur viel früher gelesen.
Das erklärt zumindest schonmal, wieso meine Animationen in Unity immer ein wenig anders aussehen als in Blender :)

Auch auf den Skalierungsfaktor und setzen des Pivot als Kontaktpunkt hab ich nie wirklich geachtet.
Tolle Tips , danke !
Link zu diesem Kommentar
[size="3"][color="#000000"][font="Calibri"]Alles richtig und gut, dass beachte ich eigentlich von Anfang an. [/font][/color][/size]

[size="3"][color="#000000"][font="Calibri"]Nur bei Deiner Figur muss ich Dir wiedersprechen. Ich habe eine ganze Anzahl von Soldaten verändern müssen, genau auf das Beispiel wie Du es als Falsch zeigst. Warum? Wenn Du die Figuren mit einem Raycast versiehst, dann setzt dieser Punkt auch am Nullpunkt an. Ich hatte dann das Ergebnis, das diese wie die Bogenlampen standen wenn man sich genähert hat. Ok, man könnte nun den Raycast so programmieren das der Punkt weiter oben ist, das ist auch kein Problem, wenn alle Gegner dieselbe Grösse haben, wenn aber Gegner dabei sind die kleiner sind, dann musst das wieder geändert werden. Deshalb habe ich es mir angewöhnt, das bei allen sich bewegenden Objekten, der Nullpunkt in die Mitte des Objektes ist und damit komme ich persönlich sehr gut klar.[/font][/color][/size]
Link zu diesem Kommentar
Gast
Kommentar schreiben...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Lädt...
×
×
  • Neu erstellen...