Eksamen desember 1997
Alle skrevne og trykte hjelpemidler tillatt Tid for eksamen er 4 timer. Dersom du finner noe uklart i oppgaveteksten så gjør dine egne forutsetninger og redegjør for disse. |
Det forutsettes programmering av OpenGL i MS Visual C++. All den nødvendige koden skal kunne plasseres i xxView-klassen. Konsentrer deg om den koden det eksplisitt spørres etter. All annen kode som skal til for å få OpenGL til å fungere i VC++ er irrelevant for besvarelsen.
I oppgave en skal vi se litt på en liten trafikkpoliti, Robocop. Robocop skal se slik ut:
med følgende dimensjoner:
// cop dimensions #define BASIC_R 10.0f #define BASIC_L 1.0f #define BODY_R BASIC_R/3.0f #define BODY_L 15.0f #define ARM_R 0.5f #define ARM_L BODY_L/3.0f #define HAND_R 3.0f #define HAND_L 0.5f #define NECK_R ARM_R #define NECK_L 2.0f #define HEAD_R HAND_R #define JOIN_R ARM_R*1.5f
Frihetsgradene er beskrevet ved:
GLfloat v[6];
Rotasjonene v0 og v5 er beskrevet om z-aksen, mens rotasjonene v1,v2,v3,v4 er beskrevet om x-aksen.
Du kan kanskje ha bruk for denne funksjonen:
void DrawClosedCylinder(GLfloat R,GLfloat H) { // draws a closed cylinder with length // along z and // leaves origo on top of cylinder GLUquadricObj *pQ; pQ = gluNewQuadric(); gluDisk(pQ,0.0f,R,QP,QP); gluCylinder(pQ,R,R,H,QP,QP); glTranslatef(0.0f,0.0f,H); gluDisk(pQ,0.0f,R,QP,QP); gluDeleteQuadric(pQ); }
Oppgave 1a
Skriv funksjonen:
void DrawRoboCop(GLfloat v[], int n);
som tegner ut vår lille trafikkpoliti. v er de 6 frihetsgradene. Funksjonen fungerer bare for n=6.
Oppgave 1b
Gitt funksjonen det spørres etter i oppgave a) og følgende medlemsvariable til CxxView:
GLfloat v1[6]; GLfloat v2[6]; Glint m_antallsteg; GLfloat m_dt;
Skriv den nødvendige koden for å lage en animasjon på m_antallsteg steg mellom posisjon v1 og v2 på m_t sekunder.
Oppgave 1c
Robocop skal stå ut og jobbe hele døgnet og må være synlig. Vi skal derfor henge opp en lampe over hodet på Robocop. Lampa skal ikke blende trafikentene og skal derfor kaste en avgrenset lyskjegle ned på Robocop.
Tegn og forklar og skriv den nødvendige koden for å sette opp et slikt lys.
Oppgave 2 Retningsbestemt lys
I OpenGL beregnes det retningsbestemte lysets bidrag til intensiteten i et punkt som:
, der Ider intensiteten på det retningsbestemte lyset, L er lysretningen og N er normalen i det aktuelle punktet og kd er det aktuelle materialets refleksjonskonstant for retingsbestemt lys.
Oppgave 2a
Forklar vilke forutsetninger som er nødvendige for at dette skal fungere etter hensikten og hva vi kan gjøre i når vi programmerer for å sikre oss at forutsetningene er oppfylt.
Oppgave 2b
Øyets plassering inngår ikke i uttrykket. Hvordan kan det forklares ?
Forslag til løsning
Et program som dekker det meste er: solution.zip
Skrevet om til JOGL/NetBeans: https://svnit.hiof.no/svn/psource/JOGL/robocop