All rites reversed. Reprint what you like.
Salvo diversa indicazione

giovedì 18 marzo 2010

Un po' di matematica, ma non solo

Non spaventiamoci, ma per capire come fare una mappa 3D da dei dati altimetrici, dobbiamo conoscere almeno come rappresentare graficamente una sfera in uno spazio 3D.
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()
Fine Edit
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