Нужна помощь
|
|
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, тогда она "образуется"?
|
|
| |
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
Группа: Администраторы
Сообщений: 1582
Награды: 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
Skype: thebvog
|
|
| |