Pregunta

i Busco a un algoritmo (en el código de pseudo) que genera las coordenadas 3D de una esfera de malla como esto:

text alt

el número de rebanadas horizontales y laterales debe ser configurable

¿Fue útil?

Solución

Si hay M líneas de latitud (horizontales) y N líneas de longitud (vertical), a continuación, poner puntos a

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

para cada m en {0, ..., M} y n en {0, ..., N-1} y dibujar los segmentos de línea entre los puntos, en consecuencia.

editar: puede que ajustar M por 1 ó 2 según sea necesario, ya que debe decidir si es o no contar "las líneas de latitud" en los polos

Otros consejos

Esto es justo al lado de la parte superior de mi cabeza sin probar. Podría ser un buen punto de partida. Esto le dará los resultados más precisos y personalizables con mayor grado de precisión si se utiliza doble.

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. 

}

sólo una suposición, que probablemente podría utilizar la fórmula para una esfera centrada en (0,0,0)

x²+y²+z²=1

resolver este para x, entonces bucle throuh un conjunto de valores para y y z y la trama con su x calculado.

Este es un código de trabajo # C para la respuesta anterior:     

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);
        }
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top