- •Учебник
- •Оглавление
- •Введение
- •Глава 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
Глава 32. Физика Newton.
Сразу скажу: “Физический движок Ньютон совсем не сложен в изучении. Даже имея, скудный мануал из NewtonSDK изучить его можно за полторы недели”. Для работы с ньютоном необходимы Newton.dll и NewtonImport.pas Как и любой нормальный физический движок, Ньютон имеет мир, который создается так: NewtonWorld : PNewtonWorld; NewtonWorld := NewtonCreate(nil, nil); В конце работы программы, для освобождения памяти, следует вызвать: NewtonDestroy (NewtonWorld); Симулируется мир командой (ее необходимо прописать в коденсере): NewtonUpdate(NewtonWorld, DeltaTime); Твердое тело в ньютоне имеет тип PNewtonBody. При создании, указывается мир, в который оно вставляется, и коллизия (геометрическая оболочка тела, по которой определяются столкновения). Существует 10 типов коллизий: Null – прозрачная коллизия Box – параллелепипед Sphere – шар Cone – конус Capsule – капсула Cylinder – цилиндр ChamferCylinder – скошенный цилиндр ConvexHull – выпуклая оболочка TreeCollision – полигональная коллизия произвольной сложности (только для статических объектов) CompoundCollision – составная коллизия Создается коллизия функцией NewtonCreateXXX, где XXX - тип коллизии. Масса в ньютоне задается процедурой NewtonBodySetMassMatrix(NewtonBody, mass, Ixx, Iyy, Izz); Здесь Ixx, Iyy, Izz – моменты инерции для каждой оси. Для изменения положения тела в пространстве, необходимо изменить матрицу трансформации: Matrix : TMatrix4f; NewtonBodyGetMatrix(NewtonBody, @Matrix[0,0]); Matrix[3,0] :=x; Matrix[3,1] :=y; Matrix[3,2] :=z; NewtonBodySetMatrix(NewtonBody, @Matrix[0,0]); Имитация силы тяжести реализуется callback функцией: procedure ForceAndTorqueCallback(const body : PNewtonBody); cdecl; var Mass : Single; Inertia : TVector3f; Force : TVector3f; begin NewtonBodyGetMassMatrix(Body, @Mass, @Inertia.x, @Inertia.y, @Inertia.z); Force := V3(0, -9.8 * Mass, 0); NewtonBodyAddForce(Body, @Force.x); end; NewtonBodySetForceAndTorqueCallBack(NewtonBody, ForceAndTorqueCallBack); Например, создать куб можно так: procedure NewCube; var NewtonBody : PNewtonBody; Collision : PNewtonCollision; Matrix : TMatrix4f; Begin Collision := NewtonCreateBox(NewtonWorld, 1, 1, 1, nil); NewtonBody := NewtonCreateBody(NewtonWorld, Collision); NewtonReleaseCollision(NewtonWorld, Collision); NewtonBodySetMassMatrix(NewtonBody, 3, 0.5, 0.5, 0.5); NewtonBodySetForceAndTorqueCallBack(NewtonBody, ForceAndTorqueCallBack); end; Чтобы увидеть, что получилось, в коденсер, к NewtonUpdate’у добавляем: NewtonBodyGetMatrix(FNewtonBody, @Matrix[0,0]); GLCube.Matrix:=Matrix; В принципе, этого достаточно, чтобы понять, как работает ньютон.
Глава 33. Ручная проверка коллизий.
Коллизия – это событие столкновения двух объектов. В принципе, организовать проверку коллизии можно и сомостоятельно, тем неменее, для проверки коллизий в GLScene есть компонент CollisionManager из вкладки GLScene Utils.
1). CollisionManager
Поместите его на вашу форму. Установка проверки коллизий в режиме design time:
1. Щелкните по свойству Behaviours у объекта, который вы хотите проверять на коллизии.
2. Нажмите на кнопку со знаком плюс и выберите пункт Collision.
3. У созданной коллизии установите в свойстве Manager имя вашего менеджера коллизий, например CollisionManager1.
4. Выберите подходящее значение для свойства BoundingMode – это какой поверхностью заменяется объект.
Не при всех значениях BoundingMode правильно обрабатываются столкновения:
|
cbmPoint |
cbmSphere |
cbmEllipsoid |
CbmCube |
cbmFaces |
cbmPoint |
Правильно |
Правильно |
Правильно |
Правильно |
Как точка с кубом |
cbmSphere |
Правильно |
Правильно |
Правильно |
Правильно |
Как куб с кубом |
cbmEllipsoid |
Правильно |
Правильно |
Неправильно |
Неправильно |
Как куб с кубом |
cbmCube |
Правильно |
Правильно |
Неправильно |
Правильно |
Правильно |
cbmFaces |
Как точка с кубом |
Как куб с кубом |
Как куб с кубом |
Правильно |
Правильно (между двумя freeforms) |
5. Установите свойство GroupIndex.
Если GroupIndex<0, то проверка на столкновения с другими объектами не делается;
Если GroupIndex=0, то проверяются столкновения с объектами, у которых GroupIndex>=0;
Если GroupIndex>0, то проверяются столкновения с объектами, у которых GroupIndex не совпадает;
Установка проверки коллизий в режиме run-time:
With GetOrCreateCollision(GLSphere1) do
Begin
Manager:=CollisionManager1;
GroupIndex:=0;
BoundingMode:=cbmSphere;
End;
Теперь в событии OnCollision менеджера коллизий напишите, что должно происходить при столкновении. Например:
procedure TForm1.CollisionManager1Collision(Sender: TObject; object1, object2: TGLBaseSceneObject); begin
ShowMessage('Collision between '+object1.Name+' and '+object2.Name);
end;
Теперь, если выполнить команду CollisionManager1.CheckCollisions; и какие-нибудь два объекта окажутся столкнувшимися, то выполнится процедура CollisionManager1Collision.