3d - que - piezas para freecad
Procesar generalmente una malla de esfera. (4)
Este es un código C # de trabajo 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);
}
}
}
Estoy buscando un algoritmo (en pseudo código) que genere las coordenadas 3d de una malla de esfera como esta:
El número de cortes horizontales y laterales debe ser configurable.
Esto está justo fuera de mi cabeza sin pruebas. Podría ser un buen punto de partida. Esto le dará los resultados más precisos y personalizables con el mayor grado de precisión si utiliza el 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.
}
Si hay M líneas de latitud (horizontal) y N líneas de longitud (vertical), entonces ponga puntos en
(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 dibuje los segmentos de línea entre los puntos, según corresponda.
edición: tal vez ajuste M en 1 o 2 según sea necesario, porque debería decidir si contar o no "líneas de latitud" en los polos
solo una conjetura, probablemente podrías usar la fórmula para una esfera centrada en (0,0,0)
x²+y²+z²=1
resuelva esto para x, luego haga un bucle a través de un conjunto de valores para y y z y trácelas con su x calculada.