In this sample it is shown that there is no cylinder to cylinder collision. But if instead of cylinders I put any other object - all worked. Also the cylinder geometry with the non-cylinder is collided normally. Looks like a bug… or I do something wrong?
(I use FenrirWolf’s wireGeom discourse.panda3d.org/viewtopic.php?t=6619 for visualisation)
I checked it on version 1.7.0
# -*- coding: utf_8 -*-
from direct.directbase import DirectStart
from direct.showbase import DirectObject
from pandac.PandaModules import *
from random import randint, random
import math, sys
from ODEWireGeom import wireGeom
class World():
def __init__(self):
self.world = OdeWorld()
self.world.setGravity(0, 0, -9.81)
self.world.initSurfaceTable(1)
self.world.setSurfaceEntry(0, 0, 150, 0.0, 9.1, 0.9, 0.00001, 0.0, 0.002)
self.space = OdeSimpleSpace()
self.space.setAutoCollideWorld(self.world)
self.contactgroup = OdeJointGroup()
self.space.setAutoCollideJointGroup(self.contactgroup)
self.boxes = []
for i in range(randint(50, 100)):
sx=random()+0.5
sy=random()+0.5
sz=random()+0.5
#boxNP = wireGeom().generate ('box', extents=(sx, sy, sz))
boxNP = wireGeom().generate ('cylinder', radius=sx, length=sy)
boxNP.reparentTo(render)
boxNP.setPos(randint(-5, 5), randint(-5, 5), 10 + random())
boxNP.setColor(random()*2, random()*2, random()*2, 1)
boxNP.setHpr(randint(-45, 45), randint(-45, 45), randint(-45, 45))
boxBody = OdeBody(self.world)
M = OdeMass()
#M.setBox(15, sx, sy, sz)
M.setCylinder(15, 1, sx, sy)
boxBody.setMass(M)
boxBody.setPosition(boxNP.getPos(render))
boxBody.setQuaternion(boxNP.getQuat(render))
#boxGeom = OdeBoxGeom(self.space, sx,sy,sz)
boxGeom = OdeCylinderGeom(self.space, sx,sy)
boxGeom.setBody(boxBody)
self.boxes.append((boxNP, boxBody))
self.cm = CardMaker("ground")
self.cm.setFrame(-20, 20, -20, 20)
self.ground = render.attachNewNode(self.cm.generate())
self.ground.setPos(0, 0, 0); self.ground.lookAt(0, 0, -2)
self.groundGeom = OdePlaneGeom(self.space, Vec4(0, 0, 1, 0))
base.disableMouse()
base.camera.setPos(40, 40, 20)
base.camera.lookAt(0, 0, 0)
taskMgr.doMethodLater(0.5, self.simulationTask, "Physics Simulation")
base.accept('space',self.jump)
def jump(self):
for np, body in self.boxes:
body.addForceAtRelPos(randint(-500, 500),randint(-500, 500),randint(5000, 15000),0,0,0)
def simulationTask(self,task):
self.space.autoCollide()
self.world.quickStep(globalClock.getDt())
for np, body in self.boxes:
np.setPos(render, body.getPosition())
np.setQuat(render,Quat(body.getQuaternion()))
self.contactgroup.empty()
return task.cont
base.accept('escape',sys.exit)
World()
base.disableMouse()
camera.setPos(20,20,20)
camera.lookAt(0,0,0)
run()
Sorry for my english.