Frage

i bin für einen Algorithmus (in Pseudocode), die die 3D-Koordinaten einer Kugel Netz wie folgt erzeugt:

alt text

die Anzahl der horizontalen und seitlichen Scheiben sollten konfigurierbar

sein
War es hilfreich?

Lösung

Wenn es M Zeilen Breite (horizontal) und N Linien der Länge (vertikal), dann stellte Punkte bei

(x, y, z) = (sin (pi * m / m) cos (2Pi * n / N) sin (pi * m / m) sin (2Pi * n / N) cos (pi * m / m))

für jedes m in {0, ..., M} und n in {0, ..., N-1}, und die Liniensegmente zwischen den Punkten zeichnen, entsprechend.

edit: vielleicht M einstellen durch 1 oder 2 je nach Bedarf, weil Sie sich entscheiden sollen, ob nicht an den Polen „Breite Linien“ zu zählen,

Andere Tipps

Dies ist nur aus der Spitze von meinem Kopf, ohne zu testen. Es könnte ein guter Ausgangspunkt sein. Dies gibt Ihnen die genaueste und anpassbare Ergebnisse mit den meisten Grad an Genauigkeit, wenn Sie doppelt verwendet werden.

public void generateSphere(3DPoint center, 3DPoint northPoint, int longNum, int latNum){
     //Find radius using simple length equation (distance between center and northPoint)

     //Find southPoint using radius.

     //Cut the line segment from northPoint to southPoint into the latitudinal number
     //These will be the number of horizontal slices (ie. equator)

     //Then divide 360 degrees by the longitudinal number to find the number of vertical slices.

     //Use trigonometry to determine the angle and then the curcumference point for each circle starting from the top.

    //Stores these points in however format you want and return the data structure. 

}

nur eine Vermutung, könnte man wahrscheinlich die Formel für eine auf zentrierte Kugel verwenden (0,0,0)

x²+y²+z²=1

lösen diese für x, dann Schleife throuh eine Reihe von Werten für y und z und zeichnen sie mit dem berechneten x.

Dies ist ein Arbeits C # -Code für die obige Antwort:     

using UnityEngine;

[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))]
public class ProcSphere : MonoBehaviour
{

    private Mesh mesh;
    private Vector3[] vertices;

    public int horizontalLines, verticalLines;
    public int radius;

    private void Awake()
    {
        GetComponent<MeshFilter>().mesh = mesh = new Mesh();
        mesh.name = "sphere";
        vertices = new Vector3[horizontalLines * verticalLines];
        int index = 0;
        for (int m = 0; m < horizontalLines; m++)
        {
            for (int n = 0; n < verticalLines - 1; n++)
            {
                float x = Mathf.Sin(Mathf.PI * m/horizontalLines) * Mathf.Cos(2 * Mathf.PI * n/verticalLines);
                float y = Mathf.Sin(Mathf.PI * m/horizontalLines) * Mathf.Sin(2 * Mathf.PI * n/verticalLines);
                float z = Mathf.Cos(Mathf.PI * m / horizontalLines);
                vertices[index++] = new Vector3(x, y, z) * radius;
            }
        }
        mesh.vertices = vertices;
    }

    private void OnDrawGizmos()
    {
        if (vertices == null) {
            return;
        }
        for (int i = 0; i < vertices.Length; i++) {
            Gizmos.color = Color.black;
            Gizmos.DrawSphere(transform.TransformPoint(vertices[i]), 0.1f);
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top