Carlos Calzada Grau Yazar hakk�nda: Bilgisayar bilimlerinde e�itim alm�� ve ilk Spectrum'dan beri bilgisayar grafikleriyle ilgili. Onun geli�me amac�n�n micro$oft'a ihtiya� duymamak olmas�ndan dolay� Linux'dan �ok zevk al�yorum. Benim di�er ekrandan ba��ms�z hobilerim bonsai'ler ve aquaria. ��erik: |
�zet:
Bu Renderman (I II ) hakk�ndaki serinin ���nc� makalesi, bu kez en �nemli konulardan birini tart��aca��z: "C" ve "C++" kullanarak bir sahneyi bi�imlendirme ve hareketlendirme imkan�.
�nceki iki makaleden anla��laca�� gibi, bir yaz� dosyas� yazarak do�rudan bir sahne yazma imkan� olmas�na ra�men, bu �ok s�k�c� bir i�tir. �rne�in, s��rayan bir topun hareketini anlatmak i�in bir".rib" dosyas� yazmay� g�z �n�nde bulundurun! Hayatlar�m�z� daha kolayla�t�rmak i�in "C" veya "C++" uygulamalar� yazma imkan�m�z var. Bu uygulamalar, sahne ve hareketi, ".rib" kod yaz�s�n� standart ��k��a g�nderen kullan�c�n�n tan�mlad��� fonksiyonlarda bi�imlendirir. UNIX borular� bize sonra olu�turulmu� Renderman buyruklar�n� do�rudan ba�ka bir y�nteme (rendrib, rendribv, rgl gibi) veya ".rib" dosyas�na g�ndermemize izin verir.
Blue Moon Rendering Tools 'u �nceki y�klememiz lib ve include adl� iki dizin yaratt�. Bunlar d�rt dosya i�erir ki �imdi sadece ikisiyle ilgilenece�iz: ri.h bir ba�l�k dosyas� ve librout.a de fonksiyon k�t�phanesi. Ba�l�k dosyas� /usr/local/include 'a ve libribout.a de /usr/local/lib 'a kopyalanmal�d�r( Tecr�beli okuyucular onlar� farkl� bir adrese y�klemeyi se�meliler). K�t�phanenin y�klnemesinden sonra �imdi ilk �rnek program�m�z� yazmaya haz�r�z.
�lk �rne�imiz Renderman programc�l���n�n temelini g�steriyor. Her C kodunda oldu�u gibi, k�t�phaneleri kullanmadan �nce yugun gelen ba�l�k dosyalar�n� yerle�tirmeliyiz ki bizim durumumuzda bu ri.h'd�r. Ayr�ca program�mz� k�t�phaneyle ba�lamal�y�z, ��yle ki:
gcc myprogram.c -o myprogram -lribout -lm
��te konsolda yazarak zaman kazand�ran bir Makefile �rne�i:
LIBS = -lm -lribout PROGNAME = primero all: $(PROGNAME) $(PROGNAME).o: $(PROGNAME).c gcc -c $(PROGNAME).c $(PROGNAME): $(PROGNAME).o gcc -o $(PROGNAME) $(PROGNAME).o $(LIBS) |
�lk �rne�imiz birka� koordinat ekseni ve merkezde bir top yaratt�, biz onu primero.colarak adland�raca��z, i�te kaynak kodu:
1 #include <stdio.h> 2 #include <math.h> 3 #include <ri.h> 4 5 void main(void) 6 { 7 int i; 8 int x,y,z; 9 int nf; 10 float slopex,slopey,slopez; 11 12 RtColor Rojo={1,0,0}; 13 RtColor Verde={0,1,0}; 14 RtColor Azul={0,0,1}; 15 RtColor Blanco={1,1,1}; 16 17 RtPoint p1={30,0,10}; /* Posicicion inicial de la pelota */ 18 RtPoint p2={0,20,10}; /* Posicion final de la pelota */ 19 20 RtPoint from={0,100,100}; /* Direccion de la luz */ 21 RtPoint to={0,0,0}; 22 23 char name[]="primero.tif"; 24 RtFloat fov=45; 25 RtFloat intensity1=0.1; 26 RtFloat intensity2=1.5; 27 RtInt init=0,end=1; 28 29 RiBegin(RI_NULL); 30 RiFormat(320,240,1); 31 RiPixelSamples(2,2); 32 RiShutter(0,1); 33 RiFrameBegin(1); 34 RiDisplay(name,"file","rgb",RI_NULL); 35 name[7]++; 36 RiProjection("perspective","fov",&fov,RI_NULL); 37 RiTranslate(0,-5,60); 38 RiRotate(-120,1,0,0); 39 RiRotate(25,0,0,1); 40 RiWorldBegin(); 41 RiLightSource("ambientlight","intensity",&intensity1,RI_NULL); 42 RiLightSource("distantlight","intensity",&intensity2,"from",from,"to",to,RI_NULL); 43 RiColor(Azul); 44 RiTransformBegin(); 45 RiCylinder(1,0,20,360,RI_NULL); 46 RiTranslate(0,0,20); 47 RiCone(2,2,360,RI_NULL); 48 RiTransformEnd(); 49 RiColor(Verde); 50 RiTransformBegin(); 51 RiRotate(-90,1,0,0); 52 RiCylinder(1,0,20,360,RI_NULL); 53 RiTranslate(0,0,20); 54 RiCone(2,2,360,RI_NULL); 55 RiTransformEnd(); 56 RiColor(Rojo); 57 RiTransformBegin(); 58 RiRotate(90,0,1,0); 59 RiCylinder(1,0,20,360,RI_NULL); 60 RiTranslate(0,0,20); 61 RiCone(2,2,360,RI_NULL); 62 RiTransformEnd(); 63 RiColor(Blanco); 64 RiSphere(5,-5,5,360,RI_NULL); 65 RiWorldEnd(); 66 RiFrameEnd(); 67 RiEnd(); 68 }; |
�lk �� sat�r temel include dosyalar�d�r. ��lerinden ri.h Renderman k�t�phnaesi i�in protoyip ba�l�kt�r. Her Renderman �a��r�m� kendisine e�it ri.h'�n i�inde C tarz�nda �a��r�ma sahiptir. , TransformBegin RiTransformBegin() fonksiyonuna uygun gelir, vb. make'i �al��t�rarak �al��abilir primero'yu yarat�n. �rne�imiz, yeni g�nderimle (primero > primero.rib) veya ��k��� do�rudan ba�ka bir i�leme (primero | rendrib) g�nderecek bir giri� dosyas� yaratmak i�in �al��t�r�labilir. Bu son durumda, rendrib g�r�nt�lenmi� bir dosyan�n primero.tif'in olu�turulmas�n�n g�revini al�r.:
K�t�phaneden fonksiyon �a��r�mlar� bir RiBegin(RI_NULL) ve bir RiEnd() �a��r�mlar� aras�nda �zetlenmelidir. RiBegin'e ge�en parametre tipik olarak RI_NULL 'dur. RIB'in ��k���n� standart ��k��a �mnlemek i�in the standard output we could pass the name of the output filename * ("myfile.rib") or even the name of a process (like rendrib) the executable will then pass the renderman commands to the renderer without creating an intermediate RIB file.
Bizim �rne�imizin kaynak kodu Renderman aray�z�ne uygulanm�� tipik C fonksiyonlar� ve talimatlar�na sahiptir: RtColor tipi k�rm�z�, ye�il ve mavi de�erleri (0.0 dan 1.0 de�i�en) �� tane reel say� de�erlerine sahip bir vekt�rd�r, sonra RtPoint bo�lukta bir yerle�imi tutar ve RtFloat ve RtInt s�ras�yla ger�el say� ve tamsay�d�rlar.
Sat�r 29 RiBegin(RI_NULL)'a bir �a��r�m i�erir ki biz daha �nce bahsetmi�tik, Renderman aray�z� i�in bir ba�lang�� �a��r�m�d�r. Bundan sonra a�a��daki kullan��l� buyruk fonksiyonlar� tipik bir RIB dosyas� olarak yaz�ld�. Kodu �al��t�rmay� deneyin ve ��k��� bir dosyaya (./primero > primero.rib), g�nderin. ��k�� ��yle olacakt�r:
##RenderMan RIB-Structure 1.0 version 3.03 Format 320 240 1 PixelSamples 2 2 Shutter 0 1 FrameBegin 1 Display "camara.tif" "file" "rgb" Projection "perspective" "fov" [45 ] Translate 0 -5 60 Rotate -120 1 0 0 Rotate 25 0 0 1 WorldBegin LightSource "ambientlight" 1 "intensity" [0.1 ] LightSource "distantlight" 2 "intensity" [1.5 ] "from" [0 100 100] "to" [0 0 0] Color [0 0 1] TransformBegin Cylinder 1 0 20 360 Translate 0 0 20 Cone 2 2 360 TransformEnd Color [0 1 0] TransformBegin Rotate -90 1 0 0 Cylinder 1 0 20 360 Translate 0 0 20 Cone 2 2 360 TransformEnd Color [1 0 0] TransformBegin Rotate 90 0 1 0 Cylinder 1 0 20 360 Translate 0 0 20 Cone 2 2 360 TransformEnd Color [1 1 1] Sphere 5 -5 5 360 WorldEnd FrameEnd |
�lk �rne�imiz �ok kullan��l� de�ildi. Farkl� bir sahne yaratmaak i�in benzer i�lemleri yerine getiren yeni bir program yazmal�y�z. K�t�phenelerin g�c� ger�ekte canland�r�mlar�n yap�m�ndad�r. �lk �rne�imizde sadece bir �er�eve yap�lm��t�, �imdi topun hareketini yapaca��z.
�kinci �rne�imizde sahnemiz yine �� koordiant ekseninde ve bir toptan meydana gelecek, fakat top bu sefer (30,0,10)'dan (0,20,10)'a hareket edecek ki bu bilgisayar ekran�nda sa�dan sola harekettir. Her iki yer de RtPoint yap�lar� (sat�r 18 ve 19) kullan�larak tan�mlanacakt�r. Canland�r�m i�in frames veya resimlerin say�s� nf de�i�keninde tan�mlan�r. Bu numaray� ve ba�takini ve final yerle�imlerinin birini kullanarak frame vas�tas�yla ad�mlar� �� y�nde (slopex, slopey ve slopez) hesaplanabilir. B�t�n bu bilgilere frame numaras�n� bir fonksiyonu gibi topun poz�syonunu nitelerken ihtiya� duyaca��z. 75'den 782e kadar ki sat�rlardaki TransformBegin/TransformEnd topun yerinin tan�mlanmas�na dikat eder. Her yeni yerle�im kolayca sat�r76'da hesaplan�r.
1 #include <stdio.h> 2 #include <math.h> 3 #include <ri.h> 4 #include "filename.h" 5 6 void main(void) 7 { 8 int i; 9 int x,y,z; 10 int nf; 11 float slopex,slopey,slopez; 12 13 RtColor Rojo={1,0,0}; 14 RtColor Verde={0,1,0}; 15 RtColor Azul={0,0,1}; 16 RtColor Blanco={1,1,1}; 17 18 RtPoint p1={30,0,10}; /* Posicicion inicial de la pelota */ 19 RtPoint p2={0,20,10}; /* Posicion final de la pelota */ 20 21 RtPoint from={0,100,100}; /* Direccion de la luz */ 22 RtPoint to={0,0,0}; 23 24 char base[]="camara_"; 25 char ext[]="tif"; 26 char name[50]; 27 RtFloat fov=45; 28 RtFloat intensity1=0.1; 29 RtFloat intensity2=1.5; 30 RtInt init=0,end=1; 31 32 nf=100; /* Numero de frames */ 33 slopex=(p2[0]-p1[0])/nf; 34 slopey=(p2[1]-p1[1])/nf; 35 slopez=(p2[2]-p1[2])/nf; 36 37 RiBegin(RI_NULL); 38 RiFormat(320,240,1); 39 RiPixelSamples(2,2); 40 RiShutter(0,1); 41 for (i=1;i <= nf;i++) 42 { 43 RiFrameBegin(i); 44 filename(base,ext,sizeof(base)+4,i-1,name); 45 RiDisplay(name,"file","rgb",RI_NULL); 46 name[7]++; 47 RiProjection("perspective","fov",&fov,RI_NULL); 48 RiTranslate(0,-5,60); 49 RiRotate(-120,1,0,0); 50 RiRotate(25,0,0,1); 51 RiWorldBegin(); 52 RiLightSource("ambientlight","intensity",&intensity1,RI_NULL); 53 RiLightSource("distantlight","intensity",&intensity2,"from",from,"to",to,RI_NULL); 54 RiColor(Azul); 55 RiTransformBegin(); 56 RiCylinder(1,0,20,360,RI_NULL); 57 RiTranslate(0,0,20); 58 RiCone(2,2,360,RI_NULL); 59 RiTransformEnd(); 60 RiColor(Verde); 61 RiTransformBegin(); 62 RiRotate(-90,1,0,0); 63 RiCylinder(1,0,20,360,RI_NULL); 64 RiTranslate(0,0,20); 65 RiCone(2,2,360,RI_NULL); 66 RiTransformEnd(); 67 RiColor(Rojo); 68 RiTransformBegin(); 69 RiRotate(90,0,1,0); 70 RiCylinder(1,0,20,360,RI_NULL); 71 RiTranslate(0,0,20); 72 RiCone(2,2,360,RI_NULL); 73 RiTransformEnd> |
�imdi ikinci �rne�imizi deneyelim: derleyelim ve �rne�in ��k��� rendribv'e g�ndererek �al��t�ral�m. Bu bizim canland�r�m�m�z� �abucak g�rmemizi sa�layan kolay bir y�ntemdir. rib ��k�� dosyas�n� s�namak i�in sadece standart �kk��� yeni bir dosyaya g�nderin. Okuyucu kontrol edebilir ki her sahne 100 kere (her �er�evede) tekrar etti�inden yarat�lm�� dosya ger�ekten b�y�kt�r (segundo.rib 70kb'a kar��l�k gelir.)
A�a��daki �ekil canland�r�mdaki orta d�zeydeki bir ka� �er�eveyi g�sterir:
Tabi ki istedi�imiz her nesneyi canland�rabiliriz: nesnelerin yerle�imleri, boyutlar�, �����n yo�unlu�u, kamera, nesneleri g�r�n�r ve g�r�nmez yapma, vb.
Son �rnekte tabandan s��rayan topun nas�l yap�laca��n� g�relim. �lk �nce rebote() (s��rama anlam�nda) fonksiyonunu tan�mlar�z ki bu fonksiyon �� parametre al�r: �u naki �er�eve numaras�, her s��ramadaki toplam �er�eve say�s� ve topun varaca�� en fazla y�kseklik. ��te kullan�m�
float rebote (int i, int nframes, int max) { float min, z; while (i > nframes) i-=nframes; min=sqrt(max); z=i-((float)nframes/2.0); z=(z*min)/((float)nframes/2.0); z=(float)max - (z*z); return(z); } |
Birka� kolay hesaplamalardan biri tipik parabola e�risini (y=x^2) �er�eveler'in say�s� istenen en fazla y�kseklikle �izimini yapmakt�r. A�a��daki �ekiller tercero.c program�yla her s��ramada yarat�lm�� birka� orta d�zey resimleri g�sterir. :
Canland�r�mlar� g�z �n�ne getirerek birka� canland�r�lm�� GIG dosyalar�n� uyguluyorum, xanim'le yava� �al��malar�na (en az�ndan Netscape alt�nda) ra�men onlar� kabul adilebilir bir h�zda g�rebiliriz.
Rectilinear hareket: segundo_anim.gif
Parabolik Hareket: tercero_anim.gif
Bu son �rnek Renderman ve onun programc�l���na C aray�z�n�n temellerinin sunumunun sonudur. En geli�mi� ve g�r�lmeye de�er programlama konusu g�lgeleme ba�l���d�r. Onlar, sahnenin final g�r�nt�s�n� sahne dokular�, ayd�nlatmalar�, vb. kontrol etmeye izin verirse, kontrol eder.
Yaz�n�n T�rk�eye g�nderilen asl�
�spanyolcad�r.
Miguel A Sepulveda taraf�ndan g�zden ge�irilip
d�zenlenmi�tir.
Webpages maintained by the LinuxFocus Editor team
© Carlos Calzada Grau LinuxFocus 1999 |