[[oktatas:programozás:opengl|< OpenGL]]
====== OpenGL GLUT Linuxon ======
* **Szerző:** Sallai András
* Copyright (c) Sallai András, 2020
* [[https://creativecommons.org/licenses/by-sa/4.0/|CC Attribution-Share Alike 4.0 International]]
* Web: https://szit.hu
===== A GLUT =====
A GLUT lehetővé teszi egyszerű OpenGL programok írását.
A GLUT tartalmaz eseménykezelési lehetőségeket, egér és billentyűzetfigyelés.
A GLUT használatához emeled be a forráskódba a glut.h vagy a freeglut.h
fejléc fájlokat.
#include
#include
===== Szükséges csomagok telepítése =====
apt install libglu1-mesa-dev freeglut3-dev mesa-common-dev
===== Első program =====
#include
void display(void) {
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.5, 0.5, 0.0);
glBegin(GL_LINES);
glVertex3f(-0.5, 0.0, 0.0);
glVertex3f(0.5, 0.0, 0.0);
glEnd();
glFlush();
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE);
glutInitWindowSize(640, 450);
glutInitWindowPosition(200, 200);
glutCreateWindow("Hello Vilag!");
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
Fordítás:
g++ elso.cpp -o elso -lglut -lGLU -lGL
Futtatás:
./elso
===== OpenGL glut =====
#include
void displayTriangle(void) {
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0, 0.0, 0.8);
glBegin(GL_POLYGON);
glVertex3f(-1.0, -0.5, -0.4);
glVertex3f(1.0, -0.5, -0.4);
glVertex3f(0.0, 0.5, -0.4);
glEnd();
glFlush();
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE);
glutInitWindowSize(640, 450);
glutInitWindowPosition(200, 200);
glutCreateWindow("Helló Világ!");
glutDisplayFunc(displayTriangle);
glutMainLoop();
return 0;
}
===== Koordináta rendszer rajzolása =====
#include
void axes() {
glBegin(GL_LINES);
// x tengely
glColor3f(1, 0, 0);
glVertex3f(-1, 0, 0);
glVertex3f(1, 0, 0);
// y tengely
glColor3f(0, 1, 0);
glVertex3f(0, -1, 0);
glVertex3f(0, 1, 0);
// z tengely
glColor3f(0, 0, 1);
glVertex3f(0, 0, -1);
glVertex3f(0, 0, 1);
glEnd();
}
void display(void) {
glClear(GL_COLOR_BUFFER_BIT);
axes();
//forgatás x tengely mentén
glRotatef(15.0, 0.5, 0.0, 0.0);
//forgatás y tengely mentén
glRotatef(-30.0, 0.0, 0.5, 0.0);
glFlush();
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE);
glutInitWindowSize(640, 450);
glutInitWindowPosition(200, 200);
glutCreateWindow("Hello Vilag!");
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
Ahhoz hogy lássuk a z tengelyt is, elfordítottuk a koordinátatrendszert
a glRotatef() függvénnyel. Használható még a glRotated() függvény.
Szintaxisuk:
void glRotated( GLdouble szog,
GLdouble x,
GLdouble y,
GLdouble z);
void glRotatef( GLfloat szog,
GLfloat x,
GLfloat y,
GLfloat z);
Forgatás a különböző tengelyek körül:
//forgatás 30 fokkal az x tengely mentén
glRotatef(30.0, 1.0, 0.0, 0.0);
//forgatás 30 fokkal az y tengely mentén
glRotatef(30.0, 0.0, 1.0, 0.0);
//forgatás 30 fokkal az z tengely mentén
glRotatef(30.0, 0.0, 0.0, 1.0);
===== Koordináta rendszerben egy háromszög =====
#include
void axes() {
glBegin(GL_LINES);
// x tengely
glColor3f(1, 0, 0);
glVertex3f(-1, 0, 0);
glVertex3f(1, 0, 0);
// y tengely
glColor3f(0, 1, 0);
glVertex3f(0, -1, 0);
glVertex3f(0, 1, 0);
// z tengely
glColor3f(0, 0, 1);
glVertex3f(0, 0, -1);
glVertex3f(0, 0, 1);
glEnd();
}
void triangle(void) {
glColor3f(0.8, 0.8, 0);
glBegin(GL_POLYGON);
glVertex3f(0.2, 0.5, 0.0);
glVertex3f(0.5, 0.5, 0.0);
glVertex3f(0.5, 0.2, 0.0);
glEnd();
}
void display(void) {
glClear(GL_COLOR_BUFFER_BIT);
axes();
triangle();
//forgatás x tengely mentén
glRotatef(15.0, 0.5, 0.0, 0.0);
//forgatás y tengely mentén
glRotatef(-30.0, 0.0, 0.5, 0.0);
glFlush();
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE);
glutInitWindowSize(640, 450);
glutInitWindowPosition(200, 200);
glutCreateWindow("Hello Vilag!");
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
===== Forgatás =====
#include
void axes() {
glBegin(GL_LINES);
// x tengely
glColor3f(1, 0, 0);
glVertex3f(-1, 0, 0);
glVertex3f(1, 0, 0);
// y tengely
glColor3f(0, 1, 0);
glVertex3f(0, -1, 0);
glVertex3f(0, 1, 0);
// z tengely
glColor3f(0, 0, 1);
glVertex3f(0, 0, -1);
glVertex3f(0, 0, 1);
glEnd();
}
void triangle(void) {
glColor3f(0.8, 0.8, 0);
glBegin(GL_POLYGON);
glVertex3f(0.2, 0.5, 0.0);
glVertex3f(0.5, 0.5, 0.0);
glVertex3f(0.5, 0.2, 0.0);
glEnd();
}
void display(void) {
glClear(GL_COLOR_BUFFER_BIT);
axes();
triangle();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
static float rot = -30;
//forgatás x tengely mentén
glRotatef(15.0, 0.5, 0.0, 0.0);
//forgatás y tengely mentén
glRotatef(rot, 0.0, 0.5, 0.0);
rot += 1;
glutSwapBuffers();
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowSize(640, 450);
glutInitWindowPosition(200, 200);
glutCreateWindow("Hello Vilag!");
glutDisplayFunc(display);
glutIdleFunc(display);
glutMainLoop();
return 0;
}
===== Billentyűzet figyelése =====
#include
// forgatás x tengely körül
double rX=15;
// forgatás y tengely körül
double rY=-30;
void axes() {
glBegin(GL_LINES);
// x tengely
glColor3f(1, 0, 0);
glVertex3f(-1, 0, 0);
glVertex3f(1, 0, 0);
// y tengely
glColor3f(0, 1, 0);
glVertex3f(0, -1, 0);
glVertex3f(0, 1, 0);
// z tengely
glColor3f(0, 0, 1);
glVertex3f(0, 0, -1);
glVertex3f(0, 0, 1);
glEnd();
}
void triangle(void) {
glColor3f(0.8, 0.8, 0);
glBegin(GL_POLYGON);
glVertex3f(0.2, 0.5, 0.0);
glVertex3f(0.5, 0.5, 0.0);
glVertex3f(0.5, 0.2, 0.0);
glEnd();
}
void display(void) {
glClear(GL_COLOR_BUFFER_BIT);
axes();
triangle();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRotatef( rX, 1.0, 0.0, 0.0 );
glRotatef( rY, 0.0, 1.0, 0.0 );
glutSwapBuffers();
}
void keyboard(int key, int x, int y) {
if (key == GLUT_KEY_RIGHT) {
rY += 5;
} else if (key == GLUT_KEY_LEFT) {
rY -= 5;
} else if (key == GLUT_KEY_DOWN) {
rX -= 5;
} else if (key == GLUT_KEY_UP) {
rX += 5;
}
// a képernyő újrarajzolása
glutPostRedisplay();
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowSize(640, 450);
glutInitWindowPosition(200, 200);
glutCreateWindow("Hello Vilag!");
glutDisplayFunc(display);
glutSpecialFunc(keyboard);
glutMainLoop();
return 0;
}
===== Pontmeghatározó függvények =====
void glVertex2s(GLshort x, GLshort y);
void glVertex2i(GLint x, GLint y);
void glVertex2f(GLfloat x, GLfloat y);
void glVertex2d(GLdouble x, GLdouble y);
void glVertex3s(GLshort x, GLshort y, GLshort z);
void glVertex3i(GLint x, GLint y, GLint z);
void glVertex3f(GLfloat x, GLfloat y, GLfloat z);
void glVertex3d(GLdouble x, GLdouble y, GLdouble z);
void glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w);
void glVertex4i(GLint x, GLint y, GLint z, GLint w);
void glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
void glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
Az x, y, z, és w a vertex koordináták.
void glVertex2sv(const GLshort * v);
void glVertex2iv(const GLint * v);
void glVertex2fv(const GLfloat * v);
void glVertex2dv(const GLdouble * v);
void glVertex3sv(const GLshort * v);
void glVertex3iv(const GLint * v);
void glVertex3fv(const GLfloat * v);
void glVertex3dv(const GLdouble * v);
void glVertex4sv(const GLshort * v);
void glVertex4iv(const GLint * v);
void glVertex4fv(const GLfloat * v);
void glVertex4dv(const GLdouble * v);
A v egy mutató egy tömbre, amely kettő, három vagy négy elemet tartalmaz.
Két elem az x és y, három elem x, y és z, a négy elem x, y, z és w.
A függvények végén, egy vagy két betű áll, amelyek megmondják, milyen paramétereket vár
a függvény. Lehetséges típusok:
^ jel ^ Adattípus ^ C-nyelv típus ^ OpenGL típus ^
| b | 8-bit integer | signed char | GLbyte |
| s | 16-bit integer | short | GLshort |
| i | 32-bit integer | long | GLint, GLsizei |
| f | 32-bit floating-point | float | GLfloat, GLclampf |
| d | 64-bit floating-point | double | GLdouble GLclampd |
| ub | 8-bit unsigned integer | unsigned char | GLubyte, GLboolean |
| us | 16-bit unsigned integer | unsigned short | GLushort |
| ui | 32-bit unsigned integer | unsigned long | GLunit, GLenum, GLbitfield |
===== Forrás =====
* http://www.codebind.com/linux-tutorials/install-opengl-ubuntu-linux/ (2020)
* http://math.hws.edu/graphicsbook/c3/s6.html (2020)