- •Учебник
- •Оглавление
- •Введение
- •Глава 1
- •I. Установка
- •II. Удаление
- •Глава 2. Первый проект
- •Глава 3. Создание сцены в режиме design time
- •Создание объектов:
- •Глава 4. Примитивные объекты. Вкладка Basic geometry.
- •Глава 5. Ориентация, координаты.
- •Глава 6. Движение.
- •Глава 7. Как узнать, сколько сейчас fps?
- •Глава 8. Полноэкранный режим.
- •Глава 9. Работа с материалами.
- •I. Прямое обращение к .Material
- •Глава 10. Использование 3d моделей.
- •I. Форматы моделей
- •Глава 11. Прокси объекты.
- •Глава 12. Создание земной поверхности с glTerrainRenderer.
- •Глава 13. Создание земной поверхности с glFreeForm.
- •Глава 14. Итоги работы с glTerainrender и glFreeForm.
- •Глава 15. Создание земной поверхности с glHeightField.
- •Глава 15. Создание неба.
- •Глава 16. GlAtmosphere.
- •Глава 17. Спецэффекты.
- •I. Огонь
- •II. Молния
- •III. Дождь
- •IV. Снег
- •VI. Блики от источников света
- •Глава 18. Растительность.
- •I. Деревья и кустарники
- •II. Трава
- •Глава 19. Работа со шрифтами и вывод надписей.
- •I. Вывод текста через компонент glWindowsBitmapFont
- •II. Проблема с glWindowsBitmapFont в Windows Vista
- •Глава 20. Выделение объекта мышкой.
- •Глава 21. Создание сцены в режиме runtime.
- •Глава 22. Тени.
- •Глава 23. Туман.
- •Глава 24. Vbo или расширение arb_vertex_buffer_object в OpenGl.
- •Глава 25. Fbo или расширение ext_framebuffer_object в OpenGl.
- •Глава 26. Рисование на канве.
- •Глава 27. Использование чистого OpenGl.
- •Глава 28. Звуки.
- •I. Проигрывание звуков с помощью bass
- •II. Проигрывание звуков с помощью fmod
- •III. Проигрывание звуков с помощью OpenAl
- •Глава 29. Игровое меню.
- •Глава 30. Примитивная физика dce.
- •Глава 31. Физика ode.
- •II. Основы библиотеки ode(: tglodeManager и tglodeJointList) на примере создания подобия боулинга.
- •Глава 32. Физика Newton.
- •Глава 33. Ручная проверка коллизий.
- •V. Ручная проверка коллизии
- •Глава 34. Шейдеры. Терменология.
- •Глава 35. Шейдеры. История и компоненты.
- •Глава 36. Шейдеры glsl. Введение.
- •Глава 37. Шейдеры glsl. Использование без компонентов. Самый примитивный шейдер.
- •Глава 38. Шейдеры glsl. Немного о спецификации. Типы данных и переменные
- •Стандартные функции
- •Поддерживаемые компоненты векторов
- •Глава 40. Шейдеры glsl. Текстурирование.
- •Глава 41. Шейдеры glsl. Использование без компонентов. Мультитекстурирование. Смешение трёх цветов по базовой карте.
- •Глава 42. Шейдеры glsl. Использование через компонент glslShader. Часть первая – Первые шаги.
- •Глава 43. Шейдеры glsl. Использование через компонент glslShader. Часть вторая – знакомимся со светом. Передача параметров в шейдер.
- •Глава 44. Шейдеры glsl. Использование через компонент glslShader. Часть третья – текстуры.
- •Глава 45. RenderMonkey.
- •Глава 46. Оптимизация программы.
- •Глава 47. Практика. Создание мира
- •Приложение
- •I. Типы векторов и матриц
- •II. Работа с векторами
- •III. Работа с матрицами
- •IV. Методы объектов glScene
- •Предметный указатель по компонентам glScene
Глава 5. Ориентация, координаты.
Небольшое замечание, системы координат будут рассмотрены применительно к трёхмерному пространству.
Итак:
•В GLScene существует две системы координат: глобальная и локальная. Глобальная (она же абсолютная) система координат – это система координат самой сцены и виевера (что оконного, что полноэкранного). А свою собственную – локальную систему координат имеет каждый объект сцены, включая камеру, источник света и любой другой объект. То есть абсолютная система координат одна, а локальных много – столько локальных систем, сколько объектов в сцене. В любой локальной системе координат центр объекта это всегда три нуля по всем осям (x=0,y=0,z=0), а в глобальной вовсе не обязательно ноль, это зависит от позиции объекта. В глобальной системе координат объект движется куда угодно, а в это время локальная система координат движется вместе с объектом, всегда оставаясь «нулём в его центре». Однако можно «прицепить» к любому объекту другой, например, с помощью функции AddNewChild. Тогда локальная система координат родителя (Parent) станет для детёныша – Child-а глобальной. А настоящая глобальная (абсолютная) система координат вообще перестанет на «детёныша» действовать.
•В GLScene у каждого объекта obj предусмотрена пара функций – одна obj.LocalToAbsolute переводит локальные координаты относительно данного объекта в глобальные, а вторая obj.AbsoluteToLocal наоборот трансформирует абсолютные координаты в локальные.
•GLScene и OpenGL, имеют систему координат содержашею три оси, для лутшего представления в нём принято принимать ось «X» направленную вправо-влево, ось «Y» вверх-вниз, а ось «Z» глубиной. (рис 2 )
р ис 2
•Для того чтоб камера смотрела на некий объект, нужно установить этот объект в свойстве TargetObject. После этого камера будет смотреть на объект даже если его переместить, но двигаться за ним не будет.
•Еще надо учитывать то, что координаты камеры и объекта не должны совпадать (в этом случае камера будет просто смотреть из объекта и не видеть его - так же как человек не видит своё лицо).
•Чтобы легче было понять, как объекты расположены друг относительно друга и куда они движутся можно включить отображение осей координат объектов: свойство ShowAxes:=True; (x – красная ось, y- зелёная, z – синяя).
•Понятно, что если речь идёт о трёхмерных системах координат, то все операции осуществляются с тройками чисел. То есть с x-ами,y-ами и z-ами. Для облегчения операций с этими числами в GLScene (как и во всех других известных мне движках) используются векторы. Основной класс здесь – TVector – это одномерный массив-матрица. Скажем если объявить Vec: TVector, то Vec[0] – это x, Vec[1] – это y, Vec[2] – это z. иентация – это вектор. То есть направленный отрезок. Здесь у людей знакомых с математикой и не знакомых с трёхмерщиной возникает вопрос – а почему, например, в классе TVector только три-четыре цифры, вместо шести? Если это координаты острия, то где же координаты начала отрезка? На самом деле начало отрезка – это всегда (x=0,y=0,z=0) локальной системы координат. Типов как TVector бывает много, и все они описаны в модуде VectorTypes(этот модуль подключать не обезательно так как он будет подключен модулем VectorGeometry). Описания смотрите в приложении I. «Типы векторов и матриц». Кроме их всех можно использовать просто тип TVector.
•У всех объектов есть свойство Position, в котором записаны их координаты. Свойство имеет тип TVector. Чтобы взять из свойства Position вектор нужно обратится к свойству Object.Position.AsVector.
• В визуальной оболочке Delphi тип TVector выражен с помошью типа TGLCoordinates. Этот тип имеют все координатные свойства обектов. Он служит для удобной работы с координатами. На рис 3 показано свойство Position и его значения. Координаты можно менять с помощью значений X, Y, Z, прямо в инспекторе объектов или через специальное окно XYZ editor, как показано на рис 3 (справа).
рис 3
В коде координаты можно менять либо через присваивание:
Object1. Position.X:=1;
Object1. Position.Y:=2;
Object1. Position.Z:=3;
Либо с помощью процедуры SetPoint:
Object1. Position.SetPoint(1,2,3);
Либо процедурой Translate(tx, ty, tz), где tx, ty, tz –на сколько нужно изменить координаты X, Y, Z соответственно:
Object1. Position.Translate(0.01, 0, 0);
•Так же у всех объектов есть свойства, регулирующие углы поворота относительно осей: PitchAngle – угол поворота относительно оси X, TurnAngle – относительно оси Y, RollAngle – относительно оси Z.
Задать их в режиме runtime можно так:
Object1.PitchAngle:=90;
Object1.TurnAngle:=80;
Object1.RollAngle:=30;
Ещё есть процедуры: Pitch, Turn, Roll, которые поворачивают объект на определённый угол вокруг оси X, Y, Z. Пример:
Object1.Pitch(10);
Object1.Turn(20);
Object1.Roll(30);
Процедура ResetAndPitchTurnRoll(Pitch, Turn, Roll) – сбрасывает текущие значения поворотов и устанавливает новые.
•Кроме того у объектов есть свойства Direction(вектор направления) и UP(вектор вверх), полностью описываюшие положение обекта в пространстве. По сути это координатные лучи той самой локальной системы координат объекта. Причём Up - это вектор "от центра объекта вверх", а Direction - "от центра вперёд" но эти векторы можно перенаправить. Оба вектора могут принимать значение длины равное 1, то есть важно лишь их направление! Чаше эти векторы откладываются на осях (то есть один из трёх координат равен 1, а два остальных – 0). По умолчанию Up направлен по оси «Y» (то есть имеет значение (0,1,0)) а вектор Direction по оси «Z» (то есть имеет значение (0,0,1)). Для того чтобы получить
минусовые, т.е. «обратно направленные по отношению локального нуля» Up и Direction их можно
умножить на VectorNegate, то есть на три -1.
•Нужно помнить, что чем ниже расположены объекты в GLScene Editor’е, тем позже они будут рисоваться, т.е. объекты, лежащие ниже в списке могут заслонять собой те, которые выше.