Простые трехмерные построения: поворот объекта "мышкой"

По просьбе оставленной в гостевой книге сайта (пишите в гостевую книгу на сайте!!!) решил добавить эту учебную программу, которая не имеет отношения к изучению OpenGL - но позволит углубить знания Delphi. Текст программы построен на основе предыдущей программы и отличается только добавлением событий от манипулятора "мышь": нажатие кнопки, перемещение мыши, отпускание кнопки.


При запуске программы последовательно происходит 5 действия:

1. Cоздание формы - OnCreate, в обработчике этого события находятся строки отвечающие за настройку интерфейса: настройка скроллеров (значение от -180 до 180, один прижат вниз, другой к левому краю формы) и сама форма размером 400 на 400 пикселей (Form1.Width := 400 и Form1.Height := 400) на которой вольготно расположилась Panel (на поверхности которой и будет все рисоваться) занимая всю форму (Panel1.Align := alClient), далее в переменную DC получаем ссылку на устройство на котором будем рисовать - рисуем на поверхности компонента Panel1, уже знакомая процедура SetDCPixelFormat(DC) возвращает формат пикселя устройства Panel1, но необходимо заметить, что установлением флага pfd.dwFlags указываем OpenGL, что рисуем на поверхности компонента используя двойную буферизацию - проще это объяснить так: просим, что хотим - получаем что есть (но по максимуму). И тем что есть пользуемся - wglCreateContext(DC) - соглашаемся этим что-то пользоваться и пользуемся - wglMakeCurrent(DC,hrc). Далее включаем свет - и опять простое объяснение: даем понять программе, что будем использовать свет - glEnable ( GL_LIGHTING ), только один источник - glEnable ( GL_LIGHT0 ) и включаем свет - glEnable ( GL_DEPTH_TEST ).
2.Событие FormResize устанавливает видовые параметры - glMatrixMode, далее знакомые команды и новая команда - InvalidateRect (см.справку по командам). Пока не стоит сильно думать, что это здесь делается - оставте на потом!
3.Событие-перерисовка OnPaint отличается от предыдущих программ наличием BeginPaint...EndPaint - здесь все просто: при выполнении BeginPaint(Panel1.Handle,ps) - выводится изображение на поверхность компонента Panel1 - но в невидимый буфер, как только все нарисовано - выводим невидимый буфер на экран - SwapBuffers(DC) и разрешаем окно перерисовать (обновить) - EndPaint.
4. При корректном завершении работы программы OnDestroy происходит возврат на круги своя - все, что получили возвращается в исходное состояние - все ссылки и контекст удаляются. Прочитав справочную информацию и так все поимете (щелкая мышью по гиперссылкам-командам OpenGL с интересующими Вас командами).
5. Ну, а теперь сами события от мышки - при нажатии кнопки мыши (OnMouseDown) запоминаются координаты (где мышь нажата) и присваивается Mouse_ok:=true - это означает, что кнопка мыши нажата и пока не отпускается. Далее при перемещении мыши с нажатой кнопкой (OnMouseMove) происходит следующее: если Mouse_ok=true (кнопка нажата) - значению скроллера присваивается текущее положение скроллера + следующие значение, если количество пикселов, на которое переместился курсор мыши кратно (т.е. делится без остатка) значению Step (в нашем случае это 15). Далее происходит такое же событие что и при перемещении скроллера (потому как поменяли значение позиции скроллера). Меняя значение константы Step можно регулировать "чувствительность" объекта поворота к перемещению мышки. При отпускании кнопки мыши (OnMouseUp) Mouse_ok:=false (перестаем следить за перемещением мыши по поверхности Panel1) и запоминаем значения скроллеров.
к оглавлению к оглавлению


Для переноса кода программы в Delphi необходимо выполнить следующие действия:

1. Сохранить текст программы под любым именем в формате TXT - Программа / Сохранить код программы - в выпадающем списке диалога "Тип файла" выбрать "Текстовый файл (*.txt)".
2. Открыть свои новый текстовый файл в любом редакторе и скопировать весь текст в буфер обмена.
3. Запустить Delphi и начать новый проект - все элементы имеют свои названия по умолчанию, поэтому Вам не следует изменять их - это важно.
4. Перейти на вкладку проекта Events и выполнить двойной щелчок в полях OnCreate, OnDestroy, OnPaint и OnResize. Так же необходимо добавить 2 скроллера в любое место формы - панель инструментов Standart\ScrollBar и дважды щелкнуть по каждому скроллеру. И не забудьте добавить компонент Panel - рисуется все на его поверхности, далее преходим на вкладку Events (обязательно должен выбрана Panel1) и двойные клики на OnMouseDown (нажатие кнопки), OnMouseMove (перемещение мыши), OnMouseUp (отпустили кнопку).
5. Перейти к тексту программы Unit1, стереть его весь и на его место вставить текст из буфера обмена, можно воспользоваться комбинацией клавиш Ctrl+V.
6. Запустить Ваш новый проект - F9.
Если все сделали правильно - Вы получите тот же результат, что и в Book3D редакторе.

к оглавлению к оглавлению