Gigantisches 3D-Modell in kleinere Teile teilen

  • C#

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    Gigantisches 3D-Modell in kleinere Teile teilen

    Servus, ich bins nochmal :D
    Ich hab heut ein ganz anderes Problem. Und zwar habe ich ein riesiges 3D-Modell (1,72M Vertices, 1,12M Faces und 2,15M Triangles). Das kann man sich ungefähr so vorstellen wie diese Skizze (sind natürlich keine Würfel):

    Nur, dass unvorteilhafterweise alle Würfel ein einziges Mesh bilden. Und ich möchte nur den rechten Würfel aus diesem riesen Netz rausextrahieren und ich habe keine Ahnung wie ich das anstellen soll :D Wenn ich in Blender im Edit-Mode Split by loose parts nehme, habe ich keine Ahnung, wie lange der PC daran arbeitet. Hab ihn gestern über ne Stunde laufen lassen, aber es war kein Ende in Sicht. Mit anderen 3D-Programmen kenne ich mich -leider- nicht aus, bin aber natürlich bereit, mir die runterzuladen, wenn ich damit weiterkomme :D
    Meine letzter Ansatz wäre es, das Mesh in Unity zu laden. Dort könnte ich dann mit einem Skript den rechten Teil des Meshes extrahieren und dann wieder zu einer OBJ-Datei exportieren, aber wenns anders (einfacher) geht, wärs mir auch recht :D
    Hoffe mir kann jmd helfen ^^

    LG :)
    Wenn du bei Blender im Edit-Mode mit dem Cursor auf ein Mesh gehst und l drückst selektiert er alle verbundenen Faces. Du kannst auch mit Z als Wireframe anzeigen und mit B Borderselect machen, oder auf Faces gehen und dann C drücken (mit dem Mausrad lässt sich der Selektionsradius einstellen). Nachdem du deine Faces selektiert hast, drückst du P -> Seperate by selection.
    Was zur Hölle hast du für ein Model?

    Und nicht zusmmengehörende Objekte zu erkennen ist nicht so einfach.
    Meine Idee:
    Vertices(mit dem jeweiligen Index position des Vertex) sortieren, Sortierung ist grundsätzlich egal, hauptsache so, dass Vertices die nah beieinander sind auch entsprechend nah in der Liste auch beieinander sind(Wenn du Rundungsfehler ignorieren willst, kannst du auch nur so sortieren, dass gleiche Vertices gruppiert werden, dafür kannst du dann sogar theoretisch mit unsafe die binärdaten nehmen und damit vergleichen. Spart evtl. ne kleinigkeit wobei das fixieren in C# dann vmtl. langsamer ist als direkt zu vergleichen.)
    Nachdem du das hast würde ich einmal die Liste der Faces durchlaufen und die Indices so ersetzen, dass jeder Index nur noch auf eine der oben erzeugten Gruppen zeigt(theoretisch könnte man das auch mit dem nächsten Schritt kombinieren, aber ich glaube fast, dass es bei der Menge an Daten so sogar schneller sein dürfte).
    Nun fängst du mit den Indices an und traversierst entlang der Faces, dabe musst du verhindern, dass du Indices doppelt besuchst(mit einem bool Flag z.B.) von jedem Index gehst du dabei weiter zu allen anliegenden Indices, Wichtig ist dabei, das nach jedem abgeschlossenen Face braucht muss wieder ein Index kommen, welcher einem der 3 Indices dieses Faces entspricht, falls dies nicht der Fall ist sind die Faces nicht miteinander verbunden und du musst weiter suchen. Wenn du dann alles durchsucht hast und keine anliegenden mehr findest hast du ein Submesh gefunden. Und du musst dir einen neuen StartIndex suchen um die anderen Submeshes zu finden(du kannst als ersten Startindex auch ein dir bekannten Index nehmen, falls du nur ein bestimmtes Submesh möchtest).

    Vergiss nicht, dass sich davon einiges Parallelisieren lässt. Z.B. auch statt einm bool Flag für die besuchten Faces über einen Int-Wert, von welchem Thread etwas durchsucht wurde, wenn sich dann zwei ungleiche Indices (zwei Threads) bei der Suche treffen, dann weißt du dass beide auf dem selben Submesh suchen->kannst du dir merken und später dann mergen. Mit einem reinen bool Flag wäre das mergen und somit auch das Threading nochmal komplizierter und aufwändiger.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    jvbsl schrieb:

    Und nicht zusmmengehörende Objekte zu erkennen ist nicht so einfach.
    Naja, in dem Fall schon, weil die vier Objekte wie die vier Würfel in der Skizze wirklich einen Abstand zu einander haben.
    Ich probiers erstmal so wie @Gonger96 des vorschlägt ^^
    Ok, hab einfach mit dem BoderSelect alles unnötige gelöscht @Gonger96. Wusste nicht, dass das geht ^^
    Die Würfel waren nur als vereinfachte Darstellung gedacht, das Mesh sieht eigentlich anders aus. Ich hab mir des nicht ausgesucht, sondern habe das so vom Ersteller bekommen, konnte ihn aber jetzt auch nicht bitten, mir das gesplittet zu schicken. In dem Mesh war vier mal das gleiche Objekt, nur in unterschiedlichen Größen und Detailgraden. Ich benötige (logischerweise) aber nur eine Größe und musste mir die deshalb rausschneiden. Von den ursprünglichen 60MB sind jetzt noch 6MB übrig. Das Model, welches ich brauche hat nur 180k Verts, 150k Faces 285k Tris, lässt sich damit also auch problemlos in Unity einfügen ^^

    Aber Danke an alle ^^
    Nur zur Info, dadurch dass die einen Abstand haben wird es für den Algorithmus nicht unbedingt einfacher. Nur dadurch dass es eine BoundingBox gibt, die die anderen Meshes nicht beinhaltet könnte man einen einfacheren Algorithmus machen, aber nicht unbedingt einen schnelleren.

    Selbst wenn du ein Quad hast besteht das aus 2 unterschiedlichen Dreiecken, bei denen du erst feststellen musst dass diese zusammengehören. Oftmals wird es noch schwerer, wenn diese dann unterschiedliche Texturkoordinaten haben, oder auch einfach nur unterschiedliche Normals, denn ein Quad hätte in diesem Fall 6 Vertices und nicht 4...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---