Jump to content
Unity Insider Forum

Warum sind Char-Modelle immer nur einen Meter groß?


Recommended Posts

Hallo zusammen,

 

um ein wenig Arbeit zu sparen, dachte ich, dass man ja wunderschön einige Dinge aus dem Assetstore nutzen kann.

Nachdem ich jetzt mit vielen verschiedenen Assents rumprobiert habe und mich mit dem Größenverhältnis mehr auseinandergesetzt habe, farge ich mich warum die Modelle von Chars immer nur einen Meter groß sind, wärend manche andere Dinge, wie Bäume, größer als meine Karte sind.

Ich finde zwar den Link nicht mehr, aber mir ist so, als hätte ich mal gelesen, dass man den Scale möglichst einheitlich halten soll. In den Standard-Assets von Unity fängt es schon an. Bäume und Gras sind normal und der Player nur ein Meter groß, sodass das Gras bis zum Bauchnabel geht.

Zum Testen habe ich über Fuse mal einen Player erstellt und festgestellt, dass auch der nur ein Meter groß ist :blink: . Dann habe ich nochmal versucht zu finden, ob es schlimm ist, wenn der Scale-Wert in Unity verändert wird und irgendwie scheint da jeder anderer Meinung zu sein....

 

Ich habe mal überlegt, was es für einen Vorteil hat, die Modelle einen Meter groß zu halten:

- weniger Tris, weil kleineres Modell

- Ich muss nicht auf die Größe achten, weil ich die dann im Scale wunderbar angeben kann, wie groß das Modell in der Spielwelt sein kann und ich dann die Größe einfacher einstellen kann, als mir in Blender einen Referenzcube hinzustellen.

 

Nachteil bei wirklich großen Objekten ist natürlich eine pixlige Textur würd eich mal so aus dem Bauch heraus schließen.

 

Abschließend will ich vor allem wissen, ob es wirklich schlimm ist unterschiedliche Skalierungen zu benutzen? Ich will ja auch nicht massig Modelle erstellen, um dann festellen zu müssen, dass die alle Müll sind. Zumal ich natürlich auch von Anfang an versuchen will die Performance gut zu halten. Ich will das zwar als Standalone erstellen, aber die Welten sollen schon Detailreich werden und ich habe gemerkt, dass Unity schon bei zu vielen Bäumen Probleme macht :unsure:. Bei einen Terrain von 100 x 100 wohlgemerkt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

nabend :)

 

warum genau das jetzt so ist kann ich dir nicht sagen, aber normalerweise beinträchtigt die skallierung nicht die anzahl der polygone (tris). die texturen sollten eigentlich auch nicht verpixeln, weil sie normalerweise zur proportion anderer objekte erstellt wird. es liegt natürlich auch an der kamera inwiefern die textur verpixelt. du kannst auch bei kleinen modellen ne unschöne textur haben, wenn du entsprechend nah bist. zur skallierung an sich ist es am besten mit einer 1 zu 1 skallierung zu arbeiten, da man gern mal eins gewischt kriegt wenn du im code vergisst dass du z.b eine skallierung von 1,7388.... hast.

 

hoffe das konnte dir helfen

Link zu diesem Kommentar
Auf anderen Seiten teilen

Klingt in der Theorie sehr gut, aber bei der Weise ist die Frage, in wie weit das die Performance beeinflusst?

Nach meinem Plan sind in einer Szene ca. 20-30 GameObjects, die sich über ein KI-Script bewegen sollen und animiert sind.

So wie du das beschreibst wäre das Script auf dem Empty Object, was ja auch ok ist, aber ist es nicht doof, wenn es dann doppelt so viele Objekte sind? Auch wenn sich immer zwei wie eins verhalten?

 

Ich weiß nicht wie wichtig der Punkt ist, aber es soll nur ein Hauptscript für die KI's geben, von denen dann je nach Art (Human, Monster) und Fähigkeiten dann spezielle erstellt weren, die einzelne Methoden überschreiben, bzw Variablenwerte anders setzen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Es belegt minimal ein klein wenige mehr Speicher. Wäre jetzt mal interessant zu wissen wie viele Bytes nötig sind um ein GameObject mit nur einer Transform Komponente zu speichern. Jedenfalls bewegst du am Ende nicht wirklich mehr Objekte. Es ist ja nicht der Fall, dass du ein Mesh oder ein weiteres Material mit in die Waagschale wirfst.

 

Man könnte ja auch einfach mal 1000 Empty GameObjects in irgendein Projekt reinwerfen und gucken, ob es die Framerate beeinflusst. Sollte meiner Meinung nach nur der Fall sein, wenn nicht genug Speicher vorhanden ist.

 

 

Bei 20 - 30 GameObjects macht eher das KI-Script etwas aus. Du bewegst durch das Empty GameObject im Prinzip nicht mehr.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich hab aus Interesse gerade mal einen Belastungstest gemacht mit 10, 100 und 1000 leeren Gameobjects. Also so ohne andere Dinge außer normalem Terrain machen sie nichts aus an der Framerate.

Wobei bei der Art "Umwege" meldet sich mein Bauchgefühl und sagt, dass ich das ordentlich machen soll XD.

Aber danke für den Tipp, so weiß ich dann, wie ich mit den Dingen aus dem Asststore umgehen kann, falls ich da doch mal etwas finde und behalten möchte.

Und.... ja klar die Scripte machen viel aus, deswegen will ich von Anfang an sehen, dass ich da sparsam an die Sache rangehe und statt im Nachgang zu bereinigen, nehme ich mir dann doch lieber die Zeit für eine ordentliche Planung ;).

Auf jeden Fall danke für den neuen Blickwinkel.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn ein Schreiner einen Tisch und Schrank baut wird er den Schrank so bauen ein Mensch mit Normaler Statur problemlos an den Tisch passt oder problemlos das obere Regal Brett erreichen kann.

 

In fast allen 3D Programme gibt es unterschiedliche Maßstäbe außerdem werden 3D Modelle für Computerspiele eher selten Maßstabsgetreu gebaut.

 

Wer Modelle Maßstabsgetreu entwerfen möchte sollte mit einem CAD Programm arbeiten und nicht mit einem 3D Programm wie Blender. Aber wer nimmt sich schon die Zeit und baut Modelle auf den Millimeter genau.

 

Das Modelle alle unterschiedlich groß sind liegt also daran das die Maßstäbe in 3D Programmen unterschiedlich ist und das die meisten Moddelierer nicht auf den Maßstab achten.

 

Größe Spielt auch überhaupt keine Rolle wenn ein Baum der 1m Groß sein soll in Unity 100 hoch ist, nimmst man einfach einen Scale Factor von 0.01.

Wenn du natürlich verschiedene Modelle aus dem Assetstore nimmst sind die Maßstäbe auch für jedes Modell verschieden.

 

Es gibt keine Norm bei Spiele Engines oder 3D Programme.

 

Auch für den Speicher spielt es keine Rolle wie groß ein Objekt ist. was gespeichtet wird, sind die Vertex Positionen ob das Vertex nun bei Position 0,0,0 (XYZ) sitzt oder bei Position 100000, 100000,10000 Spielt keine Rolle den es immer nur eine Zahl wo gespreichert werden muss wie viele Stellen die hat spielt keine Rolle.

 

Auch für die Textur spielt es keine Rolle wie groß ein Objekt ist deine die Textur wird mit Hilfe der UV-Map aufs Modell projeziert.

Die UVs nennt man ja auch UV-Koordinaten das liegt daran da man sich die UV-Map wie eine Tabelle vorstellen kann. bei einer 1k Textur hat die Tabelle dann zb 1024 *1024 Spalten und Zeilen.

 

In der UV wird dein Mesh ausgebreitet !

 

Ob dein Mesh nur 1 m Groß ist oder 30km meine UV würde immer gleich aussehen. Wenn du dein Mesh größer skalieren tust, verändert sich ja auch nicht deine Textur.

 

Wenn du dein Mesh aber Riesig skalierst, wirst du irgend wann mal jedes Pixel auf deinem Objekt sehen können. Dies würdest du aber auch wenn dein Objekt 30000km groß ist. Deswegen macht es auch keinen Sinn eine 4k Textur auf ein 30km Terrain zu mappen.

 

Hoffe das ist nun klarer.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke Sleepy,

ja das mit unterschiedlichen Maßstäben macht Sinn. Dass der Speicher davon nicht beeinträchtigt wird ist schonmal gut.

Wobei es trotzdem witzig ist, dass die Modelle von den Chars bis jetzt alle einen Meter groß waren. Dachte da steckt ein Sinn dahinter ;).

Sorgen macht mir dann in der Beziehung die Sache:

zur skallierung an sich ist es am besten mit einer 1 zu 1 skallierung zu arbeiten, da man gern mal eins gewischt kriegt wenn du im code vergisst dass du z.b eine skallierung von 1,7388.... hast.

Das wäre ja irgendwo doch ein Punkt zumindest Objekte mit Code so zu modellieren, dass sie 1 zu 1 übernommen werden können. Häuser, Deko und so fallen da dann raus, was auch eine Menge ändern würde.

Aber vielleicht muss ich da auch einfach etwas mutiger an die Sache rangehen und probieren, was für mich am besten passt.

Die erste Szene ist ja noch relativ klein und bietet sich an, um die wichtigsten Dinge zu implementieren.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das wäre ja irgendwo doch ein Punkt zumindest Objekte mit Code so zu modellieren, dass sie 1 zu 1 übernommen werden können.

 

Ich glaube es geht da nicht um ein Mesh eines Modelles per Script zu erzeugen, sondern wenn man die Skalierung des GameObjects für etwaige Logiken oder Berechnungen braucht. Es kann eben sein, dass man den gesetzten Wert vernachlässigt und von (1,1,1) ausgeht. Das ist alles aber dann auch stark der Situation/ des Problemes geschuldet.

 

Je nachdem was du machen möchtest, wirst du natürlich dazu auch die passenden Erfahrungen machen. Thanatos hat bestimmt schon eine mal gewischt bekommen :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich wollte eigentlich schon viel früher hier antworten, hatte aber recht wenig Zeit.

Auch wenn das Meiste schon geklärt ist, will ich noch Mal auf die wichtigsten Punkte eingehen.

 

Unity nutzt das metrische System und hat für sich selbst eben definiert, dass eine Größeneinheit genau einem Meter entspricht. Auch in der Physikengine ist eine Masseneinheit 1 KG.

3D Programme, außer die Programme, die an CAD angelehnt sind, haben ihre eigene Größeneinheit. So war es auch bei Cinema4D bis zur Version 11. Dort konnte man zwar mm, cm und Meter einstellen, trotzdem waren es immer nur 100 Einheiten.

Ab der version 12 sind 100cm nun wirklich auch 1Meter. Und da passt der Ex-Import zu Unity auch richtig gut.

Andere Grafikprogramme sind da nicht so. Man muss also einfach einmal ermitteln, welches Verhältnis vom 3D Programm zu Unity vorhanden ist. Kennt man es, kann man entweder vor dem Export das Objekt so skalieren, dass es in Unity sofort richtig rein kommt, oder aber in Unity mit dem richtigen Faktor importieren.

Da man einem Asset erst einmal nicht ansieht, in welcher Größe es denn rein kommen würde, bietet sich an, das Objket nach dem Import in Unity zu skalieren und ein Prefab in richtiger Größe zu erstellen. Das macht überhaupt nichts aus, außer dass man eben bei der Transformkomponente nicht ne 1 für jede Größe sieht sondern einen krummen Wert.

Ein Objekt während der Laufzeit zu skalieren kostet bzw. kostete etwas Performance (es soll sich da wohl einiges im Programm-Management getant haben), weil das Objekt intern neu zugeordnet werden muss.

Aber egal, wie groß das Objekt ist, es ändert sich nichts am Speicherverbrauch, an der Auflösung oder an der Anzahl der Polygone. Die Punkte des Objektes liegen enfach nur an anderer Position.

 

Willst du ein Spiel erstellen, hast aber Assets aus anderen Quellen, musst du zwangsläufig die importierten Objekte anpassen. Sie sollten an die Unitymaße angepasst werden und nicht an ein importieretes Objekt.

 

Das Unterordnen der Objekte unter ein Emptyobjekt macht sogut wie gar nichts aus. Lediglich die Transforminformationen und andere Objektinfos wie Name, Tag und Layer verbrauchen ein paar Bit an Speicher. Das war's!

 

Du kannst also den Weg deiner Wahl gehen um die Objekte im Größenverhältnis anzupassen, du wirst bei der Performance und auch beim Speicher keinen Unterschied merken.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Auf dieses Thema antworten...

×   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...