Обращаю ваше внимание на то, что, работая с OpenGL, нам часто придется передавать данные в функции с обратным вызовом через глобальные переменные. Хотя желательно избегать использования глобальных переменных, но при обращении к функциям с обратным вызовом у нас просто нет иного выхода.

13Обращаю ваше внимание на то, что, работая с OpenGL, нам часто придется передавать данные в функции с обратным вызовом через глобальные переменные. Хотя желательно избегать использования глобальных переменных, но при обращении к функциям с обратным вызовом у нас просто нет иного выхода.

Графическое программирование

Первым делом нужно внести определенную коррекцию в функцию display (). Определим в ней тип данных для представления трехмерной точки:

typedef GLfloat point3[3];

Затем определим вершины исходного тетраэдра:

/* Вершины произвольного тетраэдра */ point3 vertices[4]={{0.0, 0.0, 0.0},{250.0, 500.0, 100.0}, {500.0, 250.0, 250.0},{250.0, 100.0, 250.0}};

/* Произвольная исходная точка */ point3 р={250.0,100.0,250.0}; Для формирования точек в программе будем использовать функцию glPoint3fv(). Одна из проблем, которая специфична именно для трехмерного случая, состоит в том, что формируемые точки не лежат в одной плоскости, а потому на двухмерном изображении трудно будет рассматривать трехмерную структуру. Чтобы "обойти" ее, не используя геометрические построения, о которых речь еще впереди, воспользуемся цветовым кодированием - цвет каждой формируемой точки будет нести информацию о ее положении в глубину. Это несколько облегчит восприятие изображения, хотя до полной иллюзии пространства при этом, конечно же, очень далеко. Ниже приведен текст функции формирования изображения display ().

void display() {

/* Вычислить и вывести на экран единственную новую точку */ int rand(); int i;

j=rand()%4; /* Случайным образом выбрать индекс вершины */

/* Вычислить координаты точки, расположенной на полпути между выбранной вершиной и точкой, сформированной в предыдущем цикле */

р[0] = (p[0]+vertices[j][0])/2.0; р[1] = (p[l]+vertices[j][l])/2.0; Р[2] = (p[2]+vertices[j][2])/2.0;

/* Вывести точку на экран */ glBegin(GL_POINTS);

glColor3f(р[0]/250.0,р[1]/250.0,р[2]/250.0);

glVertex3fv( р ); glEnd();

/* Заменить координаты прежней точки */

old.x=new.x; old.y=new.y; old.z=new.z;
glFlush();

⇐ Предыдущая| |Следующая ⇒