Il “cuore” del calcolo viene fatto dentro uno script c#, perché serve un metodo iterativo per tracciare la traiettoria dei fotoni.
Tutto quello che è fuori da c# è la preparazione delle mesh colorate e posizionamento del “sensore” (un rettangolo con vettore normale ad esso).
Il primo script c# che avevo fatto era estremamente breve e semplice, e già funzionava bene.
Tutte le modifiche che ho fatto successivamente erano ottimizzazioni di velocità e precisione.
Banalmente si può rissumere così:
ogni “pixel” del sensore è un punto, da dove parte il fotone che inizialmente giace sul rettangolo/sensore
per ogni pixel/punto/fotone P c’è anche un vettore V: la direzione e velocità (c) con cui il fotone viene “sparato” dalla pellicola verso i bersagli (vettori tutti uguali in caso di vista parallela, diversi in caso di vista prospettica…), un colore C e una booleana L per definire se il fotone è ancora attivo. (opzionale anche una polilinea per creare il tracciato)
INIZIO ITERAZIONE (ad ogni iterazione è passato una quantità di tempo “t” dalla precedente)
(più t è piccolo e più è preciso e fedele il calcolo)
se L è vero, si proseque, altrimenti si salta questo ciclo
il fotone viaggia sempre a velocità costante, c. Il “trucco” che ho usato io è stato quello di comunque accelerare il fotone con la gravità per determinare la nuova direzione, ma subito dopo re-imposto la lunghezza del vettore a c. Per come ho lavorato io semplicemente ho fatto .Unitize(). In pratica 1=c.
calcolo la distanza D dal fotone al buco nero di massa M
calcolo la nuova accelerazione: a=M/(D^2)
aggiungo la nuova accelerazione alla velocità: V=V+a*t;
in questo momento la direzione è cambiata (quello che conta per noi), ma anche la velocità, e questo non va bene. Ecco il unitize: V.Unitize();
sposto il fotone nella nuova posizione: P=P+V*t;
verifico se il fotone è all’interno dell’orizzonte degli eventi del buco nero (C=nero) o se nell’ultimo movimento ha attraversato la mesh bersaglio colorata (C=colore intersezione con mesh), in tal caso si imposta L a falso, così da evitare di calcolarlo nuovamente
FINE ITERAZIONE
crei una mesh colorata usando l’array di colori creato
Il percorso potrebbe sembrare simile ad una normale orbita di un qualsiasi algoritmo di particelle + attrattori, ma in realtà è diverso perché la velocità della particella è costante.
La forma del percorso sembra cambiare al variare di t, ma in realtà è perché il calcolo risulta affidabile solo quando t è minuscolo. Serve che la traiettoria venga corretta ogni micro-istante. t grandi comportano un movimento troppo grossolano, la deviazione della gravità influisce meno, tardi, e questo genera una traiettoria esponenzialmente diversa.
(prova ad impostare t=0.0025 e dentro lo script n=10000… la forma della traiettoria si stabilizza.)
Ah, è da correggere l’orizzonte. Il raggio è uguale alla massa, non la radice…
Ho provato a ridurre l’errore considerando un punto “piu’ avanti” per il calcolo dell’attrazione, in teoria una specie di punto medio del tragitto del prossimo step.
Ho aggiunto meta’ dello spostamento considerando la velocita’ iniziale (approssimazione pesante, OK ).
Certo ci sono piu’ calcoli quindi il tempo richiesto aumenta …
Ammesso che non ci siano errori, non so se ne valga la pena … non ho fatto nessun confronto …
Eh, interessante.
Io non ho ancora provato a ottimizzare questo parte.
In effetti ridurre i cicli delle iterazioni o insomma raggiungere prima i bersagli è tutto tempo cpu risparmiato… farò delle prove anch’io…
alle volte mi sono chiesto se servisse passare tempo (molto tempo) dedicandole alle proprie passioni,
vedendo invece chi dopo le proprie ore di lavoro o dopo aver fatto il compitino assegnatogli chiude il pc,
e poi lo riaccende solo quando è necessario. poi si vedono queste cose e ritrovo la conferma che non
solo, dedicando del tempo a fare quello che piace, c’è modo di creare cose belle molto belle, ma
sono anche convinto che per quelli, restare a capire/risolvere un problema gli pesa troppo, pensano solo a staccare per poi riprendere e ri-iniziare la settimana dopo, queste cose non le riescono nemmeno a pensarle.
Il mio obiettivo era quello di “verificare” se le mie conoscenze da scuola superiore mi avrebbero permesso di ottenere una immagine simile a quelle già viste altrove (Tipo in Interstellar, il più famoso, ma erano già state fatte delle simulazioni con risultati simili decenni prima…).
La mia intenzione non era quella di ottenere l’effetto di un “render”, sapevo sin da subito che non avrei potuto usare materiali, trasparenze, ecc ecc… era più una “sfida matematica” a tempo perso.
Ad esempio, qui This Is The First Image Of A Supernova Predicted To Appear In The Sky | IFLScience , si vede come una serie di buchi neri crea una lente gravitazionale che permette di vedere allo stesso tempo la stessa galassia lontana ben tre volte. (Ognuna delle tre immagini ha una “età” diversa… e con questo gli scienziati sono riusciti a prevedere l’immagine del brillamento di una supernova…)
E, piacevolmente, con il mio script ho ottenuto risultati simili:
… qui, lo stesso buco nero è visibile 4 volte! (e quasi 6, altre 2 nascosto dietro gli altri dischi) … solo che per via della risoluzione della immagine si vede bene solo due volte…
Dato che non c’è un background o cielo da vedere, gli unici oggetti che si possono vedere sono i buchi neri stessi con i loro dischi… dovrei giocare ancora con questo script e aggiungerne funzionalità…
La base delle formule che ho usato è come detto sopra: ho reso unitaria la velocità della luce (c) e la costante gravitazionale (G) e questo ha fatto diventare semplice calcolare il raggio dell’orizzonte degli eventi, che diventa uguale alla massa del buco nero.
Il resto è un semplicissimo sistema particellare (come un normale simulatore di orbite, dove qui però non sono ellittiche) dove le particelle viaggiano a velocità costante, e restituiscono un colore nel momento intercettano uno dei bersagli o finiscono dentro un orizzonte…
complimentoni @RiccardoMajewski !
visto che lo sto vedendo subito dopo natale, penso questo sia l’esempio perfetto per passare da “a natale puoi” a “con Rhino puoi”…