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