OpenGL в Delphi

В примере осуществляется выбор среди двадцати объектов со случайными координатами




При проектировании собственного модельера мы возьмем из этого примера некоторые приемы работы с объектами.
В программе вводится собственный тип для используемых геометрических объектов:

type
TGLObject = record // объект - треугольник
{вершины треугольника) vl : Array [0..1] of GLfloat;
v2 : Array [0..1] of GLfloat;
v3 : Array [0..1] of GLfloat;
color : Array [0..2] of GLfloat; // цвет объекта
end;

Объект, треугольник, состоит из трех вершин, для хранения координат каждой из которых используем массивы из двух вещественных чисел, X и Y. Цвет каждого объекта записывается в массиве из трех вещественных чисел.
Система объектов хранится в массиве:

Objects : Array [O..MaxObjs - 1] of TGLObject;

Массивы координат и цветов объектов при инициализации в начале работы приложения заполняются случайными числами. Воспроизведение массива геометрических объектов вынесено в отдельную процедуру по тем же причинам, что и в предыдущем примере; этой процедурой будем пользоваться в двух случаях: для собственно воспроизведения и для заполнения стека имен. Во втором случае помещаемые в стек имена объектов совпадают с номером элемента в массиве:

If mode = GL_SELECT then glLoadName(i.); // загрузка очередного имени

При нажатии кнопки мыши обращаемся к функции Deselect, код которой отличается от предыдущего примера только аргументом функции glRenderMode при ее втором вызове. Полученное имя выбранного элемента передаем в процедуру, перекрашивающую объект заданного номера и перерисовывающую экран. Поскольку все координаты случайны, мы убеждаемся, что действительно происходит выбор объекта.

Замечание
Очень важно подчеркнуть, что все, что воспроизводится между очередными вызовами glLoadName, считается одноименным Это очень удобно для выбора между комплексными геометрическими объектами, но отсутствие возможности явной командой прекратить именовать выводимые объекты требует продуманного подхода к порядку вывода объектов то, что не должно участвовать в выборе элементов, необходимо выводить до первого вызова glLoadName или не выводить вообще.

Разберем еще один полезный пример по этой теме, проект из подкаталога Ех07. Здесь выводится поверхность, построенная на основе 229 патчей, образующих модель, предоставленную Геннадием Обуховым (вообще-то картинка немного жутковата, Рисунок 6.2).



Содержание раздела