On the forum of another engine, I saw a problem. And I decided to repeat it on Panda3D. Obviously the problem is not related to Panda3D, however it is interesting how can get around it.
Essence, when using a CCD, is not possible to achieve fullness of the absence of a collision when using collision masks.
Example:
from direct.showbase.DirectObject import DirectObject
import direct.directbase.DirectStart
from pandac.PandaModules import *
from panda3d.bullet import BulletWorld
from panda3d.bullet import BulletPlaneShape
from panda3d.bullet import BulletRigidBodyNode
from panda3d.bullet import BulletBoxShape
from panda3d.bullet import BulletDebugNode
base.cam.setPos(0, -20, 0)
mask1 = BitMask32.allOn()
mask2 = BitMask32.allOff()
debugNode = BulletDebugNode('Debug')
debugNP = render.attachNewNode(debugNode)
debugNP.show()
world = BulletWorld()
world.setDebugNode(debugNP.node())
world.setGravity(Vec3(0, 0, -9.81))
csProjectile = BulletBoxShape(Vec3(0.05, 0.05, 0.05))
nodeBox = BulletRigidBodyNode('Box')
nodeBox.addShape(csProjectile)
nodeControlBox = render.attachNewNode(nodeBox)
nodeControlBox.setPos(0, 0, 5)
nodeBox.setMass(1)
nodeBox.setCcdMotionThreshold(0.05)
nodeBox.setCcdSweptSphereRadius(0.05)
nodeBox.setIntoCollideMask(mask1)
world.attachRigidBody(nodeBox)
for i in xrange(0, 5):
csFloor = BulletBoxShape(Vec3(5, 5, 0.05))
nodeFloor = BulletRigidBodyNode('Floor')
nodeFloor.addShape(csFloor)
nodeControlFloor = render.attachNewNode(nodeFloor)
nodeControlFloor.setPos(0, 0, 2-i)
nodeFloor.setMass(0)
nodeFloor.setIntoCollideMask(mask2)
world.attachRigidBody(nodeFloor)
def update(task):
world.doPhysics(globalClock.getDt())
if nodeControlBox.getZ() < -3:
world.setGravity(Vec3(0, 0, 9.81))
if nodeControlBox.getZ() > 3:
world.setGravity(Vec3(0, 0, -9.81))
return task.cont
taskMgr.add(update, 'update')
base.run()
If you delete these lines, then it starts to work as expected.
nodeBox.setCcdMotionThreshold(0.05)
nodeBox.setCcdSweptSphereRadius(0.05)