3D World SandBox
Главная | Регистрация | Вход Приветствую Вас Гость | RSS
Меню сайта
Форма входа
Категории раздела
Мои статьи [7]
Поиск
Главная » Статьи » Мои статьи

ODE (Open Dynamic Engine) в GLScene

В этой статье я расскажу вам основы библиотеки 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
Категория: Мои статьи | Добавил: 3dgid (13.06.2009)
Просмотров: 1655 | Комментарии: 1 | Рейтинг: 0.0/0 |
Всего комментариев: 1
1 MillRemieved  
0
pet pharmacy 800 850 4419 http://sundrugstore.net/products/serevent.htm university of cincinnati pharmacy

Имя *:
Email *:
Код *:
Друзья сайта
Контакты
Мой почтовый ящик www.eva.net@gmail.com
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Copyright MyCorp © 2026
Конструктор сайтовuCoz