2010-11-02 10 views

cevap

32

orada enlem M soyları (yatay) ve (dikey) boylam N hatları, daha sonra

(x, y, z) de noktalar koymak = halinde (sin (Pi * m/m) cos (2Pi * n/N), sin (Pi * m/M) günah (2Pi * n/N), cos (Pi * m/M))

Her m için {0, ..., M} ve {0, ..., N-1} 'de n ve buna göre noktalar arasındaki çizgi bölümlerini çizin.

düzenleme: Eğer kutuplar

+0

+1 hakkında bir makaleye yönlendirilmeleri gerekir. Bu muhtemelen OP'nin sorduğu şeydir. –

+1

+1, çünkü bu herhangi bir grafik kitaplığı ile çalışır. Başka bir soru: Kürenin yarıçapını da kontrol etmenin bir yolu var mı? – kiltek

+4

@kiltek: Bu, 0'dan 1'e (x, y, z) için değerler verir. Herhangi bir yarıçapa ölçeklendirmek için, her noktayı istediğiniz yarıçapla çarpın. – Carrotman42

1

sadece bir tahmin, muhtemelen bu çözmek (0,0,0)

x²+y²+z²=1 

ortalanan bir küre formülünü kullanabilirsiniz x, sonra y ve z için bir değerler kümesini döngü ve hesaplanan x ile çizim.

+0

Bu yöntemin, söz konusu projenin performans gereksinimlerine bağlı olarak, bu yöntemin mutlaka pahalı olduğuna inandığım bir sqrt() 'gerektirdiği için iyi bir fikir olduğundan emin değilsiniz. –

+0

Bu yöntemin gerçekten denemek istediğine kimsenin karar vermesi durumunda, muhtemelen [Marching Cubes] (https://en.wikipedia.org/wiki/Marching_cubes) ... – porglezomp

2

Bu sadece test etmeden başımın üstünde kapalı kısmındaki "enlem çizgileri" saymak için olsun ya da olmasın karar vermelidir çünkü belki 1 veya gerektiği gibi 2 oranında M ayarlayın. İyi bir başlangıç ​​noktası olabilir. Eğer çift kullanırsanız, bu size en doğru ve en kesin hassasiyetle sonuçları verecektir.

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. 

} 
+0

güzel bir açıklama – kiltek

0

Bu, yukarıda cevap çalışan bir C# kodu olduğunu:

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); 
     } 
    } 
} 
İlgili konular