DATORGRAFIKLABORATION 3
KURVOR, YTOR, UTÖKAD REALISM
Demonstrationsuppgifter
Uppgift D1: Strålföljaren PovRay
Hämta hem PovRay (finns bland filerna). Kör bin/pvengine.exe. Testa att öppna och rendera något från objects/.
Alt+G för att rendera. Det här är en kraftigt reducerad version för att få ner filstorleken. Vill ni leka vidare
och få manual etc bör ni ta hem hela Povray från deras sida.
Uppgift D2: Textur och objekt
a) Om du vill ha bättre hum om belysning, kan köra Nates Tutorial lightmaterial.exe.
b) Om du vill ha bättre hum om texturkoordinater, kan du köra Nates Tutorial texture.exe.
c) OpenSceneGraph kan hämtas hem från filerna. Pga problem i datorsystemet kan endast de
med egna system installera det (eventuellt ordnas detta senare). Ett stort antal demon
kommer med.
Programmeringsuppgifter
Uppgift P1: B-splines enligt OpenGL respektive formel
Skriv ett program som först låter dig mata in ett antal punkter (bestämt eller godtyckligt begränsat antal;
bestäm själv, dock minst 8 st) och sedan visar upp motsvarande kubiska B-splinekurva. Därefter skall du kunna
ta tag i en styrpunkt, dra den till nytt läge varvid kurvan hela tiden skall hänga med (dubbelbuffring är
snabbt nog). Det kan vara bra att rita ut styrpolygonen också. Beräkningen skall göras dels enligt GLU, dels
enligt de formler som gåtts igenom i kursen (utan eller med rekursion). Strunta dock helt i ändpunktsproblemen
i det senare fallet, dvs använd bara den klockformade basfunktionen. Låt ditt koordinatsystem sammanfalla med
fönstrets (dvs använd glOrtho(0.0, width, 0.0, height, -0.1, 0.1)), så blir det lättast att identifiera vilken
styrpunkt ett mustryck avser. Utan rekursion skall du naturligtvis införa en funktion B(t) och en
annan B(i,t) (som B(t-ti)). Räkna gärna om dessa i onödan.
Uppgift P2: Textur på ett klot eller vad som faller dig in
Använd något program för att rita en 256x256 som textur. Använd sedan exempelvis ImageConverter (finns bland filer)
och spara om i PPM (P6, raw). Läs sedan i bilden till en textur. Vi tillhandahåller ppmimage bland filerna.
Lägg texturen på ett krökt objekt (förslag: på det roterande klotet i laboration 2). GLUT:s klot har inte
texturkoordinater men det har GLU:s (se beskrivning via hemsidan), som dock är något omständigare att hantera.
Därför kanske det kan vara enklast att lägga texturen på GLUT:s tekanna (se OpenGL-häftet, för vilken
texturkoordinater genereras automatiskt. Du kan ju börja med att lägga texturen på en kvadrat (i vilket fall du manuellt
sätter ut texturkoordinater).
Uppgift P3: Mer realistisk värld: Belysning och textur
Nu fortsätter vi på Lab 2.
Steg 1. Lägg till texturer i renderingen. Se till att marken ser ut som gräs eller vad som faller dig in.
Steg 2. Stoppa in normalerna för polygonerna när de ritas ut. Aktivera sedan ljussättning. För gräset kan
GL_MODULATE vara mer lämpligt än GL_DECAL (till glTexEnvf). Ni kan även testa att leka med ljusstyrka och
reflektion.
Uppgift P4: Modellering av rotationsvolymer med polygoner och NURBS
Rotationssymmetriska objekt är lätta att modellera. Man modellerar bara begränsningskurvan. Exempel på
sådana objekt är t ex betongrör och hattar. Vill man att materialegenskaperna skall variera tillkommer
förstås ytterligare moment. Grundplatta till ett program som ritar sådana objekt finns (rotsurf.zip);
allt du behöver göra är att implementera no_render(...), som ritar upp objektet. Den ska kunna
rita både en polygonyta och en NURBS-yta. För B-splines så ordnas normaler automatiskt,
för polygoner får du generera dem själv.
I RitaObjekt deklarerar du nödvändiga variabler för skarvar och styrpunktsmatriser. Använd i rotationsled
samma antal styrpunkter som längs den inmatade kurvan, så kan du använda samma skarvvektor för bägge
riktningarna. Du bör nog studera manualbladet för gluNurbsSurface (se utdelad OH).
Eftersom du inte använder fulländade NURBS blir
anslutningen i rotationsplanet en aning spetsig. Det får vi tåla.
Lämplig arbetsordning:
- Ta fram en formel för (x,y,z) för all punkterna när de roterats runt axeln. Detta blir så klart lite manuella transformationer. Kolla på den parametriska formeln för enhetscirkeln för att räkna ut hur ni får en massa punkter runt axeln.
- Ordna en loop som ritar en punkt för varje (x,y,z) ovan. Se till att den stämmer.
- Implementera nu polygonritning, ofyllda till att börja med.
- Räkna ut normalerna till polygonerna. Detta får ni får ni ta till matte för. Bry er inte om prestanda i det här steget. Aktivera ljus över fyllda polygoner, kolla om det ser vettigt ut. Gör det inte det kan det vara till hjälp att rita ut normalerna.
- Implementera nu NURBS; detta ska vara rätt lätt nu när ni har alla punkterna. Det som kan jävlas är att få till parametrarna rätt till OpenGL. Detaljstudera manualen om något ser fel ut.
Notera att djupbuffer inte är aktiverat, samt att gluProjection behöver justeras. I er egen formel kräver vi inte
att ni använder splines, även om det är lika lätt om ni vet vad ni ska göra.
Tips: Ni ska här alltså rotera en 2D-kurva runt en axel. Därför har ni alltså punkter på formen (x,y), vilket ni ser i strukturerna
som är definierade. När ni roterar runt axeln bör ni tolka dessa i stället som (radie, höjd). Ni måste alltså räkna ut (x,y,z) från dessa.
Hur? Tänk på enhetscirkeln. x=r cos(alpha), y=r sin(alpha). Nu vill ni sampla punkter på flera höjder i ringar och sedan ansluta
punkterna med polygoner på ett lämpligt sätt. Rita ut punkterna först om ni föredrar.
This is a personal www page. Opinions expressed here do not represent the official views of Chalmers University of Technology. Please refer to
Chalmers www policy.