procédure de génération d'un maillage de sphère

je cherche un algorithme (en pseudo-code) qui génère les coordonnées 3d d'un maillage de sphère comme ceci:

alt text

le nombre de tranches horizontales et latérales doit être configurable

25
demandé sur afuzzyllama 2010-11-02 23:40:38

4 réponses

S'il y a des lignes M de latitude (horizontale) et des lignes N de longitude (verticale), mettez des points à

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

pour chaque m dans { 0, ..., M } et n dans { 0, ..., N-1 } et tracer la ligne de segments entre les points en conséquence.

edit: peut-être ajuster M par 1 ou 2 au besoin, parce que vous devriez décider si oui ou non il faut compter les "lignes de latitude" aux pôles

34
répondu Jonathan 2010-11-02 20:55:21

C'est juste au-dessus de ma tête sans test. Il pourrait être un bon point de départ. Cela vous donnera les résultats les plus précis et personnalisables avec le plus de degré de précision si vous utilisez double.

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. 

}
2
répondu bhavinp 2010-11-02 20:58:46

juste une supposition, vous pourriez probablement utiliser la formule pour une sphère centrée en (0,0,0)

x²+y²+z²=1

résolvez ceci pour x, puis bouclez un ensemble de valeurs pour y et z et tracez-les avec votre x calculé.

1
répondu John Boker 2010-11-02 20:47:00

ceci est un code C # de travail pour la réponse ci-dessus:

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);
        }
    }
}
0
répondu yshahak 2017-11-22 08:05:19