Børre Stenseth
Gamle eksamener > V 1996

Eksamen mai 1996

Eksamen Grafisk databehandling 15. mai 1996 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.

main

Beskrivelse av en "loop".

Vi skal se nærmere på en loop av den typen vi finner i fornøyelsesparker. Vi konsentrerer oss om en del av loopen som vist på figuren.

loop

Selve sporet er en flatt bånd med bredde W. Strekningene AB og BC er rette linjer og selve loopen er en perfekt sirkel med radius R, sett vinkelrett på fartsretningen. Avstanden AB er lik avstanden BC.

I oppgavene nedenfor trenger du ikke bekymre deg om all den initialiseringen og rutinearbeidet som er nødvendig i VC++. Du kan anta at lyssettingen er gjort og at de nødvendige materialbestemmelsene er tilgjengelig via ferdigdefinerte rutiner, som SetBaneMaterial(),og SetKuleMaterial().

Anta følgende definert:

#define PI                 3.14159f
#define Bane_Bredde        1.0f     // W på figuren
#define Bane_Radius        10.0f    // R på figuren
#define Bane_Forskyvning   3.0f     // G på figuren
#define Kule_Radius        1.0f     // se oppgave C
#define Flat_Lengde        31.0f    // L på figuren

Du kan kanskje benytte deg av at Flat_Lengde er ca halvparten av sirkelens omkrets.

Vi konsentrerer oss om banen som et spor, uavhengig av bredden på båndet.

Oppgave 1a

Skriv tre funksjoner

Glfloat getX(GLfloat t,GLfloat rad);
Glfloat getY(GLfloat t,GLfloat rad);
Glfloat getZ(GLfloat t,GLfloat rad);

som returnerer hhv. x- ,y- og z-koordinaten til et punkt i sporet på basis av en parameter t og loop-radius rad. Bygg resonnementet på å betrakte hele sporet: A - B - sirkel - B - C som n parametrisk kurve.

Hint: La parameteren t beskrive kurvesegmenter slik:

-s < t < 0.0 strekningen A til B
0.0 < t < 1.0 sirkelen
1.0 < t < 1.0+s strekningen B til C

s må bestemmes.

Velg et fornuftig koordinatsystem og vis ved en skisse hvordan du har resonnert.

Oppgave 1b

Forutsett deloppgave A løst og skriv en funksjon

void DrawLoop()

som tegner ut banen som et bånd fra A til C med rimelig presisjon.

Oppgave 1c

Vi bryr oss ikke om å arbeide med en komplett vogn som skal kjøre på banen, men nøyer oss med en kule med radius Kule_Radius. Vi antar for enkelhets skyld at kula går tilnærmet med konstant hastighet fra A til C.

Skriv de nødvendige kodesekvensene som skal til for å vise en passe detaljert animering av kulas vandring fra A til C

Oppgave 1d

Forklar med tekst og tegning, uten å skrive kode, hvordan du ville realisere en løsning der modellen betraktes fra kula, med synsretningen i fartsretningen.

Oppgave 2

I OpenGL opererer vi med to transformasjonsmatriser. Vi angir hvilken av dem vi vil bearbede med kallene:

glMatrixMode(GL_PROJECTION);
glMatrixMode(GL_MODELVIEW);

Forklar hva de to matrisene har for funksjon. Angi og forklar noen av de OpenGL-funksjonene som brukes til å manipulere de to matrisene.

Oppgave 3

Forklar hvordan vi kan velge et objekt i en planprojeksjon av en 3D-modell ved å peke på objektet med cursor. Forklar både den underliggende strategien som gjør det mulig og de mekanismene som realiserer dette i OpenGL. Bruk gjerne skisser og korte kodeeksempler dersom det letter forklaringen.

Forslag til løsning

Et program som dekker det meste er: solution.zip

(Velkommen) Gamle eksamener>V 1996 (V 1997)