| 
	
		
		
			| Пример физики 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 |  |  |  |  |  
 |