vježbe nela bosner opengl završni vježbe - naslovnicanela/rgpredavanja/rg_vjezbe.pdf · sintaksa...
TRANSCRIPT
Vježbe
Nela Bosner
OpenGL
Završnizadatak Vježbe
kolegija Racunalna grafika
Nela Bosner
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
OpenGL
OpenGL je software-sko sucelje za graficki hardware.Ovo sucelje se sastoji od 150 razlicitih naredbi kojeomogucuju specificiranje
objekataoperacija
za stvaranje interaktivne 3D aplikacije,dizajnirano je da bude neovisno o hardware-u,zbog toga ne sadrži naredbe za rad s prozorima ili unospodataka,niti omogucuje naredbe na visokom nivou za opisivanjemodela 3D objekata.Vodic za programiranje:
http://www.opengl.org/documentation/red_book/
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Sa OpenGL-om korisnik mora sam napraviti svoj modeliz malog skupa geometrijskih primitiva: tocke, linije ipoligoni.Da bi se radili 3D modeli mora sa izgraditi sofisticiranabiblioteka koja koristi OpenGL kao temelj.OpenGL Utility (GLU) biblioteka omogucava mnogeznacajke modeliranja: razne krivulje i plohe,postavljanje matrica za projekcije i orijentaciju pogleda.GLU je standardni dio OpenGL implementacije.OpenGL Utility Toolkit (GLUT) je alat za kreiranje iupravljanje prozorima, i neovisan je o sistemu.GLUT nije dio OpenGL-a.
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Što sve OpenGL radi:Konstruira oblike iz geometrijskih primitiva —matematicki opisi objekata.Rasporeduje objekte u 3D prostoru, i bira tockupogledaIzracunava boju svih objekata:
boja može biti eksplicitno postavljenamože biti odredena iz specificnih uvjeta osvjetljenjadobivena iz teksture zalijepljene na objektdobivena iz neke kombinacije gornjih postupaka
Prebacuje matematicke opise objekata i podatke onjihovim bojama u pixel-e na zaslonu — rasterizacija.
U toj fazi OpenGL može vršiti još neke operacije:eliminacija sakrivenih djelova objekata.
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Sintaksa OpenGL naredbi
Prefiksi:gl — za OpenGLglu — za GLUglut — za GLUT
Sufiksi:1 broj argumenata2 tip podataka argumenata
Sufiks Tip podataka Tip C jezika Definicija tipa u OpenGL-ub 8-bit integer signed char GLbytes 16-bit integer short GLshorti 32-bit integer int ili long GLint, GLsizeif 32-bit floating-point float GLfloat, GLclampfd 64-bit floating-point double GLdouble, GLclampdub 8-bit unsigned integer unsigned char GLubyte, GLbooleanus 16-bit unsigned integer unsigned short GLushortui 32-bit unsigned integer unsigned int ili unsigned long GLuint, GLenum, GLbitfieldv pokazivac na polje
(vektor)
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Primjer
Sljedece dvije naredbe su ekvivalentne:
glVertex2i(1, 3);glVertex2f(1.0, 3.0);
Vektorska i nevektorska verzija naredbe:
glColor3f(1.0, 0.0, 0.0);
GLfloat color_array[] = {1.0, 0.0, 0.0};glColor3fv(color_array);
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
OpenGL zaglavlja
Za korištenje OpenGL i GLU:#include <GL/gl.h>#include <GL/glu.h>
Za korištenje GLUT#include <GL/glut.h>
glut.h ukljucuje i gl.h i glu.h.
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
GLUT naredbe
Upravljanje prozorimaglutInit(int *argc, char **argv) —inicijalizira GLUT i obraduje argumente komandnelinije. glutInit() treba se pozvati prije bilo kojegGLUT potprograma.glutInitDisplayMode(unsigned int mode) —specificira korištenje RGBA ili color–index model boja.Takoder se može specificirati korištenje prozora sajednostrukim ili dvostrukim meduspremnikom (single-or double-buffered), ili korištenje još nekih drugihpridruženih meduspremnika (depth, stencil,accumulation buffer).glutInitWindowPosition(int x, int y) —specificira položaj gornjeg lijevog kuta prozora nazaslonu.
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
glutInitWindowSize(int width, int size)— specificira velicinu prozora izraženu u pixel-ima.int glutCreateWindow(char *string) — kreiraprozor s OpenGL kontekstom. Vraca jedinstveniidentifikator za novi prozor. Prozor nije prikazan dok sene pozove glutMainLoop().
Prikazivanje prozoraglutDisplayFunc(void (*func)(void)) —Kada god GLUT odredi da se sadržaj prozora moraponovo prikazati izvršava se callback funkcija koja jeulazni parametar potprograma glutDisplayFunc().Zato se sve naredbe za crtanje prozorskog sadržajamoraju nalaziti unutar callback funkcije.
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Obrada ulaznih dogadajaglutReshapeFunc(void (*func)(int w, inth)) — naznacuje što se treba izvršiti kada se promijenivelicina prozora.glutKeyboardFunc(void (*func)(unsignedchar key, int x, int y)) iglutMouseFunc(void (*func)(int button,int state, int x, int y)) — odreduju koji sepotprogrami trebaju izvršiti kada se pritisne ili otpustitipka na tipkovnici ili mišu.glutMotionFunc(void (*func)(int x, inty)) — odreduje potprogram koji se izvršava kada semiš mice dok je pritisnuta tipka miša.
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Izvršavanje programaglutMainLoop(void) — izvršava se kao zadnjanaredba; beskonacna petlja. Svi kreirani prozori seprikazuju, obraduju se dogadaji i registrirana callbackfunkcija za prikazivanje se izvršava.
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Neke osnovne OpenGL naredbe
Brisanje prozoraPrije crtanja prozorskog sadržaja potrebno je izbrisatimemoriju prozora od zadnje nacrtane slike, i postaviti ju naneku pozadinsku boju.
void glClearColor(GLclampf red, GLclampfgreen, GLclampf blue, GLclampf alpha) —Postavlja boju pozadine u RGBA modu. Vrijednostiboja su ogranicene na [0,1]. Default vrijednost je(0,0,0,0) tj. crna.void glClear(GLbitfield mask) — briše zadanimeduspremnik i postavlja zadanu boju pozadine. Micemo koristiti meduspremnik za bojeGL_COLOR_BUFFER_BIT.
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
PrimjerBrisanje prozora i postavljanje boje pozadine na crno:
glClearColor(0.0, 0.0, 0.0, 0.0);glClear(GL_COLOR_BUFFER_BIT);
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Specificiranje tekuce bojeDok se boja ne promijeni, svi se objekti crtaju tekucombojom.
void glColor3{b s i f d ub us ui}(TYPEr, TYPEg, TYPEb)
void glColor4{b s i f d ub us ui}(TYPEr, TYPEg, TYPEb, TYPEa)
void glColor3{b s i f d ub us ui}v(const TYPE*v)
void glColor4{b s i f d ub us ui}v(const TYPE*v)
— Postavlja tekuce vrijednosti za crvenu, zelenu, plavu i α
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
prvi sufiks je 3 ili 4, ovisno da li se uz RGB vrijednostipostavlja i α vrijednost (prozirnost materijala). Za sufiks3, α = 0.drugi sufiks odreduje tip podataka ulaznih parametara:byte, short, integer, float, double, unsigned byte,unsigned short, ili unsigned integertreci sufiks v je neobavezan i oznacava vektorskuverziju naredbeulazni parametri su najcešce tipovi pomicnog zareza, ioni su ograniceni na [0,1]; ostali tipovi se linearnokonvertiraju na zadani raspon ([0,1] za unsigned ili[−1,1] za ostale).
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Prinudno dovršenje crtanjaKoristi se kada
software za renderiranje ne obnavlja zaslonkontinuiranoimplementacije grafike sakupljaju odredeni niz naredbiza renderiranje prije prikazivanja
void glFlush(void) — prethodno izdane OpenGLnaredbe prinudno zapocinju s izvršavanjem,osiguravajuci njihovo dovršenje u konacnom vremenu.
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Odredivanje koordinatnog sustava u prozoruKada god se inicijalno otvori prozor ili se promijene njegovavelicina, prozorski sustav šalje obavijest o dogadaju.
GLUT automatski obavještava o dogadaju vezanim uzprozorpoziva se callback funkcija registrirana saglutReshapeFunc()
callback funkcija moraustanoviti novo pravokutno podrucje za crtanjedefinirati koordinatni sustav za crtanje
Za kreiranje jednostavnog 2D koordinatnog sustava trebapozvati
glutReshapeFunc(reshape);
gdje je reshape() prikazana u sljedecem primjeru.
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
PrimjerCallback funkcija reshape():
void reshape (int w, int h){
glViewport (0, 0, (GLsizei) w, (GLsizei) h);glMatrixMode (GL_PROJECTION);glLoadIdentity ();gluOrtho2D (0.0, (GLdouble) w, 0.0, (GLdouble) h);
}
GLUT predaje funkciji reshape() dva argumenta;širinu i visinu prozora u pixel-ima.glViewport() odreduje da ce cijeli prozor bitipredviden za crtanje.
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Primjer (nastavak)
Sljedeca tri potprograma podešavaju koordinatni sustavza crtanje tako da donji lijevi kut ima koordinate (0,0), adesni gornji kut (w,h).gluOrtho2D() postavlja ishodište u donji lijevi kut ipostavlja jedinicni kvadrat.
Slika: Koordinatni sustav definiran sa w = 50, h = 50.
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
void glViewport(GLint x, GLint y,GLsizei width, GLsizei height) — definirapravokutnik pixel-a unutar prozora u koji ce se preslikatikonacna slika:
(x,y) parametri specificiraju koordinate donjeg lijevogkuta pravokutnika pogleda (viewport)width i height specificiraju širinu i visinu pravokutnikapogleda
Default vrijednosti pogleda su (0, 0, winWidth,winHeight), gdje winWidth i winHeight definirajuvelicinu prozora.void glMatrixMode(GLenum mode) — specificirada li ce se mijenjati matrica model–pogleda, projekcije,ili teksture, koristeci argumente GL_MODELVIEW,GL_PROJECTION, ili GL_TEXTURE.
Transformacije koje slijede djeluju samo naspecificiranu matricu (kompozicija preslikavanja).Defaultna vrijednost je identiteta za sve tri matrice.
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
void glLoadIdentity(void) — tekucumijenjajucu matricu postavlja na 4× 4 identitetu; tekucamatrica se briše i priprema se za buducetransformacije.void glOrtho(GLdouble left, GLdoubleright, GLdouble bottom, GLdouble top,GLdouble near, GLdouble far) — kreira matricuza ortografski paralelni volumen pogleda, i množitekucu matricu s njom. Volumen pogleda je kvadar
(left, bottom, -near) i (right, top,-near) su tocke prednje ravnine za obrezivanje, kojese redom preslikavaju u donji lijevi kut i gornji desni kutotvora pogleda.(left, bottom, -far) i (right, top, -far)su tocke stražnje ravnine za obrezivanje, koje sepreslikavaju u iste tocke.Smjer projekcije je paralelan z osi, a pogled je usmjerenprema negativnoj z osi.
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Slika: Volumen pogleda ortografske projekcije.
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
void gluOrtho2D(GLdouble left, GLdoubleright, GLdouble bottom, GLdouble top) —kreira matricu za projekciju 2D koordinata na zaslon imnoži tekucu matricu s njom.
Podrucje obrezivanja je pravokutnik sa donjim lijevimkutom u (left, bottom) i gornjim desnim kutom u(right, top).Ovaj potprogram je identican 3D verziji glOrtho(),samo što se pretpostavlja da su z koordinate svihobjekata na slici iz [−1,1].Kod crtanja 2D objekata korištenjem 2D naredbi zacrtanje, sve z koordinate su jednake 0.
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Crtanje geometrijskih primitiva: tocke, linije i poligoniKod OpenGL-a svi geometrijski objekti su opisani kaouredeni skup vrhova.
void glVertex{234}{sifd}[v](TYPEcoords)— definira vrh za korištenje kod opisivanjageometrijskog objekta.
Mogu se navesti (x, y), (x, y, z) ili (x, y, z,w) koordinate, ovisno o verziji naredbe.Verzije bez z ili w koordinate imaju default vrijednostiz = 0 i w = 1.Pozivi glVertex*() imaju efekta jedino unutar paranaredbi glBegin() i glEnd().
void glBegin(GLenum mode) — oznacava pocetakliste vrhova koji opisuju geometrijsku primitivu. Tipprimitive je odreden parametrom mode.void glEnd(void) — oznacava kraj liste vrhova.
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Dopuštene vrijednosti parametra mode i geometrijskeprimitive:
Vrijednost ZnacenjeGL_POINTS individualne tockeGL_LINES parovi vrhova inerpretiraju se kao individualni
segmenti linijaGL_LINE_STRIP niz povezanih segmenata linijaGL_LINE_LOOP isto kao i GL_LINE_STRIP, sa dodanim
segmentom izmedu zadnjeg i prvog vrhaGL_TRIANGLES po tri vrha interpretiraju se kao individualni
trokutiGL_TRIANGLE_STRIP traka povezanih trokutaGL_TRIANGLE_FAN lepeza povezanih trokutaGL_QUADS po cetiri vrha interpretiraju se kao individualni
cetverkutiGL_QUAD_STRIP traka povezanih cetverokutaGL_POLYGON rub jednostavnog, konveksnog poligona
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Slika: Tipovi geometrijskih primitiva.
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
void glRect{sifd}(TYPEx1, TYPEy1,TYPEx2, TYPEy2)
void glRect{sifd}v(TYPE*v1, TYPE*v2) —crtaju pravokutnike definirane vrhovima (x1, y1) i (x2,y2).
Pravokutnik leži u ravnini z = 0, i stranice su muparalelne x i y osima.Kod vektorske verzije potprograma vrhovi su zadanipomocu dva pokazivaca na polja, a svako polje sadržipar (x, y).
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
PrimjerIspunjeni poligon:
glBegin(GL_POLYGON);glVertex2f(0.0, 0.0);glVertex2f(0.0, 3.0);glVertex2f(4.0, 3.0);glVertex2f(6.0, 1.5);glVertex2f(4.0, 0.0);
glEnd();
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Primjer
Neefikasan nacin crtanja kružnice:
#define PI 3.1415926535898GLint circle_points = 100;glBegin(GL_LINE_LOOP);for (i = 0; i < circle_points; i++) {
angle = 2*PI*i/circle_points;glVertex2f(cos(angle), sin(angle));
}glEnd();
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
PrimjerSuvišno definiranje boje:
glBegin(GL_POINTS);glColor3f(0.0, 1.0, 0.0); /* zelena */glColor3f(1.0, 0.0, 0.0); /* crvena */glVertex(...);glColor3f(1.0, 1.0, 0.0); /* žuta */glColor3f(0.0, 0.0, 1.0); /* plava */glVertex(...);glVertex(...);
glEnd();
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Primjer (hello.c)#include <GL/gl.h>#include <GL/glut.h>
void display(void){/* clear all pixels */
glClear (GL_COLOR_BUFFER_BIT);
/* draw white polygon (rectangle) with corners at
* (0.25, 0.25, 0.0) and (0.75, 0.75, 0.0)
*/glColor3f (1.0, 1.0, 1.0);glBegin(GL_POLYGON);
glVertex3f (0.25, 0.25, 0.0);glVertex3f (0.75, 0.25, 0.0);glVertex3f (0.75, 0.75, 0.0);glVertex3f (0.25, 0.75, 0.0);
glEnd();
/* don’t wait!
* start processing buffered OpenGL routines
*/glFlush ();
}
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Primjer (hello.c — nastavak)void init (void){/* select clearing (background) color */
glClearColor (0.0, 0.0, 0.0, 0.0);
/* initialize viewing values */glMatrixMode(GL_PROJECTION);glLoadIdentity();glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
}
/* * Declare initial window size, position, and display mode
* (single buffer and RGBA). Open window with "hello"
* in its title bar. Call initialization routines.
* Register callback function to display graphics.
* Enter main loop and process events.
*/int main(int argc, char** argv){
glutInit(&argc, argv);glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);glutInitWindowSize (250, 250);glutInitWindowPosition (100, 100);glutCreateWindow ("hello");init ();glutDisplayFunc(display);glutMainLoop();return 0; /* ISO C requires main to return int. */
}
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Slika: Grafika programa hello.c.
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Primjer (hello.c — nastavak)Program se kompajlira sa
$ gcc hello.c -lglut
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
ZadatakNapišite algoritam srednje tocke za scan converting linijekoji obraduje linije sa svim mogucim koeficijentima smjera.
Domaca zadacaNapišite program koji ucitava koordinate n tocaka, te xmin,xmax , ymin i ymax koordinate pravokutnika za obrezivanje.Program treba nacrtati poligon zadan tim tockama pomocualgoritma srednje tocke za linije, koji je pravilno obrezanzadanim pravokutnikom za obrezivanje.
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Transformacije modela i pogleda
Transformacije modela služe za smještaj i orijentacijumodela.Transformacije pogleda su analogne smještaju iorijentaciji kamere.Buduci da je bitan relativan položaj modela ili objekta uodnosu na kameru
svejedno je da li micemo kameru u jednom smjeru, iliobjekt u suprotnom smjerumoramo simultano razmatrati efekte obiju transformacija
Za definiranje transformacija modela–pogleda trebapozvati
glMatrixMode (GL_MODELVIEW);glLoadIdentity();
što je i default vrijednost.
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Osnovne naredbe za definiranje 4× 4 matricetransformacija su glLoadMatrix*() iglMultMatrix*()
void glLoadMatrix{fd}(const TYPE *m) —postavlja 16 vrijednosti tekuce matrice na vrijednostispecificirane u 4× 4 matrici m. Matrica je zadana sa
M =
m1 m5 m9 m13m2 m6 m10 m14m3 m7 m11 m15m4 m8 m12 m16
Matrica se sprema po stupcima, pa je pogodnijedeklarirati matricu kao m[16].void glMultMatrix{fd}(const TYPE *m) —Množi matricu na cije elemente pokazuje pokazivac msa tekucom matricom, i sprema rezultat kao tekucumatricu.
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Sva matricna množenja se izvode s desna:tekuca matrica je Cmatrica definirana sa glMultMatrix*() ili bilo kojomnaredbom za transformacije je Mrezultat množenja je CM
Buduci da množenje matrica nije komutativno,redoslijed je važan.Vrhovi v se množe tekucom matricommodela–pogleda: CMvZadnja naredba za transformaciju u programu se prvaprimijenjuje na vrhove.Transformacije se moraju specificirati u obrnutomporetku (ili u poretku transformacija koordinatnogsustava).
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Primjer
Crta jednu tocku koristeci tri transformacije
glMatrixMode(GL_MODELVIEW);glLoadIdentity();glMultMatrixf(N); /* primijenjuje transformaciju N */glMultMatrixf(M); /* primijenjuje transformaciju M */glMultMatrixf(L); /* primijenjuje transformaciju L */glBegin(GL_POINTS);glVertex3f(v); /* crta transformirani vrh v */glEnd();
Matrica modela–pogleda uzastopno sadrži: I, N, NM, iNMLTransformirani vrh je: NMLvRed transformacija je: L, M, i N
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Transformacije modelavoid glTranslate{fd}(TYPE x, TYPE y,TYPE z) — množi tekucu matricu matricom translacijeT (x , y , z) (ili pomice lokalni koordinatni sustav za danivektor).void glRotate{fd}(TYPE theta, TYPE x,TYPE y, TYPE z) — množi tekucu matricu matricomrotacije Ru(θ), pri cemu Ru(θ) rotira objekt (ili njegovlokalni koordinatni sustav) u smjeru suprotnom odkazaljke na satu oko zrake iz ishodišta u smjeru vektorau = (x , y , z), za kut θ izražen u stupnjevima.void glScale{fd}(TYPE x, TYPE y, TYPE z)— množi tekucu matricu matricom skaliranja S(x , y , z)(ili rasteže, skuplja, ili reflektira lokalni koordinatnisustav).
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Sve tri naredbe su ekvivalentne definiranjuodgovarajuce matrice i pozivu naredbeglMultMatrix*(), ali su brže.Kod naredbi za translaciju, rotaciju i skaliranje matricetransformacija se racunaju automatski.
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Transformacije pogledadefault položaj kamere: smještena u ishodištu iorijentirana prema negativnoj z osikoristiti naredbe glTranslate*() i glRotate*()void gluLookAt(GLdouble eyex, GLdoubleeyey, GLdouble eyez, GLdouble centerx,GLdouble centery, GLdouble centerz,GLdouble upx, GLdouble upy, GLdoubleupz) — definira matricu pogleda i množi ju s tekucommatricom. Tocka pogleda je definirana sa eyex, eyey,i eyez. Argumenti centerx, centery, i centerzderfiniraju tocku na liniji pogleda, obicno u središtuscene koju se gleda. Argumenti upx, upy, i upzdefiniraju smjer prema gore.
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
ZadatakNapišite program koji implementira transformacije izprimjera sa predavanja.
- - - - -
6 6 6 6 6�� @@t�� @@
tP1
P2
originalnakucica
translacija P1u ishodište
skaliranje rotacija translacijaishodišta u P2
Pocetna slika kucice neka bude nacrtana u plavoj boji, azavršna u crvenoj.
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Zadatak (nastavak)
Koordinate vrhova kucice:(0,0) (30,0) (30,30) (15,45) (0,30)
Koordinate tocke P1: (15,24)Koordinate tocke P2: (40,30)Skaliranje: S(0.3,0.3)
ZadatakNapišite program koji definira pravilnu cetverostranupiramidu, takvu da joj je baza bijele boje, a stranice crvene,žute, plave i zelene boje. Ovisno o unosu korisnika,program treba prikazati ortografsku projekciju baze, jedneod stranica, brida izmedu žute i plave stranice ili pogledodozgora.
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Zadatak (nastavak)Za bojanje stranice jednom bojom postavite model bojanja uinit() potprogramu na
glShadeModel (GL_FLAT);
Kako biste omogucili neprikazivanje sakrivenih plohatrebate dodati sljedece:
glutInitDisplayMode (GLUT_SINGLE |GLUT_RGB | GLUT_DEPTH); u main()...
glEnable(GL_DEPTH_TEST); u init()...
glClear (GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT); u display()
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Projekcije i volumeni pogleda
Prije definiranja transformacija koja definiraju projekcijui njen volumen pogleda potrebno je pozvati
glMatrixMode(GL_PROJECTION);glLoadIdentity();
OpenGL ima mogucnost definiranja dviju vrstaprojekcija
ortografske paralelne projekcijeperspektivne projekcije
Prakticnije je pomaknuti predmet na željeni položaj(transformacije pogleda) nego komponiratitransformacije sa projekcijom.
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
void glOrtho(GLdouble left, GLdoubleright, GLdouble bottom, GLdouble top,GLdouble near, GLdouble far) — kreira matricuza ortografski paralelni volumen pogleda, i množitekucu matricu s njom. Volumen pogleda je kvadar
(left, bottom, -near) i (right, top,-near) su tocke prednje ravnine za obrezivanje, kojese redom preslikavaju u donji lijevi kut i gornji desni kutotvora pogleda.(left, bottom, -far) i (right, top, -far)su tocke stražnje ravnine za obrezivanje, koje sepreslikavaju u iste tocke.Smjer projekcije je paralelan z osi, a pogled je usmjerenprema negativnoj z osi.
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Slika: Volumen pogleda ortografske projekcije.
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
void glFrustum(GLdouble left, GLdoubleright, GLdouble bottom, GLdouble top,GLdouble near, GLdouble far); — kreiramatricu za perspektivni volumen pogleda, i množitekucu matricu s njom. Volumen pogleda je krnjapiramida
(left, bottom, -near) i (right, top,-near) su tocke bliže ravnine za obrezivanje, kojedefiniraju gornju bazu krnje piramide.near i far su pozitivne udaljenosti središta projekcije(ujedno i tocke pogleda) od prednje i stražnje ravnine zaobrezivanje, duž negativne z osi.Središte projekcije je u ishodištu, a pogled je usmjerenprema negativnoj z osi.Ravnina projekcije se podudara sa prednjom ravninomza obrezivanje.Krnja piramida ne mora biti simetricna.
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Slika: Volumen pogleda perspektivne projekcije definiran saglFrustum().
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
void gluPerspective(GLdouble fovy,GLdouble aspect, GLdouble near, GLdoublefar); — kreira matricu za perspektivni volumenpogleda, i množi tekucu matricu s njom. Volumenpogleda je krnja piramida
fovy je kut polja pogleda u xz ravnini, njegovavrijednost mora biti u rasponu [0,180].aspect je omjer širine i visine gornje baze krnjepiramide.near i far su pozitivne udaljenosti središta projekcije(ujedno i tocke pogleda) od prednje i stražnje ravnine zaobrezivanje, duž negativne z osi.Središte projekcije je u ishodištu, a pogled je usmjerenprema negativnoj z osi.Ravnina projekcije se podudara sa prednjom ravninomza obrezivanje.Krnja piramida je simetricna.
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Slika: Volumen pogleda perspektivne projekcije definiran sagluPerspective().
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
ZadatakNapišite program koji crta perspektivni pogled na 3D kucicu.
Kucica je zadana koordinatama svojih vrhova:
(0,0,10), (30,0,10), (30,30,10), (15,45,10), (0,30,10),
(0,0,70), (30,0,70), (30,30,70), (15,45,70), (0,30,70)
Središte projekcije u koordinatama scene zadano je sa:
COP = (70,15,110)
Referentna tocka pogleda je:
VRP = (30,15,70)
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Zadatak (nastavak)Normala na ravninu projekcije i vektor prema gore su:
VPN = (1,0,1), VUP = (0,1,0)
Udaljenosti do prednje i zadnje ravnine za obrezivanjesu:
F = 0, B = −64
pri cemu se prednja ravnina poklapa sa ravninompogleda.Koordinate vrhova prozora na ravnini pogledadefinirane su sa:
(umin, vmin) = (−16,−20), (umax , vmax) = (26,30)
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Zadatak (nastavak)Neka vaš program ima dvije verzije:
1 neka koristi naredbu glFrustum()
2 neka ima definirane normalizirajuce transformacije bezobrezivanja, i transformaciju kanonickog volumenapogleda perspektivne projekcije u kanonicki volumenpogleda paralelne projekcije (M); na kraju koristiteglOrtho()
ZadatakZadatak je isti kao i prethodni, samo što je
VUP =
(12,
√3
2,0
).
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
ZadatakNapišite program koji crta perspektivni pogled na 3D kucicu.
Koordinate vrhova kucice su iste kao i u prethodnomzadatku.Središte projekcije u koordinatama scene zadano je sa:
COP = (70,70,110)
Referentna tocka pogleda je:
VRP = (30,30,70)
Normala na ravninu projekcije i vektor prema gore su:
VPN = (1,1,1), VUP = (0,1,0)
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Zadatak (nastavak)Udaljenosti do prednje i zadnje ravnine za obrezivanjesu:
F = 0, B = −71
pri cemu se prednja ravnina poklapa sa ravninompogleda.Koordinate vrhova prozora na ravnini pogledadefinirane su sa:
(umin, vmin) = (−20,−20), (umax , vmax) = (30,30)
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Konike
Zadatak
Želimo naci racionalni parametarski oblik jednadžbekružnog luka prikazanog na slici.
Kružnica ima radijus r i kut luka je α.U svakoj tocci kružnice tangenta je okomita na radijus.
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Zadatak (nastavak)
Dužina T − C raspolavlja kut α i sijece kružnicu u tocciPc .Zbog toga što se radi o kružnom luku:
‖T − P1‖ = ‖T − P2‖
Buduci da je dužina A1 − Pc tangentna na kružnicu uPc , ako promatramo luk sa kutom α/2 imamo analognusituaciju kao gore:
‖A1 − P1‖ = ‖A1 − Pc‖
Isto tako:‖A2 − P2‖ = ‖A2 − Pc‖
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Zadatak (nastavak)
Buduci da je dužina A1 − A2 tangentna na kružnicu uPc , paralelna je sa dužinom P2 − P1 i radijus kroz Pc jeokomit na nju.Imamo sljedece kuteve
∠PiTC =π
2− α
2, ∠TAiPc =
α
2, za i = 1,2.
odakle slijedi
‖Ai − Pc‖ = cos(α
2
)‖T − Ai‖, za i = 1,2.
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Zadatak (nastavak)Imamo
ri =‖T − Ai‖‖Ai − Pi‖
, i = 1,2
=‖T − Ai‖‖Ai − Pc‖
=‖T − Ai‖
cos(α2
)‖T − Ai‖
=1
cos(α2
)odakle je
K = r1r2 =1
cos2(α2
)
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Zadatak (nastavak)Ovu reprezentaciju možemo koristiti za kuteve0 < α < π, ali ako je α blizu π postupak je numerickinestabilan.Uzet cemo
w0 = w2 = 1, w1 = cos(α
2
).
Napišite potprogram konika() sa sljedecim ulaznimparametrima:
tocke Pi i parametri wi , za i = 0,1,2,granice segmenta a i b, te broj podsegmenata n nakoje dijelimo segment [a,b].
Potprogram treba implementirati algoritam za crtanje tocakana luku konike izveden na predavanjima,
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Zadatak (nastavak)
tako da crta tocke na konici za tj , j = 0,1, . . . ,n, pricemu su tj = a + j · (b − a)/n,da konika prolazi kroz tocke P0 i P2,i ima smjer tangente u P0 zadan sa P1 − P0, a smjertangente u P2 zadan sa P2 − P1.
Svoj potprogram testirajte na kružnom luku sa sljedecimpodacima:
P0 = (10,0), P1 = (10,10), P2 = (0,10)
w0 = w2 = 1, w1 =√
2/2a = 0, b = 1, n = 100
Probajte mijenjati parametar w1, odnosno K tako daK poprimi razlicite velicine K > 1, K = 1, K < 1w1 bude negativan
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
ZadatakNapišite potprogram konika_tocke() sa sljedecimulaznim parametrima:
tocke Pi i = 0,1,2,3, pri cemu P3 treba biti unutartrokuta 4P0P1P2
granice segmenta a i b, te broj podsegmenata n nakoje dijelimo segment [a,b].
Potprogram treba implementirati algoritam za crtanje tocakana luku konike, tako da crta tocke na konici za tj ,j = 0,1, . . . ,n, pri cemu su tj = a + j · (b − a)/n. Konika
prolazi kroz tocke P0, P2 i P3,ima smjer tangente u P0 zadan sa P1 − P0, a smjertangente u P2 zadan sa P2 − P1,
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Zadatak (nastavak)
iz uvjeta da prolazi kroz P3 treba izracunati parametarK
−L1(P3)L2(P3)
(L3(P3))2 = c = − λ
1− λ≤ 0
K =4λ
1− λSvoj potprogram testirajte na kružnom luku iz prethodnogzadatka sa P3 = (6,8).
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
U GLU paketu se nalaze potprogrami za crtanjepoligonalnih aproksimacija krivulja i poliedarskihaproksimacija ploha drugog reda:
sferecilindrikrugovi (diskovi)kružni isjecci
Za kreiranje, podešavanje i crtanje krivulja i ploha drugogreda potrebno je izvršiti sljedece korake:
1 Za kreiranje objekta krivulje ili plohe treba koristitigluNewQuadric().
2 Za specificiranje svojstava krivulje ili plohe trebakoristiti:
gluQuadricDrawStyle() za izbor nacinaprikazivanja krivulje ili plohe pomocu tocaka, linija, ilipopunjenih poligona.
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
3 Za crtanje krivulje ili plohe treba koristitigluSphere(), gluCylinder(), gluDisk(), iligluPartialDisk().
4 Za uništavanje objekta kada više nije potreban trebakoristiti gluDeleteQuadric(). Ako je potrebnokreirati novu krivulju ili plohu, najbolje je ponovoiskoristiti isti objekt.
Potprogrami:GLUquadricObj* gluNewQuadric (void) —kreira novi objekt krivulje ili plohe drugog reda i vracapokazivac na njega.void gluDeleteQuadric (GLUquadricObj
*qobj) — uništava objekt qobj krivulje ili plohe ioslobada memoriju koju je koristio.
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
void gluQuadricDrawStyle (GLUquadricObj*qobj, GLenum drawStyle) — za objekt qobjovaj potprogram definira nacin prikazivanja krivulje iliplohe. Dozvoljene vrijednosti su:
GLU_POINT i GLU_LINE specificiraju da seaproksimativni poligon krivulje ili poliedar plohe prikažecrtanjem tocaka u vrhovima, ili crtanjem linija izmedjususjednih vrhova.GLU_SILHOUETTE slicno kao GLU_LINE, osim što sene prikazuju rubovi koji razdvajaju komplanarnestranice (cesto se koristi kod gluDisk() igluPartialDisk()).GLU_FILL specificira da se aproksimacija ploheprikaže pomocu popunjenih poligona.
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
void gluSphere (GLUquadricObj *qobj,GLdouble radius, GLint slices, GLintstacks) — crta sferu danog radijusa, sa središtem uishodištu. Sfera je podijeljena na slices meridijanaoko z osi, i na stacks paralela duž z osi.void gluCylinder (GLUquadricObj *qobj,GLdouble baseRadius, GLdouble topRadius,GLdouble height, GLint slices, GLintstacks) — crta cilindar orijentiran duž z osi, sadonjom bazom cilindra na z = 0 i radijusombaseRadius, i gornjom na z =height s radijusomtopRadius. Cilindar je podijeljen na slicesmeridijana oko z osi, i na stacks paralela duž z osi.
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
void gluDisk (GLUquadricObj *qobj,GLdouble innerRadius, GLdoubleouterRadius, GLint slices, GLint rings)— crta disk u ravnini z = 0, sa radijusomouterRadius i koncentricnom kružnom rupomradijusa innerRadius. Disk je podijeljen na sliceskriški oko z osi i na rings koncentricnih prstenova okoz osi.void gluPartialDisk (GLUquadricObj
*qobj, GLdouble innerRadius, GLdoubleouterRadius, GLint slices, GLint rings,GLdouble startAngle, GLdoublesweepAngle) — crta isjecak diska u ravnini z = 0 naisti nacin kao i gluDisk(). Isjecak je nacrtan od kutastartAngle do kuta sweepAngle. Kutevi se mjere ustupnjevima, kut od 0◦ se poklapa sa +y osi, a kutevise mjere u smjeru kazaljke na satu.
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
ZadatakNapišite program koji crta kružnicu u x-y ravnini radijusa r ,zatim ju rotira rotacijom Rx(θ) pod raznim kutevima itranslatira duž −z osi na razlicite udaljenosti u. Uvjerite seda perspektivnom projekcijom kružnice možemo dobitielipsu, parabolu i hiperbolu.
Provjerite da je zau < r | sin θ|, krivulja je hiperbolau = r | sin θ|, krivulja je parabolau > r | sin θ|, krivulja je elipsa
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Bézierove krivulje
Domaca zadacaNapišite program koji ce nacrtati zadano slovo ili brojku:
α β γ δ ε ζ ϑ ξ ϕ ω
b e m s y 2 3 6 8
na dva nacina:1 pomocu po dijelovima konike s pogodnim konstantama
K ,2 pomocu po dijelovima Bézierove krivulje, pri cemu se
Bézierove krivulje crtaju algoritmom koji implementirauzatopnu podijelu krivulje.
Pazite na geometrijsku glatkocu krivulja, tako da ona štovjernije prikazuje zadano slovo ili brojku.
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
B-splajnovi
ZadatakNapišite potprograme koji implementiraju
de Boorov rekurzivni algoritam za B-splajnovede Boor – Coxovu rekurziju
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Zadatak
Želimo nacrtati krivulju B-splajnova koja aproksimiraspiralu zadanu parametarskom jednadžbom
σ(t) = [cos(t), sin(t), t ].
Aproksimativnu krivulju odredit cemo pomocu podijelovima kubicne Hermiteove interpolacije sasljedecim parametrima:
m = 12;ui = iπ
2 , i = 0, . . . ,12;pi = σ(ui), i = 0, . . . ,12;qi = σ′(ui), i = 0, . . . ,12;
U ovom slucaju je N = 2m + 5 = 29 in = N − 3− 1 = 25.
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Zadatak (nastavak)Za rješavanje sustava linearnih jednadžbi satridijagonalnom matricom upotrijebite potprogram kojise nalazi u datoteci tridijag_sustav.c, na adresi
http://www.math.hr/˜nela/rg.html/
Za potrebe ovog potprograma n × n tridijagonalnumatricu sustava A spremite u 3× n dimenzionalnopolje, a desnu stranu sutava b u n × 3 dimenzionalnopolje na sljedeci nacin:
1 Deklarirajte varijabledouble **a, **b, **x;
Varijabla x služit ce za spremanje rješenja sustava, istihje dimenzija kao i b.
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Zadatak (nastavak)2 Alocirajte memorijua=(double **) malloc(3*sizeof(double*));for (i=0;i<3;i++)
a[i]=(double *) malloc(n*sizeof(double));b=(double **) malloc(n*sizeof(double*));for (i=0;i<n;i++)
b[i]=(double *) malloc(3*sizeof(double));
Za varijablu x nije potrebno alocirati memoriju.3 Polje a popunjavajte tako da u svaki redak stavite jednu
dijagonalu matrice A = [A[i][j]], npr za A ∈ R5×5:
a→∗ A[0][1] A[1][2] A[2][3] A[3][4]
A[0][0] A[1][1] A[2][2] A[3][3] A[4][4]
A[1][0] A[2][1] A[3][2] A[4][3] ∗Elementi oznaceni sa * se ne referenciraju.
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Zadatak (nastavak)4 Prije funkcije main() stavite deklaraciju
double **tridijag_sustav(int n, intbr_stupaca_b, double **a, double **b);
gdje br_stupaca_b oznacava broj desnih strana (unašem slucaju to je 3).
5 Pozovite funkcijux=tridijag_sustav(n, 3, a, b);
6 Datoteku tridijag_sustav.c kompajlirajte zajednosa vašim izvršnim programom uz opciju
-llapack
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
−1.5−1
−0.50
0.51
−2
−1
0
10
5
10
15
20
xy
z
Slika: — originalna krivulja — Hermiteov interpolant◦ interpolacijske tocke ◦ kontrolne tocke
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
Zadatak
Želimo nacrtati krivulju B-splajnova koja aproksimira spiraluzadanu u prethodnom zadatku, samo što cemo sada koristitiC2 kubicnu interpolaciju u cvorovima. Interpolacijske tockeneka su iste kao i u prethodnom zadatku.
Vježbe
Nela Bosner
OpenGLSintaksa OpenGLnaredbi
OpenGL zaglavlja
GLUT naredbe
Neke osnovneOpenGL naredbe
Transformacijemodela i pogleda
Projekcije i volumenipogleda
Konike
Bézierove krivulje
B-splajnovi
Završnizadatak
−2−1
01
2
−2
−1
0
1
20
5
10
15
20
xy
z
Slika: — originalna krivulja — interpolant u cvorovima◦ interpolacijske tocke ◦ kontrolne tocke
Vježbe
Nela Bosner
OpenGL
Završnizadatak
Završni zadatak
Želimo nacrtati mrežastu plohu koja nastaje “križanjem”jedne krivulje s drugom.Primjeri takvih ploha su:
Slika: Cilindar, konus, sfera i torus.
Vježbe
Nela Bosner
OpenGL
Završnizadatak
Križanje krivulje γ2(s) s krivuljom γ1(t) znaci da γ2(s)pomicemo duž γ1(t), i pri tom je pravilno orijentiramo.Orijentaciju krivulje γ2(s) duž γ1(t) odreduje putujucitrobrid definiran sa jedinicnom tangentom Tγ1(t),jedinicnom normalom Nγ1(t) i binormalomBγ1(t) = Tγ1(t)× Nγ1(t).Novi položaj krivulje γ2(s) odreduje se transformacijom
Mγ1(t)γ2(s) + γ1(t),
gdje Mγ1(t) predstavlja matricu rotacije koja preslikavakanonicki xyz koordinatni sustav u sustav odredentrobridom {Tγ1(t),Nγ1(t),Bγ1(t)}.Mi cemo uvijek smjestiti krivulju γ2(s) u tocku γ1(t) takoda se ona nalazi u ravnini okomitoj na krivulju γ1 u t(ravnina je okomita na tangentu γ′1(t)).
Vježbe
Nela Bosner
OpenGL
Završnizadatak
U završnim zadacima radi se o križanju ravninskekrivulje γ2(s) u xz ravnini sa ravninskom krivuljom γ1(t)u xy ravnini.U svakom zadatku krivulja γ1(t) prolazi kroz ishodište((0,0,0) = γ1(t0)) i u njemu ima tangentu γ′1(t0) usmjeru osi y .To znaci da se ravnina koja je okomita na krivulju γ1 uishodištu poklapa upravo sa xz ravninom.γ2(s) takoder prolazi kroz ishodište, tako da je ishodištesjecište tih dviju krivulja.
Vježbe
Nela Bosner
OpenGL
Završnizadatak
−6
−4
−2
0
2
−2
0
20
1
2
3
4
5
6
xy
z
Slika: — γ1(t) — γ2(s)
Vježbe
Nela Bosner
OpenGL
Završnizadatak Svaki novi položaj krivulje γ2(s), recimo u tocci γ1(t),
odreduje se rotacijom koja je zakrenula γ′1(t0) u γ′1(t).Nove položaje krivulje γ2(s), oznacene sa γ2,i(s),crtamo u tockama krivulje γ1(ui), gdje je {ui}ekvidistantna mreža u domeni od γ1.Na taj nacin dobivamo “meridijane” plohe.
Vježbe
Nela Bosner
OpenGL
Završnizadatak
−6
−4
−2
0
2
−2
0
20
1
2
3
4
5
6
xy
z
Slika: — γ1(t) — γ2,i(s)
Vježbe
Nela Bosner
OpenGL
Završnizadatak
−6 −5 −4 −3 −2 −1 0 1 2−2
−1
0
1
2
x
y
Slika: — γ1(t) — γ2,i(s)
Vježbe
Nela Bosner
OpenGL
Završnizadatak
Na kraju, na domeni krivulje γ2 definiramoekvidistantnu mrežu {vj}, i za svaku tocku mreže vjpovežemo tocku γ2(vj) sa tockama {γ2,i(vj)}i svihnovih položaja krivulje γ2(s).Ovako dobivenu krivulju oznacimo sa γ1,j(t), i onapredstavlja transformiranu krivulju γ1(t) na visiniz = γ2(vj).Na taj nacin dobivamo “paralele” plohe.
Vježbe
Nela Bosner
OpenGL
Završnizadatak
−6
−4
−2
0
2
−2
0
20
1
2
3
4
5
6
xy
z
Slika: — γ1,j(t) — γ2,i(s)
Vježbe
Nela Bosner
OpenGL
Završnizadatak
Konkretno u zadacima biti ce definirane krivulje δ1(t) iδ2(s) koje ce najprije trebati aproksimirati krivuljamaB-splajnova pomocu C2 kubicne interpolacije ucvorovima.Interpolacija neka se vrši u cvorovima gore navedenihekvidistantnih mreža {ui} i {vj} u domenama krivulja.U svakoj mreži neka bude najmanje 20 cvorova, a nemora ih biti jednaki broj.Dobiveni interpolanti γ1(t) i γ2(s) imat ce tada istedomene kao i δ1(t) i δ2(s), i njih koristite za generiranjeplohe.Za svaku krivulju γ1,j(t) ponovo koristite C2 kubicnuinterpolaciju u istim cvorovima kao i kod racunanjaγ1(t).
Vježbe
Nela Bosner
OpenGL
Završnizadatak
NapomenaPrimjena rotacije na krivulju B-splajnova svodi se naprimjenu rotacije samo na kontrolne tocke.