Jump to content
Unity Insider Forum

Export von 3D-Daten


quieri19

Recommended Posts

Hallo zusammen,

ich möchte CAD-Daten von Untiy zur Laufzeit exportieren/herunterladen (WebGL). In meinem Projekt kann man ein Modell aus verschiedenen Bauteilen erstellen werden und dieses sollte dann exportierbar sein sein (User kann sein konstruiertes Modell herunterladen). Gibt es Erweiterungen für Unity, die dies ermöglichen würden? Mein bevorzugtes Downloadformat wäre .IGES oder .Step, da diese dann am besten in CAD-Programmen eingefügt werden können. Hierzu habe ich leider nichts gefunden. Ich beginne also mit dem .STL-Format, da ich hier den StlBuilder gefunden habe und dies ein leichteres Format ist. Leider habe ich aber keinen Zugriff auf meine Meshes der einzelnen Bauteile/GameObjects zur Laufzeit.  Wenn ich Quadrate aus den Boxcollidern erstelle funktioniert es (zweite Funktion). Vielleicht könnt ihr mich da unterstützen. Die Boxcollider nützen mir nichts, da ich das Mesh benötige, nur Quadrate reichen mir nicht. Mit dem MeshCollider schaffe ich es auch nicht. Gibt es generell die Möglichkeit die einzelnen Meshes zu kombinieren und das Gesamte Mesh direkt als eine Datei herunter zu laden, am besten mit Wunsch-Dateiformat?

Diese Version funktioniert nicht, wenn ich Direkt das Mesh verwenden möchte:

///////////////////////////////////////////////////

GameObject GO = Instantiate(MyGameObject).gameObject);
GO.transform.parent = Downloads.transform;

var meshFilters = Downloads.GetComponentsInChildren<MeshFilter>();

List<Mesh> Liste = new List<Mesh>();
List<Transform> ListePosition = new List<Transform>();
for (int i = 0; i < meshFilters.Length; i++)
{
ListePosition.Add(Downloads.transform.GetChild(i).transform); //wurde oben definiert
Liste.Add(meshFilters[i].mesh);
}

//zu Einem Object zusammenfügen, da sonst jedes Elemt einzeln expoertiert wird.
Mesh[] mesh = new Mesh[1];
mesh[0] = CombineMeshes(Liste, ListePosition); ->>>>> HERE IS THE ERROR

var selectedMeshes = mesh.Select(filter => new MeshContainer()
{
Mesh = mesh[0],
Translation = new Vector3(0, 0, 0)  // - Selection.activeGameObject.transform.position //Weg Sonst geht es nicht mehr.
});

var meshExport = STLBuilder.Mesh.Build("UnityExport", selectedMeshes.ToArray());
var stlFile = StlBuilder.Build(meshExport);
StartCoroutine(StartDownload("3D_File", stlFile, ".stl"));

///////////////////////////////////////////////////
private Mesh CombineMeshes(List<Mesh> meshes, List<Transform> _transform)
    {
        var combine = new CombineInstance[meshes.Count];
        for (int i = 0; i < meshes.Count; i++)
        {
            combine[i].mesh = meshes[i];
            combine[i].transform = _transform[i].localToWorldMatrix;
        }

        var mesh = new Mesh();
        mesh.CombineMeshes(combine);
        return mesh;
    }

 

ERROR-Message: Cannot combine mesh that does not allow access: 3DModell Instance

UnityEngine.Mesh:CombineMeshes (UnityEngine.CombineInstance[])

DownloadModell:CombineMeshes (System.Collections.Generic.List`1<UnityEngine.Mesh>,System.Collections.Generic.List`1<UnityEngine.Transform>) (at Assets/Scripts/DownloadModell.cs:483)

DownloadModell:StartDownloadSTLMeshes () (at Assets/Scripts/DownloadModell.cs:218)

DownloadModell:<Awake>b__10_1 () (at Assets/Scripts/DownloadModell.cs:34)

UnityEngine.EventSystems.EventSystem:Update ()

 

So Funktioniert es

public void StartDownloadSTLBoxCollider()
    {
        //Hole alle Boxcollider
        var collidersObj = Schachtkonfigurator._schachtkonfigurator.Schacht.GetComponentsInChildren<BoxCollider>();

        //Erzeuge Alle Wuerfel
        for (var index = 0; index < collidersObj.Length; index++)
        {
            GenerateGameobject(collidersObj[index].GetComponent<BoxCollider>().size);
            GameObject GO = GameObject.Find("CubeX");
            GO.name = GO.name + index.ToString();
            GO.transform.parent = Downloads.transform;
            GO.transform.rotation = collidersObj[index].gameObject.transform.rotation;

            Vector3 v3 = new Vector3(collidersObj[index].transform.parent.position.x, collidersObj[index].transform.parent.position.y, collidersObj[index].transform.parent.position.z); //Brauche Hier ParentPosition, da nur diese ok ist
            if (v3.x < 0)
                v3.x -= collidersObj[index].center.x;
            else
                v3.x += collidersObj[index].center.x;

            if (v3.y < 0)
                v3.y -= collidersObj[index].center.y;
            else
                v3.y += collidersObj[index].center.y;

            if (v3.z < 0)
                v3.z -= collidersObj[index].center.z;
            else
                v3.z += collidersObj[index].center.z;

            //v3.x += collidersObj[index].center.x;
            //v3.y += collidersObj[index].center.y;
            //v3.z += collidersObj[index].center.z;

            GO.transform.position = v3;

        }
        var meshFilters = Downloads.GetComponentsInChildren<MeshFilter>();

        //Versuch zu combinieren hat aber nicht funktioniert
        List<Mesh> Liste = new List<Mesh>();
        List<Transform> ListePosition = new List<Transform>();
        for (int i = 0; i < meshFilters.Length; i++)
        {
            ListePosition.Add(Downloads.transform.GetChild(i).transform); //wurde oben definiert
            Liste.Add(meshFilters[i].mesh);
        }

        //zu Einem Object zusammenfügen, da sonst jedes Elemt einzeln expoertiert wird.
        Mesh[] mesh = new Mesh[1];
        mesh[0] = CombineMeshes(Liste, ListePosition);



        var selectedMeshes = mesh.Select(filter => new MeshContainer()
        {
            Mesh = mesh[0],
            Translation = new Vector3(0, 0, 0)  // - Selection.activeGameObject.transform.position //Weg Sonst geht es nicht mehr.
        });

        var meshExport = STLBuilder.Mesh.Build("UnityExport", selectedMeshes.ToArray());
        var stlFile = StlBuilder.Build(meshExport);
        StartCoroutine(StartDownload("3D_File", stlFile, ".stl"));

    }

Vielen Dank!

LG

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