La formula per fare ciò è la seguente:
X, Y e Z rappresentano le coordinate del punto da disegnare
X0, Y0, Z0 rappresentano le coordinate del centro della sfera
r rappresenta il raggio della sfera.
Theta (il simbolo con il trattino orizzontale) e Phi (il simbolo con il trattino verticale) rappresentano rispettivamente la latitudine e la longitudine del punto.
Ora assegnando a Theta un valore che va da 0 a Pi greco e a Phi un valore che va da -Pi greco a Pi greco, otteniamo un serie di punti che rappresentano la nostra sfera, importando questi punti in Blender otteniamo un risultato come questo:
Per chi conosce un minimo di programmazione questo si può fare con 2 semplici loop annidati uno dentro l'altro.
Per importare dei punti in Blender, la soluzione più semplice è utilizzare il formato OBJ, praticamente un formato testo composto da tante righe quanti sono i punti da disegnare, ogni riga, se contiene le coordinate di un punto, inizia con la lettera v seguita dalle 3 coordinate x,y e z separando i vari campi con uno spazio.
Esempio di 3 vertici::
v 0 0 2
v 2,126506617006E-17 -0,347296355333861 1,96961550602442
v 4,18840040651854E-17 -0,684040286651337 1,87938524157182
Edit del 20/03/2010
Qui una routine in pyton da utilizzare direttamente dentro Blender 2.49.
Per utilizzarla:
Selezionare la finestra Text editor
Premere Alt N
Incollare il codice
Eseguire premendo Alt P
import Blender
from Blender import *
import bpy
import math #Importa le funzioni trigonometriche
passo=float(math.pi/20)
vertice=[]
me = bpy.data.meshes.new('myMesh') # crea una nuova mesh
for i in range(0, 20):
for j in range(0,40):
x=math.sin(-math.pi+j*passo)*math.cos(i*passo)
y=math.sin(-math.pi+j*passo)*math.sin(i*passo)
z=math.cos(-math.pi+j*passo)
vertice.append((float(x),float(y),float(z)))
me = Mesh.New('Sfera')
me.verts.extend(vertice)
Scene.GetCurrent().objects.new(me,"Sfera")
Blender.Redraw()
from Blender import *
import bpy
import math #Importa le funzioni trigonometriche
passo=float(math.pi/20)
vertice=[]
me = bpy.data.meshes.new('myMesh') # crea una nuova mesh
for i in range(0, 20):
for j in range(0,40):
x=math.sin(-math.pi+j*passo)*math.cos(i*passo)
y=math.sin(-math.pi+j*passo)*math.sin(i*passo)
z=math.cos(-math.pi+j*passo)
vertice.append((float(x),float(y),float(z)))
me = Mesh.New('Sfera')
me.verts.extend(vertice)
Scene.GetCurrent().objects.new(me,"Sfera")
Blender.Redraw()
Qui c'è una semplice routine scritta in Visual Basic per generare il file da importare in Blender, facilmente adattabile in altri inguaggi. L'unica variante è che anzichè i radianti sono stati usati i gradi.
Ora vediamo come vengono effettuati i rilievi altimetrici per la ricostruzione dellle mappe 3D.
Il satellite gira intorno alla luna a una distanza fissa, emettendo, a intervalli regolari un impulso laser che rimbalza sul terreno e torna indietro. Il tempo che ci mette a andare e tornare permette di calcolare la distanza fra il satellite e il terreno sottostante, meno tempo ci mette più il punto è elevato. Man mano che il satellite compie delle orbite attorno alla luna i punti rilevati aumentano permettendo di migliorare la qualità della mappa, ma rendendo estremamente pesante da elaborare i dati
Per dare un'idea, la Jaxa ha rilasciato una mappa completa della luna a bassa risoluzione composta da 16588800 punti (2880 linee composta ognuna da 5760 punti), questo significa che ogni punto dista dall'altro poco meno di 2 Km, ottimo per una visione completa della luna, ma scarsa per dei dettagli ravvicinati.
Per dare un'idea questa immagine e composta da 160x160 punti rappresenta la zona di allunaggio dell'Apollo 11. La zona è più di 300 Km per lato.
Naturalmente questa è una semplificazione, in quanto per funzionare correttamente, la sonda deve sapere esattamente dov'è rispetto alla luna, e sulla luna il GPS non funziona, inoltre per ridurre gli errori si deve tenere conto della temperatura di tutta l'attrezzatura, in quanto al variare della temperatura i dati rilevati non sono più omogenei.
Ciao
VB
Nessun commento:
Posta un commento