Archive

Posts Tagged ‘Graphics Gems’

minray – Der Raytracer auf der Visitenkarte

May 31st, 2009 No comments

In der Buchreihe “Graphic Gems” aus den frühen Neunzigern findet sich auch heute noch so mancher interessante und nützliche Artikel. Weniger nützlich, dafür unterhaltsam ist ein Wettbewerb deren Resultate im vierten Buch der Reihe veröffentlicht wurde: Es ging darum, einen möglichst kleinen Raytracer zu schreiben. Klein bedeutet hier, dass der Quellcode aus möglichst wenig Token bestehen sollte (im Gegensatz zur Demoszene, bei denen versucht wird, eine möglichst kleine Executable zu zaubern).

Eine Lösung war klein genug, um sie auf die Rückseite einer Visitenkarte zu drucken:

typedef struct{double x,y,z}vec;vec U,black,amb={.02,.02,.02};struct sphere{
vec cen,color;double rad,kd,ks,kt,kl,ir}*s,*best,sph[]={0.,6.,.5,1.,1.,1.,.9,
.05,.2,.85,0.,1.7,-1.,8.,-.5,1.,.5,.2,1.,.7,.3,0.,.05,1.2,1.,8.,-.5,.1,.8,.8,
1.,.3,.7,0.,0.,1.2,3.,-6.,15.,1.,.8,1.,7.,0.,0.,0.,.6,1.5,-3.,-3.,12.,.8,1.,
1.,5.,0.,0.,0.,.5,1.5,};yx;double u,b,tmin,sqrt(),tan();double vdot(A,B)vec A
,B;{return A.x*B.x+A.y*B.y+A.z*B.z;}vec vcomb(a,A,B)double a;vec A,B;{B.x+=a*
A.x;B.y+=a*A.y;B.z+=a*A.z;return B;}vec vunit(A)vec A;{return vcomb(1./sqrt(
vdot(A,A)),A,black);}struct sphere*intersect(P,D)vec P,D;{best=0;tmin=1e30;s=
sph+5;while(s–>sph)b=vdot(D,U=vcomb(-1.,P,s->cen)),u=b*b-vdot(U,U)+s->rad*s
->rad,u=u>0?sqrt(u):1e31,u=b-u>1e-7?b-u:b+u,tmin=u>=1e-7&&u<tmin?best=s,u:
tmin;return best;}vec trace(level,P,D)vec P,D;{double d,eta,e;vec N,color;
struct sphere*s,*l;if(!level–)return black;if(s=intersect(P,D));else return
amb;color=amb;eta=s->ir;d= -vdot(D,N=vunit(vcomb(-1.,P=vcomb(tmin,D,P),s->cen
)));if(d<0)N=vcomb(-1.,N,black),eta=1/eta,d= -d;l=sph+5;while(l–>sph)if((e=l
->kl*vdot(N,U=vunit(vcomb(-1.,P,l->cen))))>0&&intersect(P,U)==l)color=vcomb(e
,l->color,color);U=s->color;color.x*=U.x;color.y*=U.y;color.z*=U.z;e=1-eta*
eta*(1-d*d);return vcomb(s->kt,e>0?trace(level,P,vcomb(eta,D,vcomb(eta*d-sqrt
(e),N,black))):black,vcomb(s->ks,trace(level,P,vcomb(2*d,N,D)),vcomb(s->kd,
color,vcomb(s->kl,U,black))));}main(){printf(“%d %dn”,32,32);while(yx<32*32)
U.x=yx%32-32/2,U.z=32/2-yx++/32,U.y=32/2/tan(25/114.5915590261),U=vcomb(255.,
trace(3,black,vunit(U)),black),printf(“%.0f %.0f %.0fn”,U);}/*minray!*/

Aber wie das resultierende Bild aus? Im Buch findet sich keine Abbildung. Also schnell den Quellcode ergoogelt (er wird zwar beim Buch mitgeliefert, allerdings nur auf Floppy), ein paar Anpassungen, damit der gcc den Code sauber übersetzt und zu guter letzt noch eben die Ausgabe so abgeändert, dass eine ppm Datei erstellt wird.

Und so sieht das 32*32 Pixel Bildchen dann aus:

Geraytraced mit minray aus den Graphics Gems.

Da man heutzutage dem PC etwas mehr Rechenarbeit zumuten darf, hier noch einmal in einer besseren Auflösung:

Geraytraced mit minray aus den Graphics Gems IV.

Geraytraced mit minray aus den Graphics Gems.

Wer selbst einmal mit dem Code spielen will findet ihn übrigens auf der Webseite zum Buch.

Categories: deutsch Tags: , ,

Catchable fatal error: Object of class stdClass could not be converted to string in /homepages/36/d405284044/htdocs/jrmblog/wp-content/plugins/wp-slimstat/wp-slimstat.php on line 1007