Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник по GLScene.doc
Скачиваний:
255
Добавлен:
16.12.2018
Размер:
7.18 Mб
Скачать

Глава 5. Ориентация, координаты.

Небольшое замечание, системы координат будут рассмотрены применительно к трёхмерному пространству.

Итак:

•В GLScene существует две системы координат: глобальная и локальная. Глобальная (она же абсолютная) система координат – это система координат самой сцены и виевера (что оконного, что полноэкранного). А свою собственную – локальную систему координат имеет каждый объект сцены, включая камеру, источник света и любой другой объект. То есть абсолютная система координат одна, а локальных много – столько локальных систем, сколько объектов в сцене. В любой локальной системе координат центр объекта это всегда три нуля по всем осям (x=0,y=0,z=0), а в глобальной вовсе не обязательно ноль, это зависит от позиции объекта. В глобальной системе координат объект движется куда угодно, а в это время локальная система координат движется вместе с объектом, всегда оставаясь «нулём в его центре». Однако можно «прицепить» к любому объекту другой, например, с помощью функции AddNewChild. Тогда локальная система координат родителя (Parent) станет для детёныша – Child-а глобальной. А настоящая глобальная (абсолютная) система координат вообще перестанет на «детёныша» действовать.

•В GLScene у каждого объекта obj предусмотрена пара функций – одна obj.LocalToAbsolute переводит локальные координаты относительно данного объекта в глобальные, а вторая obj.AbsoluteToLocal наоборот трансформирует абсолютные координаты в локальные.

•GLScene и OpenGL, имеют систему координат содержашею три оси, для лутшего представления в нём принято принимать ось «X» направленную вправо-влево, ось «Y» вверх-вниз, а ось «Z» глубиной. (рис 2 )

р ис 2

Н о это не значит, что мы всегда буде смотреть на сцену (на её глобальную систему координат), или на обект (его локальную систему) таким образам! Запомните, камера (GLCamera) может перемешается в любую точку сцены и смотреть в

любом направлении! У нас на экране будет отображаться только то, что видит камера.

•Для того чтоб камера смотрела на некий объект, нужно установить этот объект в свойстве 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’е, тем позже они будут рисоваться, т.е. объекты, лежащие ниже в списке могут заслонять собой те, которые выше.