OpenGL в Delphi

       

Пространство модели нашего собственного модельера




Оси координат красиво подписаны объемными буквами, а по трем плоскостям нанесена разметка, которую будем называть сеткой Размер сетки ограничивается длиной осевых линий. Площадка, как и все остальные элементы, строится только для удобства ориентирования в пространстве, объекты могут располагаться где угодно, без каких-либо ограничений.
В правой части экрана располагается панель, содержащая элементы управления: компоненты класса TUpDown, позволяющие устанавливать точку зрения в любое место в пространстве, а также компонент того же класса, позволяющий менять длину осевых линий.
Кроме того, на панели располагаются кнопки, отвечающие за чтение/запись проектируемой модели, а также кнопка "Освежить" - перерисовка экрана. Внизу панели помещены несколько компонентов класса TCheckВох, задающих режимы рисования: наличие осей, сетки, тумана и площадки.
Так, по нажатию на кнопки элемента с надписью "Расстояние" можно приближать или удалять точку зрения к пространству модели, элементы "Сдвиг" позволяют передвигать точку зрения по соответствующей оси, а элементы "Угол" - поворачивать модель в пространстве относительно указанной оси Пара замечаний по поводу этих действий. Перспектива задается с помощью Команды glFrustum:

glFrustum (vLeft, vRight, vBottom, vTop, zNear, zFar);

При нажатии на кнопки элемента "Расстояние" (компонент назван udDistance) изменяются значения параметров перспективы в зависимости от того, какая нажата кнопка, нижняя или верхняя:

If udDistance.Position < Perspective then begin
vLeft := vLeft + 0.025;
vRight := vRight - 0.025;
vTop := vTop - 0.025;
vBottom := vBottom + 0.025;
end
else If udDistance.Position > Perspective then begin
vLeft := vLeft - 0.025;
vRight := vRight + 0.025;
vTop := vTop + 0.025;
vBottom := vBottom - 0.025;
end;
Perspective := udDistance.Position;

Переменная Perspective - вспомогательная и хранит значение свойства Position объекта.
После изменения установок проекции экран перерисовывается. Здесь я неожиданно столкнулся с небольшой проблемой, связанной с тем, что стандартный компонент класса TCheckBox работает не совсем корректно. Вы можете заметить, что первое нажатие на кнопку срабатывает так, как будто была нажата кнопка с противоположным действием Я потратил много времени на устранение этой ошибки, однако избавиться от нее так и не смог, по-видимому, ошибка кроется в самой операционной системе Решение я нашел в том, что самостоятельно описал все действия по обработке событий, связанных с компонентом: анализ положения курсора в пределах компонента, т. е. на какой кнопке он находится, включение таймер, по тику которого производятся соответствующие действия, и выключение его, когда курсор уходит с компонента Все эти действия проделываются в элементах, связанных с поворотом и сдвигом пространства модели, и вы можете сравнить соответствующие фрагменты кода. Конечно, программа стала громоздкой и менее читабельной, однако более простого решения проблемы найти не получилось.
Использование элементов управления для перемещения точки зрения наблюдателя является обычным для подобных приложений подходом, однако необходимо продублировать эти действия управлением с клавиатуры. Поэтому предусмотрена обработка нажатий клавиш 'X', 'Y' и 'Z' для поворотов пространства моделей по осям, а комбинация этих клавиш с <Alt> аналогична нажатию элементов сдвига по нужной оси. Если при этом удерживать еще и <Shift>, то соответствующие величины сдвига или поворота уменьшаются. Также введена клавиша, по которой можно быстро переместиться в привычную точку зрения (я назвал ее изометрической).
Шаг изменения величин поворота и сдвига можно менять, для чего соответствующие элементы управления имеют всплывающие меню, при выборе пунктов которых появляются дочерние окна (Рисунок 6.16).



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