Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Глава 4. Ориентация и координаты↑ Стр 1 из 21Следующая ⇒ Содержание книги
Похожие статьи вашей тематики
Поиск на нашем сайте
В OpenGL существуют две системы координат: глобальная и локальная. Глобальная (она же абсолютная) система координат — это система координат компонента GLSceneViewer. Локальную систему координат имеет каждый объект сцены, включая камеру, источник света и любой другой. То есть абсолютная система координат одна, а локальных — сколько объектов в сцене. В любой локальной системе координат положение объекта это всегда три нуля по всем осям (X=Y=Z=0), а в глобальной не обязательно. Объект может иметь «родителя», и тогда локальная система координат родителя (Parent) станет для него глобальной, а настоящая глобальная (абсолютная) система координат вообще перестанет к нему относиться. В связи с этим в GLScene у каждого объекта предусмотрена пара функций:
В OpenGL (и GLScene) принята система координат, в которой ось Y направлена вверх, ось Z вперёд, а X вправо. Для того, чтобы камера всегда смотрела на некоторый объект, независимо от его положения, нужно установить этот объект в свойстве TargetObject. После этого камера будет автоматически нацеливаться на объект. Понятно, что координаты камеры и объекта не должны совпадать (в этом случае камера будет просто смотреть из объекта и не видеть его - так же как человек не видит своё лицо). Чтобы легче было понять, как объекты расположены друг относительно друга и куда они движутся можно включить отображение осей локальных координат объектов — свойство ShowAxes (X — красная ось, Y — зелёная, Z — синяя). Свойство Position (и не только оно) задаётся типом TGLCoordinates. Он служит для удобной работы с координатами. Его можно менять с помощью значений X, Y, Z прямо в инспекторе объектов. Рассмотрим основные свойства этого типа: X, Y, Z, W и DirectX/Y/Z/W — собственно координаты AsVector, AsAffineVector, AsPoint2D, AsString — возвращают координаты в виде четырех-, трех-, двухкомпонентного вектров и строки соответственно. Векторы в GLScene задаются как массивы, в которых [0] — это X, [1] — Y, [2] — Z и [3] — W. Подробнее про векторы см. в Приложении I. «Типы векторов и матриц». SetPoint — устанавливает координаты для свойства Position (оно имеет смысл точки) SetVector — аналогично для свойств Direction, Up, Left, Scale (они имеют смысл вектора) Также у всех объектов есть свойства, регулирующие углы поворота относительно осей: PitchAngle — текущий угол поворота относительно оси X, TurnAngle — Y, RollAngle — Z. Процедуры же Pitch, Turn, Roll поворачивают объект вокруг осей X, Y, Z. Процедура ResetAndPitchTurnRoll сбрасывает текущие значения поворотов и устанавливает новые. Кроме того, у объектов есть свойства Direction (вектор «вперёд»), Up (вектор «вверх») и Left (вектор «влево»), полностью описывающие положение объекта в пространстве. По сути это направления координатных осей Z, Y, X локальной системы координат объекта относительно родительской. По умолчанию Up направлен по оси Y (имеет значение (0;1;0)) а вектор Direction по оси Z (0;0;1). Рассмотрим рисунок ниже. Шар имеет Direction (0;0;1), Up (0;1;0) и является родителем для конуса. Каковы Direction и Up конуса? Синяя ось конуса, отображающая Direction, параллельна зеленой оси шара, отображающей его Up, который равен (0;1;0). Следовательно, Direction у конуса тоже (0;±1;0). Зеленая ось конуса (его Up) параллельна красной оси шара (его Left, он по определению равен векторному произведению Direction на Up и численно (1;0;0)). Значит, у конуса Up (±1;0;0).
Глава 5. Компонент GLCamera
Камера, пожалуй, один из главных компонентов каждого проекта. Именно она показывает нам то, что мы создали в сцене. В проектах может быть любое количество камер, но обычно требуется всего одна. Рассмотрим свойства GLCamera:
Глава 6. Движение
Реализуем простое движение камеры. Создайте проект, подобный Hello, GLScene!, и подключите модуль GLKeyboard для работы с клавиатурой. В событии OnProgress каденсера запишите следующее: if IsKeyDown(VK_ESCAPE) then Close;
// Движение вперед/назад по клавишам W/S (Ц/Ы) if IsKeyDown(ord('W')) then GLCamera1.Move(2*deltaTime); if IsKeyDown(ord('S')) then GLCamera1.Move(-2*deltaTime); // Движение вправо/влево по клавишам D/A (В/Ф) if IsKeyDown(ord('D')) then GLCamera1.Slide(2*deltaTime); if IsKeyDown(ord('A')) then GLCamera1.Slide(-2*deltaTime); // Движение влево/вправо по клавишам Z/X (Я/Ч) if IsKeyDown(ord('Z')) then GLCamera1.Lift(2*deltaTime); if IsKeyDown(ord('X')) then GLCamera1 Lift(-2*deltaTime); Запускаем проект и видим, что мы можем перемещать камеру по сцене. Теперь добавим управление мышью. Это можно сделать двумя способами. 1) Сложный. Поместите из вкладки GLScene Utils на форму GLNavigator . У него в свойстве MovingObject выберите GLCamera1 (это объект, который будет перемещаться). Затем добавьте оттуда же GLUserInterface и установите ему свойство GLNavigator. Свойство MouseSpeed — это скорость реакции мыши, сделаем её равной 10. Во время работы программы нужно вручную активировать этот компонент, также желательно скрыть курсор мыши. Для этого добавьте в Form1.OnCreate строки GLUserInterface1.MouseLookActive:=true; GLSceneViewer1.Cursor:=crNone; А в событие OnProgress Cadencer’а добавьте: GLUserInterface1.Mouselook; GLUserInterface1.MouseUpdate; Всё. Запускаем проект и смотрим, что получилось. Демка: Demos\meshes\actortwocam Свойства компонента GLNavigator:
2) Более простой. Создадим GLDummyCube и поместим в него камеру. Также объявим две глобальные переменные: xangle: single = 0 и yangle: single = 90. В OnProgress каденсера запишем: xangle:=(Mouse.CursorPos.X-(Screen.Width div 2))* 0.1/(1+deltaTime); yangle:=-(Mouse.CursorPos.Y-(Screen.Height div 2))* 0.1/(1+deltaTime); GLCamera1.Turn(xangle); GLDummyCube1.Pitch(yangle); Нельзя вращать камеру сразу по двум осям, т. к. она перекосится, поэтому мы создали DummyCube и вращаем каждый объект только по одной оси.
Глава 7. Всё о GLCadencer
GLCadencer («каденсер») находится на вкладке GLScene. Это один из важнейших компонентов. Он автоматически вызывается после отрисовки кадра. Время, прошедшее с последнего рендинга, передаётся в событие OnProgress как параметр deltaTime.
При завершении программы каденсер следует останавливать, чтобы он не вызвал OnProgress, когда часть используемых объектов уже освобождены.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2016-04-19; просмотров: 1155; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.133.131.241 (0.009 с.) |