Jump to content
Unity Insider Forum

Sehr großes Mesh und HiRes-Texturen importieren


Ultrafox

Recommended Posts

Hallo Leute,

 

ich bin neu hier im Forum und relativ unbedarft, was Unity betrifft.

Für ein Projekt muss ich ein via Drohne und Photogrammetrie erstelltes Modell einer großen Ruine in Unity importieren.

 

Hier handelt es sich nicht um ein Game, sondern lediglich um die Möglichkeit, via Unity die Ruine durchlaufen und besichtigen zu können.

 

Die Ausgangsdaten des mit RealityCapture erstellten Models:

 

1 Mesh mit 3 Millionen Faces

16 Texturfiles mit jeweils 16.384x16.384 Pixel

 

Obj + mtl-File

 

Was bisher geschah:

Ich konnte das Mesh (Obj-File) erfolgreich importieren. Unity machte daraus ca. 50 Objekte.

Anschließend konnte ich auch die 16 Texturfiles importieren, wobei Unity diese auf jeweils 4096x4096 Pixel reduzierte - was auch ok ist.

 

Mein Problem ist, dass die Texturen den von Unity erstellten 50 Objekten nicht zugeordnet werden.

Versuche ich dies manuell, funktioniert dies nur teilweise. Einige Teil-Texturen sind leider an falscher Stelle.

 

Hat irgendwer von euch eine Idee, wie ich das Problem lösen könnte?

 

Ich freue mich auf eure Antworten und bedanke mich schon einmal

 

Beste Grüße

Ultrafox

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Problem liegt darin, dass Unity eine GameEngine ist, die natürlich stark mit der Grafikkarte zusammenarbeitet.

Auch aus diesem Grund kann ein Mesh nur 64k Polys haben und eine Texturgröße von 4096.

Keine Ahnung, wie du das importiert hast, damit du diese 50 Objekte bekommen hast. Scheinbar ist da aber etwas mit den UV Maps kaputt gegangen.

Ich empfehle dir, dein Mesh in einem 3D Programm selber zu zerstückeln, richtig zu benennen und die UVs zu erzeugen. Dann die Texturen dementsprechend auch benennen, damit du weißt wo welche textur hin gehört.

Wenn du als FBX exportierst und deine Meshes Materialien mit eindeutigen Namen haben, dann sind die Materialien auch schon auf deinen Meshes in Unity drin. Jetzt musst du nur noch den Materialien die richtigen Texturen zuweisen.

Als OBJ kommen glaube ich keine Materialien mit rüber... ich weiß es aber nicht genau.

 

Also wie gesagt: Stell alles in einem 3D Programm zusammen, dann geht das in Unity ganz leicht und wird auch passen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Keine Ahnung, wie du das importiert hast, damit du diese 50 Objekte bekommen hast

Macht Unity automatisch, wenn es zu große Meshes erkennt.

 

Es wäre natürlich wünschenswert, wenn das mit Unitys Automatik zum Laufen zu kriegen wäre, aber ansonsten ist malzbies Vorschlag sehr gut.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo malzbie,

 

vielen Dank für deine Antwort. Leider bin ich erste heute dazugekommen, zu antworten.

 

Unglaublich - dieses Unity!!

Ziel ist es, sogar, ein Mesh mit sechs Millionen Faces zu importieren.

Eine manuelle Aufteilung in 64K-Meshes in einem 3D-Programm zu machen wäre sehr aufwändig und mit sehr viel manueller Arbeit verbunden. Zudem auch noch Fehleranfällig.

 

Mittlerweile konnte ich das Problem allerdings lösen. Wie ich schrieb, liegen mir die Daten des Meshes im Obj + mtl vor. Die Texturen erstrecken sich über 16 jeweils 16.384x16.384 Pixel.große Jpg-Files.

 

Problem war, dass Unity beim Import die mtl-Files nicht berücksichtigt. Üblicherweise macht das nichts, da es in der Regel lediglich ein Textur-File pro Mesh (Objekt) gibt. Eine solches einzelnes Textur-File kann man einfach nach dem Import zuweisen.

Ich habe jedoch 16 TextureFiles für das eine große Mesh. Die wichtigen Informationen, auf welches File sich die jeweiligen Texturkoordinaten beziehen, stehen allerdings im mtl-File. Und da Unity dieses File nicht berücksichtigt, konnte es kein vernünftiges Mapping der Texturdaten vornehmen.

 

Meine Lösung war, den Autodesk FBX Converter 2013 zur Konvertierung von Obj + mtl nach fbx heranzuziehen.

Der berücksichtigt das mtl-File und schreibt diese Infomationen auch korrekt mit in das fbx-File. Unity wiederum berücksichtigt beim Import dir mtl-Daten, wenn sie sich in einem fbx befinden. Vor dem Import der fbx-Daten, die 16 Texturefiles in Unity importiert, dann das fbx - super, klappt alles.

 

Sogar mit 6 Millionen Faces im Mesh. Unity teilte das Mesh in 92 einzelne Objekte, konvertierte die Texturdaten auf jeweils 8192x8192 Pixel und komprimierte diese entsprechend.

Eine richtig geile Sache. Läuft absolut flüssig mit > 60 Bps. Unglaublich, was Unity in diesem Bereich kann.

Nun kann ich super durch die Ruine laufen, oder drin rumfliegen - auch in VR mit der Occulus.

 

 

 

 

 

 

Im Blender konnte ich das Mesh einschl. Texturen überhaupt nicht laden.

Nachdem ich lernen durfte, dass die Textur-Koordinaten stets normiert sind, wurde mir klar, dass ich die Texturen eines solchen Mega-Meshes beliebig in der Größe verändern kann - passt trotzdem immer. Somit konnte ich das Projekt mit niedrigerer Auflösung der Texturen in Blender importieren.

 

Nochmals, Danke für die Antwort

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ah, sehr gut!

Hab ich doch richtig damit gelegen, dass die OBJ Datei (im Zusammenhang mit Unity) das Problem ist.

Dass Unity selber die großen Meshes splittet, war mir gar nicht bewusst. Hab mich noch nie getraut so große Meshes rüber zu schieben. :D

Unity erstaunt mich auch immer wieder. Ich finde eigentlich wöchentlich neue Dinge raus, und das, obwohl ich schon seit Jahren damit rum mache.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Oh well - Wäre supi mal einen Screenshot zu sehen. Ruine aus Photogrammetrie klingt spannend!

 

Gute Morgen,

 

anbei, ein paar Screenshots der Ruine:

 

ruine_screenshot_editor.jpg:

aus der Unity-View heraus aufgenommen.

In den Statistics rechts oben deutlich zu sehen, die Anzahl der berechneten Tris in dieser Scene.

30 Millionen.

 

ruine_screenshot_build.png:

das Ganze in voller Auflösung aus dem Build heraus aufgenommen

 

tiled_mesh.jpg

Gut zu sehen, wie Unity das aus 6 Millionen Faces bestehende Mesh beim Import aufgeteilt hat in 92 einzelne Objekte

 

Gruß

Ultrafox

post-6337-0-86256300-1488887121_thumb.png

post-6337-0-33990400-1488887123_thumb.jpg

post-6337-0-79904300-1488887124_thumb.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das ist schon verdammt sexy.

VR-Brille steht bereit, hoffe ich! :D

Ja, natürlich - eine Oculus. Funktioniert echt prima. Leider gibts ein leichtes Flickern bei weit entfernten Objekten. Habe noch nicht herausgefunden, an was das liegt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Gemeinde,

habe das Projekt mittlerweile fertiggestellt. 
Das von mir beschriebene Flickern lag daran, dass ich das Mipmapping ausgeschaltet hatte - wegen der Textur-Qualität.

Dies hatte allerdings zur Folge, dass sich bei Bewegungen viele unterschiedliche Textur-Pixel, die hinreichend weit von der Kamera entfernt sind, um den gleichen Pixel-Platz im Rasterbild stritten. In einem Frame gewinnt das Eine, im anderen Frame, ein anders Pixel :)

Da meine Texturen sehr sehr hochauflösend sind, war das Flickern extrem.

Nochmals die Eckdaten meines Projekts:

Ein Mesh, beim Import von Unity in 90 Meshes aufgeteilt.
50 Texturdateien mit jeweils 8192 x 8192 Pixel Auflösung.

Fazit: Bei sehr hochauflösenden Texturen sollte man Mipmapping einschalten bzw. eingeschaltet lassen, wenn die Texturen auch aus größeren Entfernungen betrachtet werden sollen - wirkt ziemlich beruhigend auf die Pixel ;)

Hier, nochmals zwei Screenshots. RuinePart.jpg zeigt den Ausschnitt, der in RuineAll.jpg mit einem weißen Quadrat gekennzeichnet ist. Keine Texturen werden mehrfach verwendet. Jedes Pixel des Models hat sein eigenes Texturpixel. Übrigens: läuft mit über 70 fps bzw. 90 fps in VR - Unity ist toll!!!!

Gruß

Ultrafox

 

 

 

 



 

 

 

 

 

RuineAll.png

RuinePart.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...