Solida texturer och stokastiska funktioner av Jonas Yngvesson I den lilla miniserien om datorgrafik tŠnkte jag den hŠr gangen prata orn en ny typ av texturmappning som hittades p fšr nagra Âr sedan. I fdrbifarten kan jag tala om att ardkeln om ray-tracing i fšrra numret, nu orks har publicer ts i SIGGRAD~bullednen (skryt skryt) (SIGGRAD = Svenska intressegruppen fšr grafisk databehandling). NÂja, till Šmnet. LÂt er inte skrŠmrnas av dteln om ni tycker det lÂter tungt, det hela Šr faktiskt ganska enkdt (och kul). Solidll texturer Vid vanlig texturmappning lŠgger man en tvadimensionell te~tur ov´ ytan av ett tredimensionellt objeh. Man lÂter tv koordinater, u och v, (oftast me¸an 0 och 1) fšrknippas med varje punkt pa objelrtet och nŠr man fŠrgsŠtter s anvÂnd´ man u och v som index i en tabell som innehaller texturen. Texturen kan vara en inscannad bild t ex. Man kan ocksa skicka u och v dll en funkdon som returnerar en fŠrgv~rde, dll exempel en fraktal. Problemet med denna metod lir att da Šr vŠldigt besvŠrligt att f u och v att ligga pa ett vetdgt sŠtt. Ofta blir texturen vŠldigt hoptryckt ell´ fšrvrŠngd om objektets yta Šr komplicerad med mycket krškar och veck (pipen orh handtaga p en tekanna t ex). En annat problem Šr att f naturliga švergÂngar vid kanter av objektet. Orn man fšrsšker gšra nÂgot som ska se ut som om det Šr gjort i trÂ, vill man ju gŠrna att Âdringen ska stŠmma šver kanterna. Lšsningen Šr bÂde enkel, elegant och egentligen rŠtt sjŠlvklar: Man lÂt´ helt enkelt texturen vara definierad i tre dimensioner den ocksÂ. Som index dll texturen tar man helt enkelt x-, y- och z-lŠget fšr punkterna p objektet. Objektet kommer att se ut som om det var "skulpterat" ur texturen, p~fekt fšr trŠe~cempld m a o. Om man gšr hÂl i objektet kommer texturen att stŠmma Šven i ttytann. Man mÂste dock vata lite fšrsiktig nŠr man vŠljer texturindex. Man Wr inte anvŠnda ~, y och z i "vŠrldskootdinater", det medfšr nŠmligen att om man roterar dler flyttar objektet kommet texturen p dess yta att Šndras. Den ligg´ liksom kvar fastŠn objelctet ayttar p sig. Det kan i och fšr sig vara en lustig effekt men det Šr oftast inte det man vill ha. BŠttre Šr att anvŠnda nÂgot lokalt koordinatsystem fšr objektet som "fšljer med" d objekte~ ršr sig. Den hŠr tcxturmetoden lšser fšrstÂs bara de fall d man vill ge intryck av att saker Šr tillverkade i en visst material. Vill man "klistta" ett foto av nÂgon runt nÂgonting, en tekanna t ex, fÂr man st ut med den gamla metoden. Man kan dock projicera en bild p en objekt genom aU strunta i en dimesion av texturindex, exempelvis z, och bara ta x och y som vanligt tvÂdimensionellt texturindex. Man kan se den tvÂdimensionella texturen som "utdragen" till en tredimensionell textur med samma vÂrde fšt alla z. Denna projekdon blir oberoende av hur ytan ser ut men kan inte g tunt om ett objekt. Stokastiska funktioner Nu till en rolig tillŠmpning p solida texturer. Precis som i fallet med 2d-textur kan man ju antopa en funktion med texturindex som argument och f ett vŠrde tillbaka. Faktum Št att det vanligen Šr s man gšr eftersom en tredimesionell texturtabell ~ar enormt mycket minne. Vi definierar nu noise() som Šr en (hÂll i er) skalŠrvŠrd stokasÂsk funktion som tar en tredimensionell vektor som argument och har följande egenskaper: « Statistisk invarians under rotation. « Starkt bandbegränsad i frekvens. « Statistisk invarians under translation. Vad det betyder (ungefär) är att om man skickar x, y och z till den här funktionen s¬ f¬r man tillbaka en slumptal, men skickar man tv¬ närliggande x, y, z punkter s¬ f¬r man ocks¬ tv¬ närliggande slumptal. Vi antar ocks¬ att vi har Dnoise() som är "derivatan" av noise() och som returnerar en tredimensionell vektor (gradienten i x-, y-och z-led). Hur man egentligen implementerar dessa funktioner kan vi strunta i. Om vi nu bestämmer färgen p¬ ett objekt genom att ta färg = grundfärg ~ noise(x, y, z); i varje punkt kommer vi att f¬ ett alldeles fläckigt objekt. Genom att leka med noise() p¬ olika sätt kan man f¬ massor med roliga effekter. Man kan till exempel l¬ta olika intervall av värdet fr¬n noise() motsvara olika färger och p¬ det viset f¬ objekt med osannolika mönster p¬. Nästan lika kul är det att leka med Dnoise(). Cenom att till exempel lägga till det retumerade värdet till objektets ytnormal: normal += Dnoise(x, y, z); i varje punkt kommer vi att f¬ en yta som ser knölig ut, som ett apelsinskal ungefar (förutsatt att vi använder normalen hos objektet när vi beräknar hur Ijust det ska vara först¬s). Om man sedan använder noise() för att bestämma när och hur mycket av Dnoise() som vi ska lägga till normalen kan vi simulera en mängd olika ytor. Det finns en massa mer som man kan göra med noise() och Dnoise(). En liten funktion som simulerar turbulent flöde t ex. Sedan kan vi ganska enkelt simulera s¬ skilda saker som marmor, eld och v¬gor p¬ vatten. För mer detaljerade beskrivningar, t ex av implementationer s¬ rekommederas foljande läsning: "Solid Texturing of Complex Surfaces" av Dar vyn R. Peachey och "An Image Synthesizer" av Ken Pedin B¬da dessa finns i SIGGRAPH Conference Proceedings 1985. Om n¬gon vill se fler exempel p¬ välkommentill mig. implementadoner och resultat är han/hon