Eksamen desember 1988
Eksamen Grafisk databehandling 17. desember 1998, kl 0900 - 1300
Alle skrevne og trykte hjelpemidler tillatt
Dersom du finner noe uklart i oppgaveteksten så gjør dine egne forutsetninger og redegjør for disse.
Det blir spurt om programkode i oppgavesettet. Det er viktig å konsentrere seg om den koden det spørres etter. All kode som er nødvendig for å sette opp vinduer eller etablere grafiske tegneomgivelser etc. er irrelevant og det er ikke hensiktsmessig å bruke tid på dette. Dersom du er i tvil om hvor mye du skal ta med, så redegjør for den beslutningen du treffer.
Programskissene i besvarelsene nedenfor er skrevet i Visual C++. For oppgave 1a), 1b) og 1c) vil løsningene bli svært likeartede i c/glut eller java/magician. For oppgave 1d) vil andre løsninger være enklere i c/glut og java/magician.
Oppgave 2 er helt uavhengig av verktøy.
Oppgave 1 (80%)
Det skal lages scener til en animert film. Oppgaven med å framstille en scene i filmen er delt opp på mange programmerere. Det skal, blant mye annet, inngå en enkel bane der det skal gå vogner. I det endelige produktet skal denne banen inngå i en stor scene med bygninger, veier, terrengmodeller etc. Din oppgave er å lage et første, grovt utkast til banen med noe tilbehør. For at de funksjonene du skriver skal passe inn i helheten er følgende oppgitt som rammer:
- Du skal forholde deg til et referansepunkt (REF_X, REF_Y, REF_Z) som er plassert i senteret i den ene halvsirkelen i banen.
- Banen skal tegnes parallelt x,y-planet, med z-aksen opp, og banens lengderetning langs x-aksen
- Banen består av to halvsirkler og to rette langsider. Langsidene på banen har lengde TRAIL_L, de to halvsirkelenes radius er TRAIL_R. Banen skal ha en bredde TRAIL_B.
- Selve banen skal tegnes som to streker.
Oppgave 1a
Skriv en funksjonen void DrawTrail() som tegner ut de to parallelle sporene som utgjør selve banen.
Oppgave 1b
Skriv funksjonen void DrawCart(float s) som tegner ut en kule på banen. Parameteren s angir avstanden fra startpunktet, kulas posisjon på tegningen over, i en bevegelse med klokka. Kula skal ha radius 2*TRAIL_B.
Oppgave 1c
Skriv funksjonen void DrawTunnel(), som tegner ut en tunnel i form av en halv sylinder med lengde TRAIL_L/2 plassert midt på den ene langsiden. Tunnelen skal ha radius 5*TRAIL_B.
Oppgave 1d
Forklar hvordan du vil lage en animasjon av kulas vandring på banen. Animasjonen skal startes ved å klikke på kula med høyre museknapp og skal stoppes ved å klikke hvor som helst i vinduet med høyre museknapp. Du trenger ikke skrive all nødvendig kode, men du må angi hvilke kodeelementer som inngår og hvordan selve animasjonen drives.
Oppgave 2 (20%)
Oppgave 2a
Som kjent har vi ingen garanti for at det går bra å tegne konkave polygoner i OpenGL. Forklar hvorfor det kan være et problem å tegne konkave polygoner.
Oppgave 2b
Beskriv minst fire teknikker som kan komme til anvendelse dersom hastigheten er kritisk ved uttegning av en animert scene. Få fram fordeler og eventuelle begrensninger.
Oppgave 2c
Hva betyr det å beskrive 3D koordinater i normalisert form ? Hva er hensikten med dette ?
Oppgave 2d
Hva slags transformasjon blir utført av denne matrisen ?
1 0 0 2 0 cos(v) -sin(v) 0 0 sin(v) cos(v) 0 0 0 0 1
Forslag til løsning
Et program som dekker det meste er: solution.zip