![]() Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву ![]() Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Глава 4. Ориентация и координатыСодержание книги
Похожие статьи вашей тематики
Поиск на нашем сайте
В 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 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
При завершении программы каденсер следует останавливать, чтобы он не вызвал OnProgress, когда часть используемых объектов уже освобождены.
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2016-04-19; просмотров: 1179; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.221.84.179 (0.011 с.) |