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

II. Основы библиотеки ode(: tglodeManager и tglodeJointList) на примере создания подобия боулинга.

ODE (Open Dynamic Engine) – бесплатная библиотека для симуляции реалистичной физики, которая входит в состав GLScene. Для правильной работы с TGLODEManager и TGLODEJointList у вас должен быть установлен пакет GLS_ODE7.dpk.

Добавим два нужных нам модуля: GLKeyboard и DynODE.

Итак, перетаскиваем на форму компоненты GLSceneViewer, GLScene, GLCadencer и GLODEManager. Установим нужные параметры в GLSceneViewer1 и GLCadencer1, а так же создадим камеру и источник света в GLScene Editor. В GLODEManager1 параметр Gravity установим в (0,-9.8,0).

Приступим к созданию ключевых объектов сцены. Для начала создадим статическую плоскость, на которой и будет проходить все действие игры. Добавим в сцену объект типа Plane и установим следующие его параметры:

Height = 40

Width = 10

Position = (0,-3,0)

PitchAngle = 90

Что бы наша плоскость участвовала в эмуляции, добавим Behaviour типа ODE Static. В его параметрах установим Manager = GLODEManager1, а к разделу Elements

добавим элемент Plane.

Эти элементы и задают динамику поведения при эмуляции.

Создадим шар, которым мы будем разбивать кегли.

Добавляем в сцену объект Sphere и устанавливаем такие параметры:

Position = (0,5,10) Radius = 0,8

Этот объект у нас динамический, то есть при симуляции он будет изменять свою позицию. Добавим

ODE Dynamic в Behaviours, в разделе Elements добавим элемент типа Sphere с параметрами:

Radius = 0,8

Density = 30

Тут Density – это плотность материала, которую мы установим в 30 раз больше чем у кеглей.

Перейдем к созданию кеглей.

Добавим Cylinder с параметрами:

BottomRadius = 0,3

TopRadius = 0,3

Height = 3

Position = (0,3,0)

В Behaviours добавим ODE Dynamic, в Elements – Cylinder с параметрами:

Length = 3

Radius = 0,3

Первая кегля готова. Методом копирования сделаем еще пять ее копий, изменяя при этом только параметр Position: (1,3,-1), (-1,3,-1), (0,3,-2), (2,3,-2), (-2,3,-2).

Перейдем к написанию кода.

Опишем обработчик события OnProgress для GLCadencer1:

procedure TForm1.GLCadencer1Progress(Sender: TObject; const deltaTime, newTime: Double);

begin

if (IsKeyDown(VK_UP)) then dBodyAddTorque(TGLODEDynamic(GLSphere1.Behaviours[0]).Body,-100,0,0); if (IsKeyDown(VK_LEFT)) then dBodyAddForce(TGLODEDynamic(GLSphere1.Behaviours[0]).Body,-20,0,0);

if (IsKeyDown(VK_RIGHT)) then

dBodyAddForce(TGLODEDynamic(GLSphere1.Behaviours[0]).Body,20,0,0);

GLODEManager1.Step(deltaTime);

end;

Тут при нажатии стрелки вверх мы добавляем вращения вокруг оси X для сферы, что заставляет ее двигаться вперед. Если нажаты клавиши влево или вправо, мы воздействуем на сферу силами, которые отклоняют ее движение в стороны.

И наконец функция GLODEManager1.Step производит всю симуляцию за промежуток времени

deltaTime.

Что бы приложить силы к телу в абсолютных координатах, используй функции:

dBodyAddForce(dBodyID, dReal fx, dReal fy, dReal fz); dBodyAddTorque(dBodyID, dReal fx, dReal fy, dReal fz); dBodyAddForceAtPos(dBodyID, dReal fx, dReal fy, dReal fz,

dReal px, dReal py, dReal pz);

dBodyAddForceAtRelPos(dBodyID, dReal fx, dReal fy, dReal fz, dReal px, dReal py, dReal pz);

Следующие функции добавляют силы в относительных координатах, а в качестве параметров принимают значение вектора в локальной системе координат данного тела:

dBodyAddRelForce(dBodyID, dReal fx, dReal fy, dReal fz); dBodyAddRelTorque(dBodyID, dReal fx, dReal fy, dReal fz); dBodyAddRelForceAtRelPos(dBodyID, dReal fx, dReal fy, dReal fz,

dReal px, dReal py, dReal pz);

dBodyAddRelForceAtPos(dBodyID, dReal fx, dReal fy, dReal fz, dReal px, dReal py, dReal pz);

Функции ...ForceAtPos и ...ForceAtRelPos позволяют применить силу к определенной точке тела. Все остальные функции применяют силу к центру масс.

Результат

Хоть результат мало чем напоминает боулинг, но этот пример хорошо демонстрирует основные возможности библиотеки ODE.

Скачать пример, где используется ODE 0.9 можно здесь:

http://www.glscene.ru/download.php?view.334

Библиотеку и .pas файлы можно взять здесь

http://www.glscene.ru/download.php?view.336