GameDev :: OpenGL @ Урок 6

Урок 6. Наша первая 3D программа:

В этот раз мы продолжим с вами изучать OpenGL. В этом уроке мы узнаем, как рисовать сферу, установим источник света, направление- одним словом нарисуем настоящий 3D рисунок.
Начнем по порядку. Давайте возьмем нашу функцию main(), которую мы написали на прошлых уроках, и изменим ее, т.е. адаптируем для работы с 3D приложениями.

void main(int argc,char **argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutInitWindowSize(400,500);
    glutInitWindowPosition(0,0);
    glutCreateWindow("OpenGL Lesson2");
    glClearColor(1,1,1,1);
    glutDisplayFunc(Display);
    glutMainLoop();
}

Первое, что мы должны изменить, это команду glutInitDisplayMode(), которая будет выглядеть так: glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); Это означает, что мы будем использовать в приложении двойную буферизацию, а также буфер глубины (или Z-буфер).

Теперь добавим в наше приложение источник света, для это определим пару переменных:
float pos[3]={-0.8,0.5,0};
float dir[3]={0,0,0};
pos[3]- это переменная, которая будет указывать месторасположение источника света (x,y,z).
dir[3] - это переменная, которая будет указывать на направление лучей света (вектора, который выходит из источника света, и "входит" в точку с координатами x,y,z).

Далее, нам нужно разрешить (включить) использования света, с помощью команд:
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);

Первая команда включает использования освещения, вторая указывает на использования освещения №0 (можно создавать от 0 до 8 различных источников).

А теперь давайте установим позицию и направление нашего источника с помощью команд:
glLightfv(GL_LIGHT0,GL_POSITION,pos);
pos- это наша переменная, которую мы создали раньше.
glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,dir);

В будущем, мы более подробно разберем такую тему, как использования света в приложениях OpenGL. А пока что, нам этого должно хватить для нормального (т.е. рабочего) 3D приложения. И еще, давайте включим в наше приложение поддержку глубины, а также цвета материалов:
glEnable(GL_DEPTH_TEST);
glEnable(GL_COLOR_MATERIAL);
Все. На этом наша новая функция готова. Вот как она теперь выглядит:

void main(int argc,char **argv)
{
    float pos[3]={-0.8,0.5,0};
    float dir[3]={0,0,0};
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(500,500);
    glutInitWindowPosition(100,0);
    glutCreateWindow("OpenGL 3D");
    glClearColor(0.1,0.2,0.4,1);
    glutDisplayFunc(Display);
    glutIdleFunc(Display); //функция Display будет вызываться, когда ничего не происходит (это нужно для анимации, в будущем :) ).

    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,dir);
    glLightfv(GL_LIGHT0,GL_POSITION,pos);

    glutMainLoop();
}

А сейчас нарисуем сферу. Для рисования сферы нам нужно создать объект типа GLUquadricObj с помощью функции gluNewQuadric. Сама функция для создания сферы выглядит, как: gluSphere(quadObj, 0.5, 10, 10);
Где quadObj- это указатель на объект типа GLUquadricObj. 2-й параметр- это радиус сферы, а два последние параметры- это число разбиений вокруг оси Z и число разбиений вдоль оси Z (ведь все сложные фигуры состоят из более простых, вроде точек, линий, треугольников). Чем большее будет разбиение, тем лучше будут выглядеть фигуры, но тем сложнее компьютеру будет нарисовать эту фигуру, и, соответственно, картинка будет притормаживать при анимации.
Наша функция Display (); будет выглядеть следующим образом:

void Display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    GLUquadricObj *qobj; //создаем указетель qobj на объект GLUquadricObj
    qobj=gluNewQuadric(); //создаем объект, типа GLUquadricObj
    glPushMatrix(); //сохраняем координаты (об этом в следующем уроке)
    gluSphere(qobj,0.5,30,30); //рисуем сферу
    glPopMatrix(); //возвращаемся к старым координатам
    glutSwapBuffers(); //меняем буфера местами (об этой технологии я говорил в 2 уроке).
}

К стати, не забудьте подключить glut.h
#include <GL/glut.h>

Теперь откомпилируйте приложение, и запустите его (вы можете также поэксперементировать с цветом фона, сферы, количеством разбиений, и т.д.). Вот что у нас получилось:

До встречи в следующем уроке!
Alex Salo

Навигация
Назад | Список уроков | Вперед
Используются технологии uCoz