- •Учебник
- •Оглавление
- •Введение
- •Глава 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
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