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:
  1. 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.
  2. Ordna en loop som ritar en punkt för varje (x,y,z) ovan. Se till att den stämmer.
  3. Implementera nu polygonritning, ofyllda till att börja med.
  4. 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.
  5. 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.