Рисуем объёмные графики при помощи 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
Просмотров:   5939

Комментарии

Добавить комментарий

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.
CAPTCHA
Введи эти символы. Ато роботы одолели!