Created
March 15, 2013 13:44
-
-
Save jirkapenzes/5169960 to your computer and use it in GitHub Desktop.
INPG3 - vykreslení objektu v OpenGL
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" ) // skryje okno konzole | |
//--------------------------------------------------------------------- | |
// Program otevre jedno hlavni okno a vykresli do nej 3D elipsoid pomocí bodù | |
// Klavesami x, z, y se nastavuje poloha kamery, klavesou r rotace elipsoidu | |
// Klavesami p a q se nastavuje poloha elipsoidu | |
// Program lze ukoncit stiskem klavesy ESC. | |
//--------------------------------------------------------------------- | |
#include <glut.h> // hlavickovy soubor funkci GLUTu | |
//#include <stdlib.h> | |
#include <math.h> | |
float vert=10.0; | |
float horiz=10.0; | |
int px=250; | |
int py=250; | |
float rr,gg,bb,zet=20.0; | |
float x,y,z, uhel=10; | |
float a=60,b=80,c=90; | |
//--------------------------------------------------------------------- | |
// Nastaveni souradneho systemu v zavislosti na velikosti okna | |
//--------------------------------------------------------------------- | |
void onResize(int w, int h) // w a h reprezentuje novou velikost okna | |
{ | |
glViewport(20, 20, w, h); // viditelna oblast pres cele okno | |
glMatrixMode(GL_PROJECTION); // zacatek modifikace projekcni matice | |
glLoadIdentity(); // vymazani projekcni matice (=identita) | |
glOrtho(-200, w, -200, h, -400, 400); // mapovani abstraktnich souradnic do souradnic okna | |
glMatrixMode(GL_MODELVIEW); | |
} | |
//--------------------------------------------------------------------- | |
// Tato funkce je volana pri kazdem prekresleni okna | |
//--------------------------------------------------------------------- | |
void onDisplay(void) | |
{ | |
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | |
glLoadIdentity(); | |
gluLookAt(horiz, vert, zet, | |
1.0f, 0.0f, 0.0f, | |
0.0f, 10.0f, 0.0f); | |
glClearColor(1.0, 1.0, 1.0, 0.0); // nastaveni mazaci barvy na cernou | |
glClear(GL_COLOR_BUFFER_BIT); // vymazani bitovych rovin barvoveho bufferu | |
glColor3f(0.0f, 0.0f, 0.0f); // nastaveni barvy pro kresleni | |
glColor3f(1.0f, 0.0f, 0.0f); | |
glLineWidth(2.0); | |
glPointSize(2.0); | |
glRotatef((float)uhel, 0.0f, 0.0f, 1.0f); | |
glTranslatef(px,0,0); | |
glTranslatef(0,py,0); | |
for(x=-a;x<a;x=x+1) // vykreslení hyperboloidu pomocí bodu ze smeru z | |
for(y=-b;y<b;y=y+1) | |
{ | |
z = sqrt((1-(x*x)/(a*a)-(y*y)/(b*b))*(-(c*c))); | |
glBegin(GL_POINTS); | |
rr=(x+c/2)/c; | |
gg=(x+c/2)/c; | |
bb=1-(x+c/2)/c; | |
glColor3f(rr, gg, bb); | |
glVertex3f(x,y,z); | |
glColor3f(rr, gg, bb); | |
glVertex3f(x,y,-z); | |
glEnd(); | |
} | |
for(x=-a;x<a;x=x+1) // vykreslení hyperboloidu pomocí bodu ze smeru y | |
for(z=-c;z<c;z=z+1) | |
{ | |
y = sqrt((1-(x*x)/(a*a)+(z*z)/(c*c))*(b*b)); | |
glBegin(GL_POINTS); | |
rr=(x+b/2)/b; | |
gg=1-(x+b/2)/b; | |
bb=(x+b/2)/b; | |
glColor3f(rr, gg, bb); | |
glVertex3f(x,y,z); | |
glColor3f(rr, gg, bb); | |
glVertex3f(x,-y,z); | |
glEnd(); | |
} | |
for(y=-b;y<b;y=y+1) // vykreslení hyperboloidu pomocí bodu ze smeru x | |
for(z=-c;z<c;z=z+1) | |
{ | |
x = sqrt((1-(y*y)/(b*b)+(z*z)/(c*c))*(a*a)); | |
glBegin(GL_POINTS); | |
rr=1-(y+a/2)/a; | |
gg=(y+a/2)/a; | |
bb=(y+a/2)/a; | |
glColor3f(rr, gg, bb); | |
glVertex3f(x,y,z); | |
glColor3f(rr, gg, bb); | |
glVertex3f(-x,y,z); | |
glEnd(); | |
} | |
glColor3f(1.0f, 0.0f, 0.0f); | |
glTranslatef(px,-150,0); | |
glTranslatef(py,-150,0); | |
glFlush(); | |
glutSwapBuffers(); | |
} | |
//--------------------------------------------------------------------- | |
// Tato funkce je volana pri stlaceni ASCII klavesy | |
//--------------------------------------------------------------------- | |
void onKeyboard(unsigned char key, int x, int y) | |
{ | |
if (key==27) exit(0); | |
if (key == 'x') horiz += 1.0; | |
if (key == 'X') horiz -= 1.0; | |
if (key == 'y') vert += 1.0; | |
if (key == 'Y') vert -= 1.0; | |
if (key == 'z') zet += 1.0; | |
if (key == 'Z') zet -= 1.0; | |
if (key == 'r') uhel++; | |
if (key == 'R') uhel--; | |
if (key == 'p') px++; | |
if (key == 'P') px--; | |
if (key == 'q') py++; | |
if (key == 'Q') py--; | |
onDisplay(); | |
} | |
//--------------------------------------------------------------------- | |
// Hlavni funkce konzolove aplikace | |
//--------------------------------------------------------------------- | |
int main(int argc, char **argv) | |
{ | |
glutInit(&argc, argv); | |
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); | |
glutCreateWindow("hyperboloid");// vytvoreni okna pro kresleni | |
glutReshapeWindow(550, 450); // zmena velikosti okna | |
glutPositionWindow(100, 100); // pozice leveho horniho rohu okna | |
glutDisplayFunc(onDisplay); // registrace funkce volane pri prekreslovani okna | |
glutReshapeFunc(onResize); // registrace funkce volane pri zmene velikosti okna | |
glutKeyboardFunc(onKeyboard); // registrace funkce volani pri stlaceni klavesy | |
glEnable(GL_DEPTH_TEST); | |
//glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); | |
glutMainLoop(); // nekonecna smycka, kde se volaji zaregistrovane funkce | |
return 0; // navratova hodnota vracena operacnimu systemu | |
} | |
//--------------------------------------------------------------------- | |
// Konec zdrojoveho souboru | |
//--------------------------------------------------------------------- |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//--------------------------------------------------------------------- | |
// Program otevre jedno hlavni okno a vykresli do nej 3D elipsoid pomocí bodù | |
// Klavesami x, z, y se nastavuje poloha kamery, klavesou r rotace elipsoidu | |
// Klavesami p a q se nastavuje poloha elipsoidu | |
// Program lze ukoncit stiskem klavesy ESC. | |
//--------------------------------------------------------------------- | |
#include <glut.h> // hlavickovy soubor funkci GLUTu | |
//#include <stdlib.h> | |
#include <math.h> | |
float vert=10.0; | |
float horiz=10.0; | |
int px=150; | |
int py=10; | |
float rr,gg,bb,zet=20.0; | |
float x,y,z, uhel=10; | |
float a=170,b=130,c=90; | |
//--------------------------------------------------------------------- | |
// Nastaveni souradneho systemu v zavislosti na velikosti okna | |
//--------------------------------------------------------------------- | |
void onResize(int w, int h) // w a h reprezentuje novou velikost okna | |
{ | |
glViewport(20, 20, w, h); // viditelna oblast pres cele okno | |
glMatrixMode(GL_PROJECTION); // zacatek modifikace projekcni matice | |
glLoadIdentity(); // vymazani projekcni matice (=identita) | |
glOrtho(-200, w, -200, h, -400, 400); // mapovani abstraktnich souradnic do souradnic okna | |
glMatrixMode(GL_MODELVIEW); | |
} | |
//--------------------------------------------------------------------- | |
// Tato funkce je volana pri kazdem prekresleni okna | |
//--------------------------------------------------------------------- | |
void onDisplay(void) | |
{ | |
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | |
glLoadIdentity(); | |
gluLookAt(horiz, vert, zet, | |
1.0f, 0.0f, 0.0f, | |
0.0f, 10.0f, 0.0f); | |
glClearColor(1.0, 1.0, 1.0, 0.0); // nastaveni mazaci barvy na cernou | |
glClear(GL_COLOR_BUFFER_BIT); // vymazani bitovych rovin barvoveho bufferu | |
glColor3f(0.0f, 0.0f, 0.0f); // nastaveni barvy pro kresleni | |
glColor3f(1.0f, 0.0f, 0.0f); | |
glLineWidth(2.0); | |
glPointSize(2.0); | |
glRotatef((float)uhel, 0.0f, 0.0f, 1.0f); | |
glTranslatef(px,0,0); | |
glTranslatef(0,py,0); | |
for(x=-a/1.8;x<a/1.8;x=x+2) // vykreslení elipsoidu pomocí bodu ze smeru z | |
for(y=-b/1.8;y<b/1.8;y=y+2) | |
{ | |
//if(((x*x)/(a*a)+(y*y)/(b*b)) < 1) | |
if(((x*x)/(a*a)+(y*y)/(b*b)) < 1) | |
{ | |
//z = sqrt((1-(x*x)/(a*a)-(y*y)/(b*b))*(c*c)); | |
z = sqrt((1-(x*x)/(a*a)-(y*y)/(b*b))*(c*c)); | |
glBegin(GL_POINTS); | |
rr=(x+c/2)/c; | |
gg=(x+c/2)/c; | |
bb=1-(x+c/2)/c; | |
glColor3f(rr, gg, bb); | |
glVertex3f(x,y,z); | |
glColor3f(rr, gg, bb); | |
glVertex3f(x,y,-z); | |
glEnd(); | |
} | |
} | |
for(x=-a/1.8;x<a/1.8;x=x+2) // vykreslení elipsoidu pomocí bodu ze smeru y | |
for(z=-c/1.8;z<c/1.8;z=z+2) | |
{ | |
//if(((x*x)/(a*a)+(z*z)/(c*c)) < 1) | |
if(((x*x)/(a*a)+(z*z)/(c*c)) < 1) | |
{ | |
//y = sqrt((1-(x*x)/(a*a)-(z*z)/(c*c))*(b*b)); | |
y = sqrt((1-(x*x)/(a*a)-(z*z)/(c*c))*(b*b)); | |
glBegin(GL_POINTS); | |
rr=(x+b/2)/b; | |
gg=1-(x+b/2)/b; | |
bb=(x+b/2)/b; | |
glColor3f(rr, gg, bb); | |
glVertex3f(x,y,z); | |
glColor3f(rr, gg, bb); | |
glVertex3f(x,-y,z); | |
glEnd(); | |
} | |
} | |
for(y=-b/1.8;y<b/1.8;y=y+1) // vykreslení elipsoidu pomocí bodu ze smeru x | |
for(z=-c/1.8;z<c/1.8;z=z+1) | |
{ | |
//if(((y*y)/(b*b)+(z*z)/(c*c)) < 1) | |
if(((y*y)/(b*b)+(z*z)/(c*c)) < 1) | |
{ | |
//x = sqrt((1-(y*y)/(b*b)-(z*z)/(c*c))*(a*a)); | |
x = sqrt((1-(y*y)/(b*b)-(z*z)/(c*c))*(a*a)); | |
glBegin(GL_POINTS); | |
rr=1-(y+a/2)/a; | |
gg=(y+a/2)/a; | |
bb=(y+a/2)/a; | |
glColor3f(rr, gg, bb); | |
glVertex3f(x,y,z); | |
glColor3f(rr, gg, bb); | |
glVertex3f(-x,y,z); | |
glEnd(); | |
} | |
} | |
glColor3f(1.0f, 0.0f, 0.0f); | |
glTranslatef(px,-150,0); | |
glTranslatef(py,-150,0); | |
// glutWireSphere(120.0f, 16, 16); | |
// glutWireTeapot(100); | |
// glutWireTorus(50,100,16,16); | |
// glutWireCone(100,100,16,16); | |
glFlush(); | |
glutSwapBuffers(); | |
} | |
//--------------------------------------------------------------------- | |
// Tato funkce je volana pri stlaceni ASCII klavesy | |
//--------------------------------------------------------------------- | |
void onKeyboard(unsigned char key, int x, int y) | |
{ | |
if (key==27) exit(0); | |
if (key == 'x') horiz += 1.0; | |
if (key == 'X') horiz -= 1.0; | |
if (key == 'y') vert += 1.0; | |
if (key == 'Y') vert -= 1.0; | |
if (key == 'z') zet += 1.0; | |
if (key == 'Z') zet -= 1.0; | |
if (key == 'r') uhel++; | |
if (key == 'R') uhel--; | |
if (key == 'p') px++; | |
if (key == 'P') px--; | |
if (key == 'q') py++; | |
if (key == 'Q') py--; | |
onDisplay(); | |
} | |
//--------------------------------------------------------------------- | |
// Hlavni funkce konzolove aplikace | |
//--------------------------------------------------------------------- | |
int main(int argc, char **argv) | |
{ | |
glutInit(&argc, argv); | |
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); | |
glutCreateWindow("Implicitni Elipsoid");// vytvoreni okna pro kresleni | |
glutReshapeWindow(550, 450); // zmena velikosti okna | |
glutPositionWindow(100, 100); // pozice leveho horniho rohu okna | |
glutDisplayFunc(onDisplay); // registrace funkce volane pri prekreslovani okna | |
glutReshapeFunc(onResize); // registrace funkce volane pri zmene velikosti okna | |
glutKeyboardFunc(onKeyboard); // registrace funkce volani pri stlaceni klavesy | |
glEnable(GL_DEPTH_TEST); | |
//glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); | |
glutMainLoop(); // nekonecna smycka, kde se volaji zaregistrovane funkce | |
return 0; // navratova hodnota vracena operacnimu systemu | |
} | |
//--------------------------------------------------------------------- | |
// Konec zdrojoveho souboru | |
//--------------------------------------------------------------------- |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment