I want to have all my solid objects collide with terrain.
So I want to create a collision ray on a dummy linked to all these objects.
I’m not sure if this is the way to accomplish it.
I tried it, but my balls are in the air.
Could someone show me the right way please?
self.dummyNode = render.attachNewNode(“renderAllModels”)
Ball (big)
self.ball01 = loader.loadModel("Models/ball_big")
self.ball01.setPos(-200, 180, 0)
self.ball01.reparentTo(self.dummyNode)
Ball (small)
self.ball02 = loader.loadModel("Models/ball_small")
self.ball02.setPos(200, 180, 0)
self.ball02.reparentTo(self.dummyNode)
# solid objects
self.soGroundRay = CollisionRay()
self.soGroundRay.setOrigin(0,0,1000)
self.soGroundRay.setDirection(0,0,-1)
self.soGroundCol = CollisionNode('soRay')
self.soGroundCol.addSolid(self.soGroundRay)
self.soGroundCol.setFromCollideMask(BitMask32.bit(0))
self.soGroundCol.setIntoCollideMask(BitMask32.allOff())
self.soGroundColNp = self.dummyNode.attachNewNode(self.soGroundCol)
self.soGroundHandler = CollisionHandlerQueue()
self.cTrav.addCollider(self.soGroundColNp, self.soGroundHandler)
#In running task
# Adjust solid objects Z coordinate.
entries = []
for i in range(self.soGroundHandler.getNumEntries()):
entry = self.soGroundHandler.getEntry(i)
entries.append(entry)
entries.sort(lambda x,y: cmp(y.getSurfacePoint(render).getZ(),
x.getSurfacePoint(render).getZ()))
if (len(entries)>0) and (entries[0].getIntoNode().getName() == “ter01”) or (len(entries)>0) and (entries[0].getIntoNode().getName() == “path01”) or (len(entries)>0) and (entries[0].getIntoNode().getName() == “bridge01”) or (len(entries)>0) and (entries[0].getIntoNode().getName() == “gdn01”):
self.dummyNode.setZ(entries[0].getSurfacePoint(render).getZ())