[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Форум Panda3D - по русски » Panda3D » Для начинающих » Нужна помощь (ode)
Нужна помощь
NarkomaNДата: Четверг, 24.06.2010, 12:03 | Сообщение # 1
Рядовой
Группа: Пользователи
Сообщений: 3
Награды: 0
Репутация: 0
Статус: Offline
Доброго всем времени суток...
Вот недавно решил разобраться, как работает ODE в панде.
Узнавать решил по простому. Я немного переписал код с мануала на офф. сайте.

Code
from direct.directbase import DirectStart
from pandac.PandaModules import OdeWorld, OdeSimpleSpace, OdeJointGroup
from pandac.PandaModules import OdeBody, OdeMass, OdeTriMeshData, OdeTriMeshGeom
from pandac.PandaModules import BitMask32, CardMaker, Vec4, Quat
from random import randint, random
   
# Setup our physics world
world = OdeWorld()
world.setGravity(0, 0, -9.81)
   
# The surface table is needed for autoCollide
world.initSurfaceTable(1)
world.setSurfaceEntry(0, 0, 900, 0.0, 9.1, 0.9, 0.00001, 0.0, 0.002)
   
# Create a space and add a contactgroup to it to add the contact joints
space = OdeSimpleSpace()
space.setAutoCollideWorld(world)
contactgroup = OdeJointGroup()
space.setAutoCollideJointGroup(contactgroup)

do = loader.loadModel("do")
do.reparentTo(render)
do.setPos(0,0,20)

land = loader.loadModel("land")
land.reparentTo(render)

doBody = OdeBody(world)
M = OdeMass()
M.setSphere(30,10)
doBody.setMass(M)
doBody.setPosition(do.getPos(render))
doBody.setQuaternion(do.getQuat(render))

doTrime sh = OdeTriMeshData(do, True)
doCol = OdeTriMeshGeom(space, doTrimesh)
doCol.setBody(doBody)

landTrimesh = OdeTriMeshData(land, True)
landCol = OdeTriMeshGeom(space, landTrimesh)

# Set the camera position

def simTask(task):
  space.autoCollide()
  world.quickStep(globalClock.getDt())
  do.setPosQuat(render, doBody.getPosition(), Quat(doBody.getQuaternion()))
  contactgroup.empty() # Clear the contact joints
    return task.cont

taskMgr.doMethodLater(0.5, simTask, "Physics Simulation")

   
run()

Вроде все работает нормально, НО иногда вылазит ошибка.
http://radikal.ru/F/s47.radikal.ru/i115/1006/37/c77bc044e23f.jpg.html (извините бб коды не работают...)
Что предложите делать?
 
BVOGДата: Четверг, 24.06.2010, 12:21 | Сообщение # 2
Полковник
Группа: Проверенные
Сообщений: 184
Награды: 0
Репутация: 4
Статус: Offline
У меня тоже иногда бывает эта ошибка, если не ошибаюсь то это связано с поверхностью столкновения, т.е. при обработке их. И я как-то решил эту проблему, попробую поискать.

Skype: thebvog
 
NarkomaNДата: Четверг, 24.06.2010, 12:32 | Сообщение # 3
Рядовой
Группа: Пользователи
Сообщений: 3
Награды: 0
Репутация: 0
Статус: Offline
Я тоже так подумал, что возникает из-за
Code
doTrime sh = OdeTriMeshData(do, True)  
doCol = OdeTriMeshGeom(space, doTrimesh)

Тогда появляется вопрос как "образуется" эта коллизия? Копируется сетка модели? Или когда делается экпорт из макса, там есть галочка Add collision, тогда она "образуется"? dry

 
BVOGДата: Четверг, 24.06.2010, 13:38 | Сообщение # 4
Полковник
Группа: Проверенные
Сообщений: 184
Награды: 0
Репутация: 4
Статус: Offline
Так... ODE образуется либо по какой-то геометрической фигуры или по поверхности модели(это разные функции). Collision - это для другого, т.е. для коллизий в CollisionHandle(как в примере Romaning-Ralph).

Skype: thebvog

Сообщение отредактировал BVOG - Четверг, 24.06.2010, 13:39
 
NarkomaNДата: Четверг, 24.06.2010, 13:56 | Сообщение # 5
Рядовой
Группа: Пользователи
Сообщений: 3
Награды: 0
Репутация: 0
Статус: Offline
Значит, Ode копирует сетку модели? А если модели высокополигнальная..., а обычный "кубик" (.setBox()) не подойдет, значит придется делать ещё одну модель с меньшим кол-вом полигонов... я правильно я рассуждаю?
И ещё один вопрос. Как с симулировать подвеску авто с помощью Joints или как то по другому?
 
BVOGДата: Четверг, 24.06.2010, 15:26 | Сообщение # 6
Полковник
Группа: Проверенные
Сообщений: 184
Награды: 0
Репутация: 4
Статус: Offline
ODE делает по форме куба, цилиндра, куба или самой формы объекта, в зависимости от функции.
На счёт подвески, возможно сделать подвижные соединения.


Skype: thebvog
 
ninthДата: Пятница, 25.06.2010, 09:41 | Сообщение # 7
Admin
Группа: Администраторы
Сообщений: 1555
Награды: 5
Репутация: 46
Статус: Offline
В демках на этом сайте есть пример колёсного транспорта на ODE.
Ошибка может возникать из-за большого кол-ва полигонов в сетке (здесь ты верно рассуждаешь - надо делать отдельно с меньшим кол-вом полигонов)
Иногда может возникнуть из-за слишком высокой угловой или линейной скорости какого-то объекта.
 
BVOGДата: Пятница, 25.06.2010, 12:52 | Сообщение # 8
Полковник
Группа: Проверенные
Сообщений: 184
Награды: 0
Репутация: 4
Статус: Offline
Можно попробывать сделать исключения:
Code

def simTask(task):  
  try:  
   space.autoCollide()  
   world.quickStep(globalClock.getDt())  
   do.setPosQuat(render, doBody.getPosition(), Quat(doBody.getQuaternion()))  
   contactgroup.empty() # Clear the contact joints  
    return task.cont  
  except:
   pass

На счёт подвески:

1 - Тело
2 - Соединения
3 - Колесо
Так... Дальше, соединения должны двигаться(т.е. поворачиваться вдоль вертикальной оси) и прикреплены к телу и колёсам тем же способом.
Потом можно написать обработчик это подвески, например:

Code

def autoTask(task):  
      a = join.getZ() #т.е. угол поворота подвески
      #Чем больше угол тем сильнее давит пружина
      koleso.setForce(0,0,strength*a*k) #Где strength - сила пружины, k - некий коэффицент для лучшей подвески от 0.0 до 1.0.
      return task.cont   
Прикрепления: 3540090.png(10Kb)


Skype: thebvog
 
Форум Panda3D - по русски » Panda3D » Для начинающих » Нужна помощь (ode)
Страница 1 из 11
Поиск: