Рисуем объёмные графики при помощи openGL (glut) C++

Прежде всего подключим необходимые заголовочные файлы:

#include <GL/glut.h> #include <cmath>

Будем считать, что нам хочется нарисовать такую функцию:

float func(float x, float y) { return sin(x * y * 0.0001)*145; }

Главная функция программы при этом имеет вид стандартный для любой openGL программы:

int main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize(480, 480); glutInitWindowPosition(20, 86); glutCreateWindow(«3d how2.org.ua»); glClearColor(0, 0, 0, 1.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum(-100, 100, -100, 100, 100, 2000); // задаёт перспективу изображения. Подробнее: opengl.gamedev.ru/doc/?func=glFrustum glMatrixMode(GL_MODELVIEW); glutDisplayFunc(display); glutMainLoop(); }

В функции отображения — очищаем экран, «отодвигаемся» от изображения и вращаемся вокруг OX:

void display() { glClear(GL_COLOR_BUFFER_BIT); glPushMatrix(); glTranslatef(0, 0, -800); glRotatef(-30, 1, 0, 0);

После чего рисуем «сетку» в одном направлении:

for (float x = -480; x < 480; x += 10) { glBegin(GL_LINE_STRIP); for (float y = -480; y < 480; y += 10) { glVertex3f(x, y, func(x, y)); } glEnd(); }

Затем во втором:

for (float y = -480; y < 480; y += 10){ glBegin(GL_LINE_STRIP); for (float x = -480; x < 480; x += 10) { glVertex3f(x, y, func(x, y)); } glEnd(); }

После чего «выводим» всё это дельце:

glPopMatrix(); glutSwapBuffers(); }

В linux компилировать так:

g++ main.cpp -o main -lglut -lGL

 

Источник: malimar.ru

Читайте также  Отслеживаем столкновения двух круглых областей в SDL
teamviewer-com