2016-03-23 7 views
2

In meinem Unity3d-Projekt möchte ich ein Mesh erstellen, das vier Sphären verbindet.Verbinden von Vector3 [] mit Mesh in Unity

Ich habe ein neues Quad erstellt und das Array transform.position von meinen vier Kugeln zu GetComponent<MeshFilter>().mesh.vertecies meines Quads zugewiesen.

Da das nicht funktioniert,
wie kann ich die globale Position eines Scheitels in Unity lesen oder schreiben?



meine Lösung (Werke)

GameObject quad; 
Transform[] spheres; 
//asign values and do other stuff 

void UpdateMesh(){ 
    Vector3[] newVerts = new Vector3[spheres.Length]; 
    for(int i = 0; i < newVerts.Length; i++){ 
     newVerts[i] = spheres[i].position - quad.transform.position; 
    } 
    quad.GetComponent<MeshFilter>().mesh.vertecies = newVerts; 
} 
+1

Ich kann das jetzt nicht testen, aber ich denke, Sie sollten 'RecalculateBounds()' auf Ihrem Mesh nach dem Ändern der Scheitelpunkte aufrufen. –

+0

Sie müssten etwas mehr Code anzeigen, aber eine Sache bereits, wenn Sie das Array erhalten und die Werte ändern, haben sie keine Auswirkungen auf das Original, da Unity das gesamte Vertex-Array in ein neues Array kopiert. Nach dem Modifizieren müssen Sie das Array also wieder mesh.vertices zuweisen. Dies liegt daran, dass das Mesh auf C++ - Seite gespeichert ist und keine Bridge erstellt wird. nur eine Kopie davon. – Everts

+0

Eine erwähnenswerte Sache ist, dass Sie auch Partikelsysteme verwenden können. Das Partikelsystem bietet die Option, Knotenpunkte eines Netzes als Punkte zu verwenden. Ich bin mir nicht sicher, wie gut das zu deiner Situation passt, sag ich nur. –

Antwort

1

Es hängt wahrscheinlich, wie Sie Scheitelpunkte zuweisen.
Hier ist ein funktionierendes Beispiel, das Sie mit experimentieren können, dies nur als Skript fügen Sie Ihren Quad: note

using UnityEngine; 

// adding ExecuteInEditMode attribute so we can easily see the results from the editor 
[RequireComponent(typeof(MeshFilter))] 
[ExecuteInEditMode] 
public class VertexChanger : MonoBehaviour { 

    // assign these from the editor 
    public Transform Sphere0; 
    public Transform Sphere1; 
    public Transform Sphere2; 
    public Transform Sphere3; 

    // doing changes in update so we see this immediately from the editor 
    void Update() { 
     if (Sphere0 == null || Sphere1 == null || Sphere2 == null || Sphere3 == null) { 
      return; 
     } 
     // create a new array of vertices and assign it 
     Vector3[] newVertices = new[] { 
      Sphere0.transform.position, 
      Sphere1.transform.position, 
      Sphere2.transform.position, 
      Sphere3.transform.position 
     }; 
     MeshFilter meshFilter = GetComponent<MeshFilter>(); 
     meshFilter.sharedMesh.vertices = newVertices; 

     // these calls are not strictly necessary here... 
     meshFilter.mesh.RecalculateBounds(); 
     meshFilter.mesh.RecalculateNormals(); 
    } 
} 

Bitte, dass diese, wie Sie nur, wenn Sie die Kugeln in der richtigen Reihenfolge gesetzt erwarten arbeiten, sonst Möglicherweise müssen Sie auch das Drei- ecksfeld des Netzes neu berechnen.

+0

Wow - großartig! Vielen Dank! Ich habe es selbst mit einem anderen Ansatz gelöst. Da die Position der Vertecties relativ zur "transform.position" des gameObject ist, berechnete ich die neue relative Position durch Subtraktion von 'gameObject.transform.position' von' sphere [n] .transform.position'. – 000000000000000000000

+0

Ah, naja, natürlich funktioniert meine Lösung nur, wenn dein Quad auf Position 0 steht und nicht gedreht wird, sonst siehst du witzige Sachen :) –

Verwandte Themen