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

sabato 27 marzo 2010

Alta risoluzione

Ci ho messo un po' di tempo perché nella routine che disegna la sfera c'era qualcosa che non andava e son diventato matto a cercare un routine corretta, adesso il problema l'ho risolto.
Quindi prima di iniziare la parte relativa all'interfaccia riscriviamo la routine precedente.
In questo caso ho fatto che passare direttamente alla risoluzione massima (leggo tutti i punti), ma limito l'importazione a una parte della luna. Per ora gli estremi da visualizzare sono all'interno dello script, basta indicare  latitudine iniziale, latitudine finale, longitudine iniziale e longitudine finale.
Questo è il risultato (clicca sull'immagine per un ingrandimento):



























Questa è la metà destra della luna.come si vede dalla terra, tagliando una fetta sopra e una fetta sotto. E' il massimo che riesco a riprodurre, se aumento ancora i punti Blender va in crash per problemi di memoria.
Qui sotto lo script, non credo servano molti commenti in quanto penso di averlo documentata in maniera sufficiente.
Una volta eseguito lo script, bisogna scalarlo (io lo scalo di 0.001) e bisogna anche ricalcolare le normali, ci deve essere un errore nella routine che unisce i vertici.
Se qualcuno sa come fare da Python queste 2 operazioni me lo faccia sapere così correggo.
Per vedere la luna come la vediamo dalla terra, bisogna mettere la visuale dall'alto.


import math, array, bpy, Blender
from Blender import *


#Dati prelevati direttamente dal file
GRID_RES=0.0625    #Risoluzione della griglia
START_LONG=0.03125 #Prima longitudine
START_LAT=89.96875 #Prima Latitudine
RAGGIO_LUNA=1737.4 #Raggio della luna
PUNTI=5760         #Numero di punti per ogni riga


#Tutte le funzioni trigonometriche utilizzano i radianti.
#er trasformare gradi in radianti basta moltiplicare per Pi greco/180
TO_RAD=math.pi/180 #Serve per trasformare i gradi in radianti




Vertici=[] #Array che conterra' i vertici da disegnare
Facce=[]   #Array che conterra' l'ordine dei vertici per creare le facce


DatiAltezza=[] #Array che contiene tutti i dati del file


#Dando un valore di longitudine
#restituisce il numero del punto piu' vicino in
#maniera da far sempre riferimento a una longitudinhe valida
def Punto(Long):
return round((Long-START_LONG)/GRID_RES+1)


#Dando un valore di latitudine
#restituisce il numero della linea piu' vicina in
#maniera da far sempre riferimento a una latitudine valida
def Linea(Lat):
return round((START_LAT-Lat)/GRID_RES+1)


#Dando un numero di linea restituisce la latitudine
def Lat(Linea):
return START_LAT-(Linea-1)*GRID_RES


#Dando un punto restituisce la longitudine
def Long(Punto):
return START_LONG+(Punto-1)*GRID_RES


#Dando una latitudine e una longitudine
#restituisce l'altezza di quella coordinata
def Altezza(Lat,Long):
return DatiAltezza[int((Linea(Lat)-1)*PUNTI+Punto(Long))]


def LeggoFile(NomeFile):
#Apro il file con i dati
f=open(NomeFile,'rb')
#Leggo i primi 9558 byte per posizionarmi sul primo byte di dati
DatiLetti=f.read(9558)
#Leggo fino alla fine del file
DatiLetti=f.read()
#Assegno i dati letti in un array di tipo float
DatiTemp=array.array("f",DatiLetti)
f.close
return DatiTemp


#Questa funzione disegna la luna
def DisegnaLuna(Da_Lat, A_Lat, Da_Long, A_Long):
tmpDa_Long=Da_Long
#Calcolo il numero di linee da leggere
NumeroLinee=int(Linea(A_Lat)-Linea(Da_Lat)+1)
    #Calcolo il numero di punti da leggere
NumeroPunti=int(Punto(A_Long)-Punto(Da_Long)+1)
while (Da_Lat>=A_Lat): #Loop dalla prima all'ultima latitudine  
while (Da_Long<=A_Long): #Loop dalla prima all'ultima longitudine
Raggio=Altezza(Da_Lat,Da_Long)+RAGGIO_LUNA
RaggioCorrente=Raggio*(math.cos(Da_Lat*TO_RAD))
X=RaggioCorrente*(math.sin(Da_Long*TO_RAD))
Y=Raggio*math.sin(Da_Lat*TO_RAD)
Z=RaggioCorrente*math.cos(Da_Long*TO_RAD)
#Assegna le coordinate al vertice
Vertici.append((float(X),float(Y),float(Z)))
Da_Long = Da_Long+GRID_RES
Da_Long=tmpDa_Long
Da_Lat=Da_Lat-GRID_RES
 #Disegno i vertici
me=Mesh.New('Luna')
me.verts.extend(Vertici)
#Loop per creare le facce
for Linee in range(1,NumeroLinee):
for Punti in range(1, NumeroPunti):
v1=Punti+(Linee-1)*NumeroPunti
v2=v1-1
v3=v1+NumeroPunti-1
v4=v3+1
Facce.append((v1,v2,v3,v4))
me.faces.extend(Facce)


Scene.GetCurrent().objects.new(me,"Luna")
Blender.Redraw()
DatiAltezza=None


#Qui inizia il programma


#Leggo i dati dal file e li inserisco nell'array
DatiAltezza=LeggoFile("E:\Apollo 11\Mappa completa\LALT_GGT_MAP.IMG")


#I valori indicati qua rappresentano la zona che ci interessa disegnare
#Le latitudini vanno dalla piu' grande alla piu' piccola
#le longitudini vanno dalla piu' piccola alla piu' grande
DisegnaLuna(Lat(Linea(-30)),Lat(Linea(-50)),Long(Punto(340)),Long(Punto(360)))



Zona di atterraggio dell'Apollo 11 Confrontata con un'immagine reale da telescopio (qui il link all'originale della NASA)














Ciao
VB

Nessun commento:

Posta un commento