<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <META NAME="GENERATOR" CONTENT="lfparser_2.52"> <META NAME="LFCATEGORY" CONTENT="Graphics"> <link rel="icon" href="../../common/images/lf-16.png" type="image/png"> <TITLE>lf42, Graphics: RenderMan</TITLE> <style type="text/css"> <!-- td.top {font-family: Arial,Geneva,Verdana,Helvetica,sans-serif; font-size:12 } pre { font-family:monospace,Courier } pre.code { font-family:monospace,Courier;background-color:#aedbe8; } p.cl { color:#EE9500 } table.left { margin-right:0.3cm } a.nodec { text-decoration:none } p.trans { font-size:8pt; text-align:right } p.clbox { width:50%; alignment:center; background-color:#FFD700; border-style:none; border-width:medium; border-color:#FFD700; padding:0.5cm; text-align:center } p.code { width:80%; alignment:center; background-color:#aedbe8; border-style:none; border-width:medium; border-color:#aedbe8; padding:0.1cm; text-align:left } p.foot { background-color:#AAAAAA; color:#FFFFFF; border-style:none; border-width:medium; border-color:#AAAAAA; padding:0.5cm ; margin-top:0.1cm; margin-right:1cm; margin-left:1cm; text-align:center } div.tbbutton { background: #ddd; border-right: 1px solid #aaa; border-bottom: 1px solid #aaa; margin: 2px 5px 2px 5px; text-align: center; width: 20em; line-height: 1.2em; padding: 2px; font-size: 12px; white-space: nowrap; color: #555; } div.bbutton { background: #ddd; border-right: 1px solid #aaa; border-bottom: 1px solid #aaa; float: left; margin: 2px 5px 2px 5px; text-align: center; line-height: 1.2em; padding: 2px; font-size: 12px; white-space: nowrap; color: #555; } --> </style> </HEAD> <BODY bgcolor="#ffffff" text="#000000"> <!-- this is generated html code. NEVER use this file for your translation work. Instead get the file with the same article number and .meta.shtml in its name. Translate this meta file and then use lfparser program to generate the final article --> <!-- lfparser can be obtained from http://main.linuxfocus.org/~guido/dev/lfparser.html --> <!-- this is used by a number of tools: =LF=AUTHOR: Carlos Calzada Grau =LF=CAT___: Graphics =LF=TITLE_: RenderMan =LF=NUMBER: 42 =LF=ANAME_: article42.shtml =LF=PARSER: 2.52 --> <!-- 2pdaIgnoreStart --> <!-- start navegation bar, old, style=1 --> <MAP name="top"> <AREA shape="rect" coords="367,9,418,30" href="../index.shtml"> <AREA shape="rect" coords="423,9,457,30" href="../map.html"> <AREA shape="rect" coords="463,9,508,30" href="../indice.html"> <AREA shape="rect" coords="514,9,558,30" href="../Search/index.html"> </MAP> <MAP name="bottom"> <AREA shape="rect" coords="78,0,163,15" href="../News/index.shtml"> <AREA shape="rect" coords="189,0,284,15" href="../Archives/index.html"> <AREA shape="rect" coords="319,0,395,15" href="../Links/index.html"> <AREA shape="rect" coords="436,0,523,15" href="../aboutus.html"> </MAP> <!-- IMAGE HEADER --> <CENTER> <IMG src="../../common/images/Topbar-nl.gif" width="600" height="40" border="0" alt="[Hoofd-balk]" ismap usemap="#top" ><BR> <IMG src="../../common/images/Bottombar-nl.gif" width="600" height="21" border="0" alt="[Voet-balk]" ismap usemap="#bottom"> </CENTER> <!-- stop navegation bar --> <!-- SSI_INFO --> <!-- tr_staticssi include virtual --> <!-- tr_staticssi exec cmd --> <!-- addedByLfdynahead ver 1.5 --><TABLE ALIGN="right" border=0><TR><TD ALIGN="right"><FONT SIZE="-1" FACE="Arial,Helvetica">Dit document is beschikbaar in: <A href="../../English/May1998/article42.html">English</a> <A href="../../Castellano/May1998/article42.html">Castellano</a> <A href="../../Deutsch/May1998/article42.html">Deutsch</a> <A href="../../Francais/May1998/article42.html">Francais</a> <A href="../../Nederlands/May1998/article42.shtml">Nederlands</a> <A href="../../Russian/May1998/article42.html">Russian</a> <A href="../../Turkce/May1998/article42.html">Turkce</a> </FONT></TD></TR></TABLE><br> <!-- SSI_INFO STOP --> <!-- 2pdaIgnoreStop --> <!-- SHORT_BIO_ABOUT_THE_AUTHOR_AND_INDEX_START --> <TABLE ALIGN="LEFT" BORDER="0" WIDTH="195" summary="about the author" class="left"> <TR> <TD> <img src="../../common/images/Carlos_C.gif" alt= "[Photo of the Author]" height="164" width="173"> <BR>door Carlos Calzada Grau <br> <small><ccgrau /at/ disca.upv.es></small> <BR><BR> <I>Over de auteur:</I><BR> <!-- aboutauthor_start --> <P> Afgestudeerd in computer wetenschappen en heb plezier met computer graphics sinds mijn eerste Spectrum. Ik ben erg enthousiast over Linux, de ontwikkelings-filosofie en alles dat niets te maken heeft met micro$oft. Andere niet-scherm gerelateerde hobbies zijn bonsais en aquaria. </P> <!-- aboutauthor_stop --> <!-- TRANSLATED_TO nl --> <BR><BR><I>Vertaald naar het Nederlands door:</I><BR> Guus Snijders <small><ghs(at)linuxfocus.org></small> <br> <!-- =LF=TRANSTO=nl: Guus Snijders --> <!-- TRANSLATED_TO_STOP --> <!-- INDEX_START --> <BR><i>Inhoud</i>: <UL> <LI><A HREF="#42lfindex0">Introductie</A></LI> <LI><A HREF="#42lfindex1">Installatie</A></LI> <LI><A HREF="#42lfindex2">Eerste Stappen</A></LI> <LI><A HREF="#42lfindex3">Conclusies</A></LI> </UL> </TD></TR></TABLE> <!-- INDEX_STOP --> <!-- SHORT_BIO_ABOUT_THE_AUTHOR_AND_INDEX_STOP --> <!-- HEAD_OF_THE_ARTICLE_START --> <br> <table border="0"><tr><td> <!-- tr_staticssi include virtual --> <!-- tr_staticssi exec cmd --> <!-- addedByLfPdf ver 0.1 --> <H2>RenderMan</H2> <img src="../../common/images/white.gif" alt="[Illustratie]" hspace="10" width="10" height="10"> <!-- ABSTRACT OF THE ARTICLE --> <P><i>Kort</i>: <P> <!-- articleabstract_start --> Dit is het eerste artikel in een serie over RenderMan. <!-- articleabstract_stop --> <br><!-- HR divider --><center><font color="#8282e0"><b>_________________ _________________ _________________</b></font></center><br> </td></tr></table> <!-- HEAD_OF_THE_ARTICLE_STOP --> <!-- BODY_OF_THE_ARTICLE_START --> <a name="intro"></a> <A NAME="42lfindex0"> </A> <H3><font color="#660033">Introductie</font></H3> Wie heeft er niet gehoord van <a href= "http://www.pixar.com" >Pixar</a>?, wie heeft de film <a href= "http://www.toystory.com">Toy Story</a> niet gezien?. Pixar Animation Studios reeds lang bekend door hun werk aan computer animaties. <i>Luxo Jr.</i> (1986) was de eerste film met 3d graphics die is genomineerd een Oscar, ook won deze meer dan 20 prijzen in internationale film festivals. <center> <img src="../../common/May1998/luxo.jpg" height="171" width= "180" hspace="10"> <img src="../../common/May1998/tt.jpg" height="152" width="180" hspace="10"> </center> <P>IN 1987 won <i>Red's Dream</i> verschillende prijzen op het "World Animation Festival" in Zagreb en het "San Francisco International Film Festival". </p> <p>De eerste animatie die een Oscar won, was <i>Tin Toy</i> (1998), Pixar ontwierp een model voor het gezicht van een baby met meer dan 40 spieren die door de animator werden bediend. </p> <center> <img src="../../common/May1998/red.jpg" height="157" width= "180" hspace="10"> <img src="../../common/May1998/kk.jpg" height="120" width="180" hspace="10"> </center> <p>In 1989 werd <i>Knick Knack</i> vertoond, dit was het verhaal van een sneeuwman die in een kristallen bol leeft. De film was in de eerste instantie geproduceerd voor 3D weergave, al werd er ook een normale versie uitgebracht. </p> <p>Kort daarna volgden een aantal successen zoals de recente film <i><a href="http://www.toystory.com">Toy Story</a>.</i> Dit is een van de eerste langere films die volledig geproduceerd is met computers. Op de homepage van <a href="http://www.pixar.com">Pixar</a> kunnen nog veel meer interessante dingen worden gevonden, zo wordt Toy Story 2 ergens in 1999 uitgebracht. </p> <p>Pixar ontwikkelde de interface "RenderMan" apart en onderhield "modelers" en "renderers" los daarvan. Een modeler is een tool die wordt gebruikt om scenes te tekenen, animaties te ontwerpen, enz. Het enige doel van een renderer is om de beschrijving van de modeler te nemen en deze te renderen met schaduwen, lichten, texturen, enz.. </p> <p>RenderMan laat 3D artiesten opgeven wat te renderen, maar niet hoe dat moet. In andere woorden, een modeler zou zich niets moeten aantrekken van de rendering stap. Zo kan een renderer die voldoet aan de standaard specificaties van RenderMan gebruik maken van Z-buffer, scan-line, ray-tracing, radiosity en een andere methode om de objecten te "tekenen", deze stap is onafhankelijk van RenderMan. Je kunt de interface van RenderMan zien als een formaat voor de beschrijving van scenes, op dezelfde manier als waarop PostScript een formaat is voor de beschrijving van pagina's. Deze standaard is niet afhankelijk van architecturen en besturingssystemen. </p> <center> <img src="../../common/May1998/pixar1.jpg" height="100" width="72"> <img src="../../common/May1998/pixar2.jpg" height="111" width="83"> <img src= "../../common/May1998/pixar3.jpg" height="126" width= "61"> <img src="../../common/May1998/pixar4.jpg" height="115" width= "61"> <img src="../../common/May1998/pixar5.jpg" height="90" width="53"> <img src="../../common/May1998/pixar6.jpg" height="95" width="75"> </center> <center> <i>De RenderMan@ Interface Procedures en RIP Protocol zijn:<br> Copyright 1988, 1989, Pixar.<br> Alle rechten voorbehouden.<br> Renderman@ is een geregistreerd handelsmerk van Pixar</i> </center> <p>In dit artikel proberen we een korte introductie in RenderMan te geven, hiervoor zullen we de <a href= "http://www.seas.gwu.edu/student/gritz/bmrt.html">Blue Moon Rendering Tools</a> van Larry Gritz gebruiken. Dit pakket is een renderer voor vrije distributie (alleen binaries en voor persoonlijk gebruik) en er zijn versies voor vele systemen, waaronder Linux (in feite was dit een van de eerste implementaties). Er wordt gebruik gemaakt van ray-tracing en radiosity en doet niet of nauwelijks onder voor een Fotorealistische RenderMan (PRMan), het commerciële product van Pixar. </p> <p>In het begin zijn het systeem van coördiaten voor de wereld en de camera gelijk, het zijn links-handige coördiaten-systemen (als Pov-Ray), met de origine in het midden van het scherm, de X-as naar rechts, de Y-as naar boven en de Z-as naar de binnenkant van het scherm. De volgende figuur laat de default camera zien (de X-as is rood, Y-as is groen en Z-as is blauw, voor de broncode, klik op de afbeelding). Een rechts-handig coördinaten-systeem is identiek maar dan wijst de Z-as in de andere richting. </p> <center> <a href="../../common/May1998/default_camera.rib"><img src= "../../common/May1998/default_camera.jpg" height="240" width= "320"></a> </center> <p>In Pov-Ray is het systeem van wereld coördinaten vast, dat wil zeggen dat men de camera door de wereld kan bewegen en objecten zetten met transformaties. In RenderMan geldt het tegenovergestelde, de camera is vast en wat wordt getransformeerd voor de verschillende gezichtspunten is het wereld-systeem van coördinaten. Dit alles zal duidelijker worden als we een voorbeeld "ontmantelen". </p> <p>RenderMan kent veel primitieven, voor object definities, lichten, enz... Nu gaan we een voorbeeld bekijken van het formaat van de bekenste cuadrics (NL:?), hoewel er ook andere zijn (zoals bezier patches, polygonen, ...).</p> <center> <table border="0" cols="2" width="100%"> <tr> <td><a href="../../common/May1998/disk.rib"><img src= "../../common/May1998/disk.jpg" height="240" width="320" align="LEFT"></a></td> <td><a href="../../common/May1998/cone.rib"><img src= "../../common/May1998/cone.jpg" height="240" width="320" align="LEFT"></a></td> </tr> <tr> <td> <i><b> Schijf </b> hoogte radius thetamax</i> <p><b> Disk </b> 5 10 300 </p> </td> <td> <i><b> Kegel</b> hoogte radius thetamax</i> <p> <b>Kegel </b> 15 10 300 </p> </td> </tr> </table> <table border="0" cols="2" width="100%"> <tr> <td><a href="../../common/May1998/cylinder.rib"><img src= "../../common/May1998/cylinder.jpg" height="240" width= "320" align="LEFT"></a></td> <td><a href="../../common/May1998/sphere.rib"><img src= "../../common/May1998/sphere.jpg" height="240" width= "320" align="LEFT"></a></td> </tr> <tr> <td> <i><b>Cylinder </b> radius zmin zmax thetamax</i> <p> <b>Cylinder</b> 10 -5 10 300 </p> </td> <td> <i><b> Bol </b> radius zmin zmax thetamax</i> <p> <b>Bol</b> 10 -4 8 300 </p> </td> </tr> </table> <table border="0" cols="2" width="100%"> <tr> <td><a href="../../common/May1998/torus.rib"><img src= "../../common/May1998/torus.jpg" height="240" width="320" align="LEFT"></a></td> <td><a href="../../common/May1998/paraboloid.rib"><img src="../../common/May1998/paraboloid.jpg" height="240" width="320" align="LEFT"></a></td> </tr> <tr> <td> <i><b>Donut</b> major rad min rad phimin phimax thetamax</i> <p> <b>Donut </b> 10 4 90 320 300 </p> </td> <td> <i><b>Paraboloid</b> radius zmin zmax thetamax</i> <p> <b>Paraboloid</b> 10 4 15 300 </p> </td> </tr> </table> <table border="0" cols="1"> <tr align="CENTER"> <td><a href="../../common/May1998/hyperboloid.rib"><img src="../../common/May1998/hyperboloid.jpg" height="240" width="320"></a></td> </tr> <tr align="CENTER"> <td> <i><b> Hyperboloid</b> point1 point2 thetamax</i> <p> <b>Hyperboloid</b> 0 10 -5 10 5 15 300 </p> </td> </tr> </table> </center> <p>De lezer heeft wellicht al gemerkt dat het formaat van sommige van deze primitieven niet echt gemakkelijk is, maar gelet op het feit dat het bestand RIB door een modeler als uitvoer moet worden gegeven, is dit formaat toepasselijk vanwege de doordachtheid en snelheid. <a name="instal"></a></p> <A NAME="42lfindex1"> </A> <H3><font color="#660033">Installatie</font></H3> Als eerste stap gaan we naar de homepage van <a href= "http://www.seas.gwu.edu">Blue Moon Rendering Tools</a> en downloaden we het programma. Op moment van schrijven was de huidige versie 2.3.6. Voor het uitpakken gaan we verder zoals gebruikelijk: <pre> rabit:~/$ gzip -d BMRT2.3.6.linux.tar.gz rabit:~/$ tar xvf BMRT2.3.6.linux.tar </pre> <p>Na het uitpakken van de tar-ball hebben we een nieuwe directory met de naam BMRT2.3.6 . Deze bevat de uitvoerbare bestanden (in <tt>bin/</tt>, de voorbeelden (in <tt>examples/</tt> en de documentatie in zowel PostScript asl HTML (onder <tt>doc/</tt>, ook is er een <tt>README</tt> bestand met aanvullende informatie over het programma. Lees het README bestand voor het installatie gedeelte, het is vrij simpel en zou niemand problemen moeten geven. <a name="pasos"></a></p> <A NAME="42lfindex2"> </A> <H3><font><font color="#660033">Eerste Stappen</font></font></H3> <p>Om bekend te worden met de RenderMan's specificaties, gaan we een typisch voorbeeld bekijken (<a href= "../../common/May1998/disptest.rib">disptest.rib</a>). De afbeelding is gegenereerd met het commando <tt>rendrib -v disptest.rib</tt> (klik op de afbeelding om hem in 1024x768 met <i>anti-aliasing</i> 2x2 te bekijken).</p> <p>Dit is een van de vele voorbeelden die gevonden kunnen worden in de <tt>examples</tt> directory van BMRT (Blue Moon Rendering Tools), de lezer zal waarschijnlijk kunnen waarderen dat het genereren niet lang duurt (als je met animaties gaat werken, zul je zien dat de bestanden behoorlijk gaan groeien).</p> <center> <a href="../../common/May1998/balls2h.jpg"><img src= "../../common/May1998/balls2.jpg" height="300" width="400"> </a> </center> <p>Er zijn verschillende executables onder <tt>bin/</tt>: <tt>rendrib</tt>, <tt>rendribv</tt> en <tt>rgl</tt>. <tt>Rendrib</tt> is de eigenlijke renderer, <tt>rendribv</tt> is vergelijkbaar maar rendert objecten in draad-mode, met alleen lijnen; <tt>rgl</tt> tenslotte rendert met behulp van polygonen. De laatste drie renders worden gebruikt voor de weergave van posities, animaties, enz.. Het uiteindelijke renderen gaat altijd met <tt>rendrib</tt>.</p> <p>Het formaat van het RIB bestand (Renderman Interface ByteStream) is erg simpel, hoewel niet minder krachtig. Ze worden opgeslagen als platte-tekst bestanden (net asl Pov-Ray). Een goed-geschreven RIB bestand bevat het volgende:</p> <ol> <li>Globale opties voor alle <i>frames</i> (resolutie, anti-aliasing, enz..)</li> <li><tt>FrameBegin</tt></li> <li>Initialisatie van de opties voor de grafische staat van een dergelijk frame (zoals de bestandsnaam voor uitvoer, detailniveau, enz...)</li> <li>Attributen van de grafische staat van het frame (zoals lichten, soort projectie, enz...)</li> <li><tt>WorldBegin</tt></li> <li>Modificaties van de grafische staat en declaraties voor de geometry van het eigenlijke frame. </li> <li><tt>WorldEnd</tt>. Met de volgende bij-effecten: het frame wordt gerenderd en opgeslagen, alle geometry- en lichtdeclaraties in (6) worden vernietigt, de grafische staat keert terug naar degene die bestaat in (5).</li> <li><tt>FrameEnd</tt>. Dit plaatst de grafische staat terug in zijn situatie in (2). </li> <li>De stappen (2) tot (8) worden herhaald in het geval van additionele frames. </li> </ol> <P>De grafische staat bevat alle informatie die nodig is om een primitief te renderen. Het bestaat uit twee delen: een globale die die constant blijft van primitieve naar primitieve en een huidige staat die met de primitieven veranderd. De parameters van de globale staat, zijn bekend als <i>opties</i> en de huidige staten worden <i>attributen</i> genoemd. </p> <P>Voor een beter begrip van opties en attributen en om een idee te hebben hoe scenes worden gespecificeerd met RenderMan, gaan we het voorbeeld regel voor regel bekijken. Dit zou een goede tutorial kunnen worden over wat er mogelijk is en hoe het doen. </p> <p class="code"> 1.- ##RenderMan RIB-Structure 1.0 <br> 2.- version 3.03 <br> 3.- <br> 4.- ########################### <br> 5.- # <br> 6.- # Dit RIB bestand demonstreert enkele complexere procedurele texturen. <br> 7.- # Twee ballen tonen het gebruik van "stucco" en "dented" misplaatsing shaders. <br> 8.- # De vloer toont de gmarbtile_polish shader, dit zijn gepolijste, groene <br> 9.- # marmeren tegels. Let op dat de reflectie via de aanroep van de trace() <br> 10.- # functie door de shader gaat, in plaats van reflectie mapping. <br> 11.- # <br> 12.- ########################### <br> 13.- <br> 14.- Option "searchpath" "shader" [".:../shaders:&"] <br> 15.- Display "balls2.tif" "file" "rgb" <br> 16.- Format 400 300 -1 <br> 17.- PixelSamples 1 1 <br> 18.- <br> 19.- Declare "prmanspecular" "integer" <br> 20.- Option "render" "prmanspecular" [0] <br> 21.- Projection "perspective" "fov" 35 <br> 22.- Translate 0 -0.55 8 <br> 23.- Rotate -110 1 0 0 <br> 24.- <br> 25.- <br> 26.- WorldBegin <br> 27.- <br> 28.- LightSource "ambientlight" 1 "intensity" 0.02 <br> 29.- <br> 30.- Declare "shadows" "string" <br> 31.- Attribute "light" "shadows" "on" <br> 32.- LightSource "distantlight" 1 "from" [0 1.5 4] "to" [0 0 0] "intensity" 0.6 <br> 33.- <br> 34.- AttributeBegin <br> 35.- Declare "txtscale" "float" <br> 36.- Declare "Kr" "float" <br> 37.- Declare "darkcolor" "color" <br> 38.- Declare "lightcolor" "color" <br> 39.- Declare "veincolor" "color" <br> 40.- Surface "gmarbtile_polish" "Ka" 1 "txtscale" 0.5 "Kr" .25 "Kd" 0.3 "Ks" 0.2 "roughness" 0.02 <br> 41.- Patch "bilinear" "P" [ -5 -5 0 5 -5 0 -5 5 0 5 5 0 ] <br> 42.- AttributeEnd <br> 43.- <br> 44.- AttributeBegin <br> 45.- Color [ .6 .6 .6 ] <br> 46.- Translate -1.5 0 1 <br> 47.- Surface "matte" <br> 48.- Declare "frequency" "float" <br> 49.- Declare "Km" "float" <br> 50.- Displacement "stucco" "frequency" 20 "Km" 0.3 <br> 51.- Sphere 1 -1 1 360 <br> 52.- AttributeEnd <br> 53.- <br> 54.- AttributeBegin <br> 55.- Translate 1.5 0 1 <br> 56.- Color 1 .45 .05 <br> 57.- Declare "Kr" "float" <br> 58.- Declare "Km" "float" <br> 59.- Surface "shiny" "Kd" 0 "Kr" 0.25 "roughness" 0.15 "specularcolor" [1 .5 .06] <br> 60.- Displacement "dented" "Km" 0.5 <br> 61.- Sphere 1 -1 1 360 <br> 62.- AttributeEnd <br> 63.- <br> 64.- WorldEnd <br> </p> <p>commentaren kunnen in het bestand worden opgenomen met het # symbool, zoals in regel 1 en de regels 4 tot 12. Een # symbool mag overal in het bestand voorkomen en ze mogen een volledige regel gebruiken (net als // commentaren in C++). Commentaren zijn handig wanneer deze bestanden met de hand worden bewerkt, omdat ze hulp bieden bij het begrijpen van de interne werkingen van de scene. </p> <p>Regel 2 laat een voorbeeld van de <i>version</i> directive zien. Deze declareert alleen de versie van de gebruikte interface (3.03); de meest recente versie is 3.1, uitgebracht in september 1989 (ja 1989, dit is geen vergissing), hoewel er revisies van Mei 1995 zijn. </p> <p>De directives <i>searchpath</i> en <i>shader</i> op regel 14 definiëren het pad voor de "shaders", dit zijn objecten die de renderer informeren hoe een bepaald object gerenderd moet worden (zoals een plastic, transparant, enz...), dit is een van de features die de interface erg krachtig maken, doordat de texturen van een object zich gedragen als plug-ins. Zo is het eenvoudig om nieuwe texturen, effecten,... te implementeren, zonder te wachten op een krachtiger versie van de renderer. Meestal is er een omgevingsvariabele (SHADER) die de locatie van deze bestanden aangeeft, vaak hoef je het pad dus niet expliciet op te geven. </p> <p>De <i>Display</i> optie verschijnt op regel 15. Deze declareert de bestandsnaam voor de uitvoer als <i>"balls2.tiff"</i> met als type <i>"file" "rgb"</i>, oftewel een RGB bestand. </p> <p>Op regel 16 definiëren we de resolutie voor het renderen (grootte van de afbeelding) met de <i>Display</i> opties. De resolutie van ons voorbeeld is 400x300, de -1 definieert de aspect ratio van de pixel (eigenlijk zou het +1 moeten zijn, ik weet niet zeker waarom ze hier -1 hebben gebruikt. </p> <p>Vervolgens komen de horizontale en verticale sampling voor iedere pixel, het aantal "rays" dat wordt gestart om een pixel te renderen. Een statement <I>PixelSamples 2 2 </i> wordt vertaald naar 4 rays per pixel, wat een geweldige kwaliteit voor de afbeelding opleverd (dit is de <i>anti-aliasing</i>), maar helaas duurt het renderen dan langer. In ons geval geeft een sampling van 1 x 1 = 1 een snellere rendering, maar slechts een ray per pixel. </p> <p>Regel 19 declareerd de <i>integer</i> variabele <i>prmanspecular</i>, eigenlijk wordt <i>prmanspecular</i> gedefinieerd als een token en zodra de renderer dit token tegenkomt, zal het het daaropvolgende nummer als een integer nemen. </p> <p><br> Vervolgens komt de declaratie van een 3D projectie, met de sleutel <i>"perspective"</i> vragen we om een perspectief projectie en <i>"fov 35"</i> stelt het weergave veld in op 35 graden. </p> <p>De regels 22 en 23 definiëren de positie van de camera. Eerst schrijven we een vertaling (translation), gevolgd door een rotatie. Maar omdat alle transformaties eerst op een stack worden geplaatst, is de eerste transformatie die wordt uitgevoerd, degene die het laatste op de stack is geplaatst, rotatie gevolgd door een vertaling (in dit geval worden de transformaties uitgevoerd zodra renderman het statement <i>WorldBegin</i> vindt). In dit voorbeeld roteerd het systeem -100 graden rond de X-as (om te roteren rond de Y-as gebruik je <i>Rotate 45 0 1 0</i>), vervolgens wordt het vertaald -0,55 eenheden langs de Y-as en 8 eenheden langs de Z-as. Let vooral op wat er wordt getransformeerd (geroteerd en vertaald) niet echt de camera is, maar het centrum van de wereld coördinaten (<em>opmerking van de Engelse vertaler</em> : OpenGL gebruikt exact hetzelfde schema voor transformaties). De volgende figuren laten verschillende stadia tijdens de twee transformaties zien. </p> <p></p> <center> <a href="../../common/May1998/default_camera.rib"><img src= "../../common/May1998/default_camera.jpg" height="240" width= "320"></a> <a href= "../../common/May1998/camara_pos1.rib"><img src= "../../common/May1998/camara_pos1.jpg" height="240" width= "320"></a> <a href= "../../common/May1998/camara_pos2.rib"><img src= "../../common/May1998/camara_pos2.jpg" height="240" width= "320"></a> </center> <p>Na de inleidende definities komt de scene zelf. Iedere scene (een declaratie van lichten, objecten, enz...) begint altijd met <tt>WorldBegin</tt> en eindigt met <tt>WorldEnd</tt> (regels 26 en 64, respectievelijk). De eerste paar regels in de scene van ons voorbeeld declareren de belichting (regel 28 tot 32); ieder licht heeft een nummer en in theorie moeten ze zich onderscheiden, de eerste is het omgevingslicht en heeft een intensiteit van 0,02. Na het belichten wordt de variabele <tt>shadows</tt> gedeclareerd als een karakter string en dan wordt de licht optie voor schaduwen geactiveerd. Regel 32 voegt een lichtbron van het type <tt>distantlight</tt> (een lichtbron die zich ver weg bevindt, zoals de zon) toe, weer met nummer 1: zoals eerder genoemd, zou de lichtbron anders moeten zijn (zeg 2), het werkt echter nog steeds omdat BMRT blijkbar de licht-nummering negeert, voor compatibiliteit (bijvoorbeeld met Pixar's PRMan) zouden we echter stricter moeten zijn met de interface. De intensiteit van de tweede lichtbron is gelijk aan de eerste (dit zijn algemene attributen) en de richtingsvector, gedefinieerd met <tt>from</tt> en <tt>to</tt>, stuurt de lichtbundels parallel, alsof het een lichtbron op afstand was. </p> <p>Nu hebben we de drie elementaire objecten die de scene vormen, ieder object is omsloten met een paar <tt>AtributeBegin</tt> en <tt>AttributeEnd</tt> omdat ieder zijn eigen karakteristieken heeft (zowel positie als uiterlijk). Als de positie de enige eigenschap was die van object tot object veranderde, zou een <tt>TransformBegin</tt> en <tt>TransformEnd</tt> volstaan. Het eerste object (regels 34 tot 42) is een patch, patches kunnen zijn: uniform of non-uniform, rationeel of niet-rationeel en bilinear of bicubic. (wat leidt tot <tt>Bezier</tt> en <tt>Bsplines</tt> patches) enz. (een boek over computer graphics helpt om deze features echt te begrijpen). In ons voorbeeld hebben we een bilineare patch met vier coördinaten <tt>(x,y,z)</tt> van punten. De textuur van het object wordt gerenderd met het statement <tt>Surface</tt>, het eerste object is een <tt>shader</tt> bestand en de volgende argumenten zijn specifiek voor iedere <tt>shader</tt>. In de volgende afbeelding zie je de resulterende scene:</p> <center> <img src="../../common/May1998/camara_parche.jpg" height= "240" width="320"> </center> <p>De regels 44 tot 52 definiëren meerdere objecten in de scene: een bol (regel 51), waarvan de kleur wordt opgegeven met de directive <tt>Color [R G B]</tt>. Deze bol wordt vertaald en krijgt een oppervlak-type <tt>matte</tt>, in het huidige geval. Vervolgens komt de belangrijkste feature van BMRT, de displacement (verplaatsing) <tt>shaders</tt>. Deze zijn vergelijkbaar met de <i>bump-maps</i> van Pov-Ray, behalve dat onder BMRT deze "bumps" niet gesimuleerd zijn, maar echt. Het laatste effect is dat het oppervlak en de grenzen van de bol ruw lijken. <tt>shaders</tt> voor verplaatsingen zijn vergelijkbaar met die voor texturen, declareer altijd als een naam voor een bepaald <tt>shader</tt>, gevolgd door zijn parameters. De specificatie van de bol is een beetje vreemd; eerst de radius, dan plaatsen de <tt>zmin</tt> en <tt>zmax</tt> de bol op de z-as (de waarden -1 en 1 zouden de bol intact laten, terwijl de waarden 0 en 1 hem doormidden zouden snijden), de laatste waarden zijn de graden die worden gedekt door de bol (360 is de volledige bol, 180 half, enz...) Hier is een afbeelding van de eerste bol in positie:</p> <center> <img src="../../common/May1998/camara_bola1.jpg" height="240" width="320"> </center> <p>het volgende object is vergelijkbaar met de eerste, op de verschillende textuur na en de verplaatsing karakteristieken, daarom zal ik de uitleg hier niet herhalen, laten we gewoon de code uitvoeren en kijken wat we krijgen:</p> <center> <img src="../../common/May1998/camara_bola2.jpg" height="240" width="320"> </center> <p>Dit maakt het bestand compleet. Op dit punt zou het duidelijk moeten zijn dat het ontwikkelen van scenes niet moeilijk is, hoewel een complexe scene of een animatie het bestand erg complex kunnen maken. Om dit voorkomen, volstaat een modeler die RenderMan ondersteund (vrijwel alle bekende modelers exporteren RIB bestanden), eventueel kun je de animatie in C programmeren. In de distributie van BMRT zit ook de <tt>include</tt> directory en de nodige libraries. Deze bevatten functies om het RIB bestand naar stdout (standaard uitvoer) te sturen. Beide methoden zijn volledig identiek: <tt>WorldBegin</tt> in een RIB bestand komt overeen met <tt>RiWorldBegin()</tt> in een C programma (om hier meer over te leren, zie <i>Renderman for Poets</i>, deze is te vinden in de <tt>doc/</tt> directory. <a name="conclu"></a></p> <A NAME="42lfindex3"> </A> <H3><font color="#660033">Conclusies</font></H3> De Renderman interface is erg krachtig, Toy Story is er zelfs mee gemaakt (met een modeler genaamd <i>marionet</i>). Op <a href="http://www.toystory.com">www.toystory.com</a> staan een aantal artikelen over de film en enkele andere dingen. De specificatie van de interface is te vinden op <a href= "http://giga.cps.unizar.es/prman/RISpec/index.html" >giga.cps.unizar.es</a>. Behalve de specificatie is er de handleiding voor PRMan (Pixar's renderer) en ook enkele <a href= "http://giga.cps.unizar.es">voorbeelden</a>. <p>In het volgende artikel gaan we een klein object modelleren, dit zullen we doen in C, zodat het later makkelijk geanimeerd kan worden en zo worden we gelijk een bekend met de library. Het kleine object voor de animatie zou de Linux pinguïn kunnen zijn, of Bill Gates (of beide en laten we de pinguïn de andere roosteren... :)</p> :)</p> <hr size="2" noshade> <b>Voor meer informatie:</b> <ul> <li>Andere artikelen in deze uitgave: <a href= "article35.shtml">MindsEye: 3D Modeling</a>, <a href= "article48.shtml">Pov-Ray: Basic Notions</a></li> <li>Andere artikelen in eerdere uitgaven: <a href= "../March1998/article30.html">POV-Ray: First Steps</a><br> </li> <li>Homepage van BMRT <a href= "http://www.seas.gwu.edu/student/gritz/bmrt.html" >http://www.seas.gwu.edu/student/gritz/bmrt.html</a></li> <li>RenderMan Repository <a href= "http://rmr.spinne.com/">http://rmr.spinne.com/</a></li> <li>Pixar <a href= "http://www.pixar.com/">http://www.pixar.com/</a></li> <li>GIGA (Grupo de Informatica Grafica Avanzada) <a href= "http://giga.cps.unizar.es/prman/" >http://giga.cps.unizar.es/prman/</a></li> <li>Homepage van Toy Story <a href= "http://www.toystory.com/ ">http://www.toystory.com/</a><br> </li> <li>RenderMan cursus in PDF: <a href= "http://rmr.spinne.com/KessonPDF/index.html" >http://rmr.spinne.com/KessonPDF/index.html</a></li> </ul> <!-- vim: set sw=2 ts=2 et tw=74: --> <!-- BODY_OF_THE_ARTICLE_STOP --> <!-- 2pdaIgnoreStart --> <br clear="all"> <HR size="2" noshade> <table width="250" border=0><tr><td> <div class="bbutton"><a class="nodec" href="../../index.shtml"><--, LF Home</a></div> </td><td> <div class="bbutton"><a class="nodec" href="index.html">Terug naar de titelpagina van dit nummer</a></div> </td></tr></table> <br clear="all"> <HR size="2" noshade> <!-- ARTICLE FOOT --> <CENTER><TABLE WIDTH="98%" summary="footer"> <TR><TD ALIGN=CENTER BGCOLOR="#bdc6d5" WIDTH="50%"> <A HREF="../../common/lfteam.html">Site onderhouden door het LinuxFocus editors team</A> <BR><FONT COLOR="#1111aa"><a href="../../common/copy.html">© Carlos Calzada Grau</a>, FDL<br><a href="http://www.linuxfocus.org">http://www.LinuxFocus.org</a></FONT> </TD> <TD BGCOLOR="#bdc6d5"> <!-- TRANSLATION INFO --> <font size=2>Vertaling info:</font> <TABLE summary="translators"> <tr><td><font size="2">es --> -- : Carlos Calzada Grau <small><ccgrau /at/ disca.upv.es></small></font></td></tr> <tr><td><font size="2">es --> en: Miguel Angel Sepulveda <sepulveda /at/ linuxfocus.org></font></td></tr> <tr><td><font size="2">en --> nl: Guus Snijders <ghs(at)linuxfocus.org></font></td></tr> </TABLE> </TD> </TR></TABLE></CENTER> <p><font size=1>2005-04-16, generated by lfparser version 2.52</font></p> <!-- 2pdaIgnoreStop --> </BODY> </HTML>