В этой статье я расскажу вам основы библиотеки ODE на примере создания подобия
боулинга.
ODE (Open Dynamic Engine) – бесплатная библиотека для симуляции реалистичной
физики, которая входит в состав GLScene. Для правильной работы у тебя должен быть
установлен пакет GLS_ODE7.dpk.
Добавим 2 нужных нам модуля: Keyboard и 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:
Код на языке Delphi 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.
Что бы приложить силы к телу в абсолютных координатах, используй функции:
Код на языке Delphi 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);
Следующие функции добавляют силы в относительных координатах, а в качестве
параметров принимают значение вектора в локальной системе координат данного тела:
Код на языке Delphi 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_bowling.rar
Официальный сайт ODE: http://ode.org
Переведенная ну русский язык документация: http://ode.org/doc/russian
Использование ODE с Delphi: http://www.cambrianlabs.com/Mattias/DelphiODE
|