Home   Map   Index   Search   News   Archives   Links   About LF
  [Top bar]
  [Bottom bar]
[Photo of the Author]
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:

      
  1. Giri�
  2.   
  3. Kolay sahne:
  4.   
  5. Rectilinear hareket:
  6.   
  7. Parabolik hareket:
  8.   
  9. Referanslar

Renderman III

�eviri: Kadriye �zt�rk

[Ilustration]

�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�.



       

Giri�

      

      �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.  

       

Kolay Sahne:

      

             �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.       

             

Rectilinear Hareket:

      

      �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>

Transfer interrupted!

TransformBegin(); 76 RiTranslate(p1[0]+slopex*(i-1),p1[1]+slopey*(i-1),p1[2]+slopez*(i-1)); 77 RiSphere(5,-5,5,360,RI_NULL); 78     RiTransformEnd(); 79   RiWorldEnd(); 80 RiFrameEnd(); 81 } 82  RiEnd(); 83 };
  
  
             

      �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.  

       

Parabolik Hareket:

         

      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.              

Referanslar

                           
      
             

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