RAYTRACING, COME GODO :-)
Corso di Ray-Tracing per principianti
Parte 3/7

                                   di Alfonso Martone (alfmar)

Abbiamo parlato  nei precedenti  articoli di  un po'  di tutto
tranne  che del linguaggio... prima di passare definitivamente
al linguaggio  di POVray, vorrei fare  un paio di osservazioni
per far passare  un po' di  paura a quelli  che cominciano con
"ma io non so compilare".

Il dramma di tutti i  programmi  forniti  in  sorgente  e'  il
tremendo  "errore durante la compilazione" perche' compilatori
diversi  hanno   abitudini  (ottimizzazioni,   standard,  etc)
diverse.

POV per fortuna  non e' cosi'.  Due anni fa  lo compilai sotto
DOS (con il Borland C++  2.0)  senza  problemi;  uscirono  una
marea di "Warning:..." a video,  ma  mi  genero'  l'EXE  senza
troppa fatica.
Stessa cosa per Linux  e Gnu  C/C++ (GCC  2.6.3 e  GCC 2.5.8),
anzi  qui ricordo di aver avuto  neppure un warning, segno che
POV e' stato scritto in  C  "puro  e  semplice",  senza  usare
stranezze  che vanno bene su un determinato compilatore e male
su tutti gli altri - come aneddoto racconto sempre che il MASM
5.1 della Microsoft era talmente bacato da costringere il team
TASM  della Borland  ad implementare  un comando  "MASM51" che
emulava gli stessi bug :-).
Il guaio e' che non si tratta di un aneddoto ma della verita'!

Dicevo: *facile* da compilare.
Basta  masticare un minimo di inglese  e saper editare un file
ascii   -  non  serve  nessuna  modifica  al  codice,  neppure
ridefinire qualche #include file di configurazione. 
Basta  solo rinominare  unixconf.h in  config.h e  lanciare il
makefile adatto (rinominare unix.mak in Makefile).
Basta  ovviamente avere  compilatore e  librerie su  disco, il
compilatore dopo non serve piu' e quindi potete pure buttarlo.
Se qualcuno avesse  *davvero* problemi,  posso fornire  il mio
eseguibile o al  limite ricompilarlo  io (sempre  pero' quello
sotto Linux, per  il  DOS  non  ho  da  tempo  un  compilatore
decente, ci potro' provare quando ce l'avro').

Qualcuno   si  potra'  lagnare  che  l'interfaccia  utente  e'
testuale, ma per un programma che vi costa 5 secondi lanciarlo
e ore e ore  (quando  non  giorni  e  giorni)  di  attesa  per
l'output,  chiedere qualcosa piu' di tanto e' come chiedere di
sprecare   risorse  senza  motivo...  cercatevi  piuttosto  un
programma che visualizzi bene  le  schermate  in  truecolor  o
perlomeno a 32000 colori, che e' la cosa piu' importante.

Veniamo finalmente al linguaggetto di POV (era ora).
Il manuale e' abbastanza chiaro (e qui potrei pure smettere di
scrivere), pero' io non mi sono mai fidato troppo dei manuali,
per cui  vediamo direttamente "su strada"  come si comporta, e
poi ci andiamo a guardare pure il manuale per vedere cos'altro
si puo' fare.
Citero' spesso  i file di  #include (colors.inc, textures.inc,
etc) perche'  contengono un sacco  di roba gia'  pronta e gia'
tarata   al  millimetro,  il  che  ci  risparmiera'  prove  ed
esperimenti (per esempio gia'  possiamo  definire  oggetti  di
"vetro",  "bronzo", "marmo",  "legno", etc  - chi  non mastica
l'inglese si procuri  un  dizionarietto  perche'  parlero'  di
"glass", "wood", etc).

Dicevamo del primo esempio:

  #include "colors.inc"
  camera  {   location <0, 2, -3>    look_at <0, 1, 2>   }
  sphere  {   <0, 1, 2>, 2   texture {  Bronze_Texture  }   }
  light_source  {  <2, 4, -3>  color White }

I primi esperimenti che possiamo fare su questo sono...

-  spostare la telecamera piu' dietro: vedremo la pallina piu'
piccola,    provate a mettere la telecamera a <0, 2, -10> (
unita' in meno sull'asse delle z, cioe' telecamera spostata
dal  video verso di noi): vedrete  la pallina con il raggio
ridotto  a circa meta'; con un po' di conti (che per motivi
di  sonno non vi  faccio :-) scopriremo  che e' esattamente
quello che  doveva succedere  perche' abbiamo  aumentato la
distanza della telecamera dal centro della sfera (prima era
5, cioe' da -3 a +2, dopo era 12, cioe' da -10 a +2, dunque
circa il doppio  della distanza  diventa circa  meta' della
grandezza);

-  colorazione (intendo "texture") - al posto della
Bronze_Texture, proviamo qualcuna a caso, tipo:White_Marble
un marmo bianco/grigio/nero delizioso Pinkalabaster pare un
marmo sgrigiato, come i piani di lavoro delle cucine 

DMFWood1       legno scuro, che delizia 
Glass          vetro, trasparente ma non troppo
Brass_Valley   metallico con sfumature, pare materia grezza

Per motivi di fretta ho provato solo Brass_Valley e Glass.
Nel  primo caso ci appare una  specie di pianetoide con una
colorazione  difficile da descrivere (intorno al marmoreo),
che  dal modo in cui riflette  la luce ci sembra metallico.
Nel secondo caso, sorpresa! Il vetro lascia passare la luce
e si vedono  solo gli "spicchi"  di luce sopra  e sotto (e'
l'effetto "phong"  che vedremo nei  prossimi articoli); per
il   resto   e'   vetro   purissimo,   dunque   odiosamente
trasparente, la luce si perde nel vuoto e rimane un po' nei
due  punti (agli antipodi tra loro)  e sul bordo esterno in
alto a destra.
Provare per credere!

-  cambiare la posizione o il colore della luce.
Questo non lo faccio perche' sto morendo di sonno, fatelo
voi come "compiti per casa":-)
Nel prossimo articolo scrivo un altro messaggio, stavolta
parleremo di altri oggetti perche' di sfere ne abbiamo le
tasche piene :-)