Jump to content
Unity Insider Forum

quieri19

Members
  • Gesamte Inhalte

    4
  • Benutzer seit

  • Letzter Besuch

quieri19's Achievements

Newbie

Newbie (1/3)

1

Ansehen in der Community

  1. quieri19

    Export von 3D-Daten

    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
×
×
  • Neu erstellen...