Пример физики ODE на Panda3D
| |
serg-kkz | Дата: Среда, 07 Сентября 2011, 17:49 | Сообщение # 1 |
постоянный участник
Сейчас нет на сайте
| Пример создания физики в панде, код на питоне. Здесь кубик, который падает на поверхность, поверхность не видимая. Для того чтоб увидеть как падает кубик нужно зажать правою кнопку мыши и провести мышью вперед.
Code # -*- coding: utf_8 -*- import direct.directbase.DirectStart from pandac.PandaModules import *
world = OdeWorld() # Создадим объект ODE мир - контейнер для физических тел и сочленений world.setGravity(0, 0, -9.81) # Установим силу гравитации в мире по координате z, равной земной.
world.initSurfaceTable(1) # Создадим таблицу поверхностей и добавим значения характеристик поверхностей world.setSurfaceEntry(0, 0, 150, 0.0, 0, 1, 0.00001, 0.0, 0.002)
# Создание контактных группы для хранения соединений space = OdeSimpleSpace() space.setAutoCollideWorld(world) contactgroup = OdeJointGroup() space.setAutoCollideJointGroup(contactgroup)
# Настройка модели для визуализации boxMod = loader.loadModel("box") # Загружаем модель boxMod.setPos(0, 0, 3) # Устанавливаем координаты расположения модели boxMod.reparentTo(render) # Прикрепляем к узлу рендера для визуализации
# Добавление в мир ODE физической модели и настройка boxBody = OdeBody(world) # Создадим тело ODE M = OdeMass() # Создаем массу ODE M.setBox(60, 1, 1, 1) # Устанавливаем массе параметры бокса, вес и соотношение распределение веса boxBody.setMass(M) # Устанавливаем настроенною массу телу
# Создание пораметров геометрии boxGeom = OdeBoxGeom(space, 1, 1, 1) # Создаем ODE геометрию, бокс и устанавливаем размеры boxGeom.setBody(boxBody) # Устанавливаем геометрии настроенное физическое тело boxGeom.setPosition(boxMod.getPos()) # Устанавливаем позицию геометрии равной модели boxGeom.setQuaternion(boxMod.getQuat()) # Устанавливаем ориентацию геометрии равной модели
# Добавление поверхности на которую будет падать кубик, она не видима. groundGeom = OdePlaneGeom(space, Vec4(0, 0, 1, 0)) # Создаем объект ODE, плоскость
# функция симуляции синхронизации def simulation(task): space.autoCollide() # Устанавливаем соединения в авто world.quickStep(globalClock.getDt()) # Шаг симуляции за время последнего рендеринга boxMod.setPosQuat(boxGeom.getPosition(), Quat(boxGeom.getQuaternion())) # Синхронизация модели с геометрией тела contactgroup.empty() # Очищаем контакты return task.cont # Возвращаем задачу менеджеру для повторения
taskMgr.doMethodLater(3, simulation, "Physics") # Менеджер для запуска функции симуляции. Задержка 3 секунды чтоб можно было увидеть начало падения кубика. run()
Сообщение отредактировал serg-kkz - Среда, 07 Сентября 2011, 23:50 |
|
| |
Kornival | Дата: Среда, 07 Сентября 2011, 18:01 | Сообщение # 2 |
The Witcher
Сейчас нет на сайте
| Спасибо большое. Я уже думал, что ты забыл об уроке Читая мануал мне показалось, что с PhysX реализовать то же самое намного проще: не нужно создавать физическое тело и геометрию, это так?
|
|
| |
serg-kkz | Дата: Среда, 07 Сентября 2011, 18:08 | Сообщение # 3 |
постоянный участник
Сейчас нет на сайте
| Kornival, ну это минимальный код, есть еще туча нюансов. Не понял значения вопроса на конце, э... я должен что-то ответить.
Quote (Kornival) не нужно создавать физическое тело и геометрию, это так?
|
|
| |
Kornival | Дата: Среда, 07 Сентября 2011, 18:15 | Сообщение # 4 |
The Witcher
Сейчас нет на сайте
| Quote (serg-kkz) Не понял значения вопроса на конце Ну судя по этому примеру, не нужно самому создавать физ. тело(в нашем случае OdeBody) и геометрию тела(в нашем случае OdeGeomBox)
|
|
| |
serg-kkz | Дата: Среда, 07 Сентября 2011, 19:02 | Сообщение # 5 |
постоянный участник
Сейчас нет на сайте
| Kornival, я PhysX даже и не пробовал. Добавлено (07.09.2011, 19:02) --------------------------------------------- Kornival, ну я думаю ты знаешь, что есть вариант создать тримеш из данных модели и создать тримеш геометрию оде, можно так. Но я не вижу преобразований в том коде. Ты его проверял, он хоть работает?
|
|
| |
Kornival | Дата: Среда, 07 Сентября 2011, 19:13 | Сообщение # 6 |
The Witcher
Сейчас нет на сайте
| .Quote (serg-kkz) Kornival, ну я думаю ты знаешь, что есть вариант создать тримеш из данных модели и создать тримеш геометрию оде, можно так. Да, тримеш-первое что я начал искать в мануале посмотрев твой урок) Quote (serg-kkz) Ты его проверял, он хоть работает? Нет, не проверял.
Сообщение отредактировал Kornival - Среда, 07 Сентября 2011, 19:14 |
|
| |
serg-kkz | Дата: Среда, 07 Сентября 2011, 19:16 | Сообщение # 7 |
постоянный участник
Сейчас нет на сайте
| Quote (Kornival) Да, тримеш-первое что я начал искать в мануале посмотрев твой урок) Kornival, могу показать на этом, если нужно.
|
|
| |
Kornival | Дата: Среда, 07 Сентября 2011, 19:22 | Сообщение # 8 |
The Witcher
Сейчас нет на сайте
| Quote (serg-kkz) Kornival, могу показать на этом, если нужно. Ну наверное строчку Quote (serg-kkz) boxGeom = OdeBoxGeom(space, 1, 1, 1) заменить на Code boxGeom = OdeTriMeshGeom(OdeTriMeshData(boxMod)) ??? Напиши если не так.
Сообщение отредактировал Kornival - Среда, 07 Сентября 2011, 19:23 |
|
| |
serg-kkz | Дата: Среда, 07 Сентября 2011, 19:33 | Сообщение # 9 |
постоянный участник
Сейчас нет на сайте
| Code boxMod.flattenLight() # Сбрасываем транформацию (обязательно) Code boxGeom = OdeTriMeshGeom(space, OdeTriMeshData(boxMod))
Сообщение отредактировал serg-kkz - Четверг, 08 Сентября 2011, 00:23 |
|
| |
Kornival | Дата: Среда, 07 Сентября 2011, 19:44 | Сообщение # 10 |
The Witcher
Сейчас нет на сайте
| Thank
|
|
| |
|