Трёхмерное openGL приложение на С++ (freeglut)

OpenGL (Open Graphics Library) — спецификация, определяющая независимый от языка программирования кросс-платформенный программный интерфейс для написания приложений, использующих двумерную и трёхмерную компьютерную графику.
Я уже писал о написании простейшего двумерного приложения. Теперь же напишем "приложение в объёме".
Для написания нам всё также понадобится библиотека glut. Можете ознакомится с её азами пройдя по ссылке выше.

Открыв и настроив вашу среду разработки, подключим такие заголовочные файлы:

#include <stdio.h>
#include <GL/freeglut.h>

Предопределим размеры окна и его заголовок.

#define WINDOW_TITLE_PREFIX "How2.org.ua tutorial"
int CurrentWidth = 800, CurrentHeight = 600, WindowHandle = 0;

Объявим прототипы функций:

void Initialize(int, char*[]);  /// инициализация  glut 
void InitWindow(int, char*[]);  // инициализация окна
void ResizeFunction(int, int);   // установка размеров окна
void RenderFunction(void);  // функция рендеринга

В функции инициализации вызовим функция инициализации окна и выведем в консоль версию opengl:

void Initialize(int argc, char* argv[]){
    InitWindow(argc, argv);
    fprintf(
        stdout,
        "INFO: OpenGL Version: %s\n",
        glGetString(GL_VERSION)
    );
}

Функция инициализирующая окно:

void InitWindow(int argc, char* argv[]){
       /* подробнее о функциях вызванных ниже по ссылке выще ;)  */
    glutInit(&argc, argv);
    glutSetOption(
        GLUT_ACTION_ON_WINDOW_CLOSE,
        GLUT_ACTION_GLUTMAINLOOP_RETURNS
    );
    glutInitWindowSize(CurrentWidth, CurrentHeight);  // размер окна
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
    WindowHandle = glutCreateWindow(WINDOW_TITLE_PREFIX);
    if(WindowHandle < 1) {
        fprintf(
            stderr,
            "ERROR: Could not create a new rendering window.\n"
        );
        exit(EXIT_FAILURE);
    }
    glutReshapeFunc(ResizeFunction);
    glutDisplayFunc(RenderFunction);
}

Функция resize (будет работать при изменении размера окна):

void ResizeFunction(int Width, int Height){
    CurrentWidth = Width;
    CurrentHeight = Height;
    glViewport(0, 0, CurrentWidth, CurrentHeight);
}

Ну а теперь, когда все приготовления кончились, рисуем треугольник (не будем делать объёмную фигуру, это долго, но делается аналогично - составлением плоских фигур):

GLfloat rtri;  // градус поворота
void RenderFunction(void){
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glOrtho(-200.0,200.0,-200.0,200.0,-200.0,200.0); ///зададим размеры координатной сетки
    glRotatef(rtri,0.0f,1.0f,1.0f); //вращение вокруг оси oy oz
    glBegin(GL_TRIANGLES);
            glColor3f(1.0f,0.0f,0.0f);      // Красный цвет
                    glVertex3f( -100.0, 0,0);  
            glColor3f(0.0f,1.0f,0.0f);      // Зеленный цвет
                    glVertex3f(0.0,100.0,0); 
            glColor3f(0.0f,0.0f,1.0f);      // Синий цвет
                    glVertex3f( 100.0f,0.0,0); 
    glEnd();
    glutSwapBuffers();
    glutPostRedisplay();
    rtri+=0.5f;             // Увеличение переменной вращения для треугольника
}

Функция main вызывает всё это добро к исполнению:

int main(int argc,char**argv) {
    Initialize(argc, argv);
    glutMainLoop();
    exit(EXIT_SUCCESS);
}

В linux компилируется командой:

Просмотров:   2176

Комментарии

чт, 11/22/2012 - 14:10

На VS 2010 при компиляции пишет: ссылка на неразрешенный внешний символ _WinMain@16 в функции ___tmainCRTStartup

чт, 11/22/2012 - 14:10

я тупанул и создал оконное приложение)

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

Plain text

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