O... I am very happy to announce I know how to Collision!

Here’s my work!
http://www.youtube.com/watch?v=t9QtokyuSic
I have worked on it for 4 days, and finally I know how to make collision work!

I made 2 objects collide when their collisionSphere collide together. And they will bounce back each other, each of both, according to the Newton’s Third Law. I love Panda3D

My code is here:

import direct.directbase.DirectStart
from direct.task import Task
from direct.gui.OnscreenText import OnscreenText
from pandac.PandaModules import PandaNode,NodePath,Camera,TextNode, CardMaker
from direct.showbase.DirectObject import DirectObject
import random, sys, os, math
from pandac.PandaModules import CollisionHandlerEvent, CollisionNode, CollisionSphere, CollisionTraverser, BitMask32
from pandac.PandaModules import VBase4, AmbientLight, DirectionalLight
from pandac.PandaModules import Vec3,Vec4

def addInstructions(pos, msg):
return OnscreenText(text=msg, style=1, fg=(1,1,1,1), pos=(-1.3, pos), align=TextNode.ALeft, scale = .05)

text = TextNode(‘node name’)
text.setText(“Every day in every way I’m getting better and better.”)
textNodePath = aspect2d.attachNewNode(text)
textNodePath.setScale(0.17)
textNodePath.setPos(-0.5,0,-0.5)

ACCEL = 100
DECCEL = 1.1

class World(DirectObject):

def __init__(self):

    self.initno = 0
    self.cam = 0
    self.inst1 = addInstructions(0.95, "Test")
    self.inst2 = addInstructions(0.90, "Aim1: make variable meters COMPLETE")
    self.inst3 = addInstructions(0.85, "Aim2: make camera follow car COMPLETE")
    self.inst4 = addInstructions(0.80, "Aim3: control keyboard to move car COMPLETE")
    self.inst5 = addInstructions(0.75, "Checkpoint1 ***")
    self.inst6 = addInstructions(0.70, "Aim4: make floating obstacle COMPLETE")
    self.inst7 = addInstructions(0.65, "Aim5: make car clash with obstable: obstacle move COMPLETE")
    self.inst8 = addInstructions(0.60, "Aim6: make car clash with obstable: car and obstacle move INCOMPLETE")
    self.inst9 = addInstructions(0.55, "Checkpoint2")
    self.inst10 = addInstructions(0.50, "Aim7: make a box fall on the world and stop upon impact, and make it fall to infinite if it does not touch the world")
    self.inst11 = addInstructions(0.45, "Aim8: make a box fall on the world and bounce upon impact")
    self.inst12 = addInstructions(0.40, "Aim9: make a box fall on the world rotating and bounce upon impact with random movement")
    self.inst13 = addInstructions(0.35, "Aim10: make a box fall on the world and upon bouncing a little sparks are generated")
    self.inst14 = addInstructions(0.30, "Aim11: make the car fall on the world and generate sparks")
    self.inst15 = addInstructions(0.25, "Checkpoint3")
    self.inst16 = addInstructions(0.20, "Aim12: make the obstacles fall and have gravity too")
    self.inst17 = addInstructions(0.15, "Aim13: make the car fall on the world and upon impact the car animate")
    self.inst18 = addInstructions(0.10, "Aim14: make the world regenerate in the direction of Y axis as a box moves at Y axis")
    self.inst19 = addInstructions(0.05, "Aim15: make a longer bridge")
    self.inst20 = addInstructions(0.00, "Aim16: make bridge fall if box moves far from the segment, make bridge regenerate if otherwise")


    self.keyMap = {"left":0, "right":0, "forward":0, "space":0}
    self.accept("arrow_left", self.setKey, ["left",1])
    self.accept("arrow_right", self.setKey, ["right",1])
    self.accept("arrow_up", self.setKey, ["forward",1])
    self.accept("arrow_down", self.setKey, ["space",1])
    self.accept("arrow_left-up", self.setKey, ["left",0])
    self.accept("arrow_right-up", self.setKey, ["right",0])
    self.accept("arrow_up-up", self.setKey, ["forward",0])
    self.accept("arrow_down-up", self.setKey, ["space",0])
    
    self.box1 = loader.loadModel("box1")
    self.box1.reparentTo(render)
    self.box1.setScale(1,1,1)
    self.box1.setPos(2,20,2)   #x=2, y=12, z=2
    #     |  O  << box1 position
    #     |
    #------------
    #     |
    #     |

    self.box2 = loader.loadModel("box1")
    self.box2.reparentTo(self.box1)
    self.box2.setScale(1,1,1)
    self.box2.setPos(-2,0,-2)   #x=0, y=12, z=0
    #     | 
    #     |box2 position
    #-----O------
    #     |
    #     |
    self.box1.hide()
    self.box2.hide()
    self.world = loader.loadModel("world")
    self.world.reparentTo(self.box1)
    self.world.setScale(1,1,1)
    self.world.setPos(-2,0,-10)   #x=0, y=12, z=0

    self.floater = NodePath(PandaNode("floater"))
    self.floater.reparentTo(render)

    self.floaterCentre = loader.loadModel("box1")
    self.floaterCentre.reparentTo(self.floater)
    self.floaterCentre.setScale(0.2,0.2,0.2)
    self.floaterCentre.setPos(-1,10,0)

    self.meter = loader.loadModel("box1")
    self.meter.reparentTo(self.floater)
    self.meter.setScale(0.2,0.2,0.2)
    self.meter.setPos(-1,10,0)

    self.meter2 = loader.loadModel("box1")
    self.meter2.reparentTo(self.floater)
    self.meter2.setScale(0.2,0.2,0.2)
    self.meter2.setPos(-1,10,0)


    taskMgr.add(self.moveFloater, "moveBox2")
    taskMgr.add(self.moveBox, "moveBox")
    taskMgr.add(self.randomMoveBox, "randomMoveBox")
    taskMgr.add(self.move, "move")
    taskMgr.add(self.obstaclemove, "obstaclemove")

    self.cameraFloater = NodePath(PandaNode("cameraFloater"))
    self.cameraFloater.reparentTo(base.camera)
    self.cameraFloater.setPos(0,30,-4)
    self.cameraFloater.hide()

    self.xFloater = NodePath(PandaNode("Floater"))
    self.xFloater.reparentTo(render)
    self.xFloater.setPos(0,30,-4)

    self.variableMeter = loader.loadModel("box1")
    self.variableMeter.reparentTo(self.xFloater)
    self.variableMeter.setScale(0.2,0.2,0.2)
    self.variableMeter.setPos(0,10,0)

    self.keyboardMover = loader.loadModel("smiley")
    self.keyboardMover.reparentTo(self.xFloater)
    self.keyboardMover.setScale(0.1,0.1,0.1)
    self.keyboardMover.setPos(0,10,0)
    
    self.obstacle = loader.loadModel("box1")
    self.obstacle.reparentTo(self.xFloater)
    self.obstacle.setScale(0.3,0.3,0.3)
    self.obstacle.setPos(0,5,0)

    self.pair1=1

    self.alight = AmbientLight('alight')
    self.alight.setColor(VBase4(0.5, 0.5, 0.5, 1))
    self.alnp = render.attachNewNode(self.alight)
    render.setLight(self.alnp)

    self.dlight = DirectionalLight('dlight')
    self.dlight.setColor(VBase4(0.0, 0.0, 0.0, 1))
    self.dlnp = render.attachNewNode(self.dlight)

    base.cTrav=CollisionTraverser()
    collisionHandler = CollisionHandlerEvent()
    collisionHandler.addInPattern('%fn-into-%in')
    collisionHandler.addOutPattern('%fn-out-%in')

    self.c = self.keyboardMover.attachNewNode(CollisionNode('CmoverC'))
    self.c.node().addSolid(CollisionSphere(0, 0, 0, 2.2))
    self.c.node().setFromCollideMask(BitMask32.bit(self.pair1))
    base.cTrav.addCollider(self.c, collisionHandler)
    
    self.dlnp.lookAt(self.keyboardMover)
    self.keyboardMover.setLight(self.dlnp)
    
    self.c2 = self.obstacle.attachNewNode(CollisionNode('CobstacleC'))
    self.c2.node().addSolid(CollisionSphere(0, 0, 0, 2.2))
    self.c2.node().setIntoCollideMask(BitMask32.bit(self.pair1))


    self.V_obstacle = Vec3(0,0,0)
    self.accelV = Vec3(0,0,0)
    self.repelV = Vec3(0,0,0)
    
    self.dlnp.lookAt(self.obstacle)
    self.obstacle.setLight(self.dlnp)

    base.cTrav.showCollisions(render)

    def collideEventIn(entry):
        self.dlight.setColor(VBase4(0.9, 0.9, 0.9, 1))
        self.tovvVar = "%10.3f px" % self.meter2.getZ()
        self.tovvObject = OnscreenText(text = "meter2 Z: " + self.tovvVar, pos = (-1.2, -0.7), scale = (0.07,0.04), align = TextNode.ALeft) 
        norm = entry.getSurfaceNormal(render)
        getpt = entry.getSurfacePoint(render)
        nearpt = self.obstacle.getPos() - self.keyboardMover.getPos()
        nearptReaction = self.keyboardMover.getPos() - self.obstacle.getPos()
        accelSide = -norm
        self.accelV = accelSide
        nearpt = nearpt/4
        self.accelV += nearpt
        nearptReaction = nearptReaction/4
        self.repelV = nearptReaction
        
        
    def collideEventOut(entry):
        self.dlight.setColor(VBase4(0.0, 0.0, 0.0, 1))
        self.tovvVar = "%10.3f px" % self.meter2.getZ()
        self.tovvObject = OnscreenText(text = "meter2 Z: " + self.tovvVar, pos = (-1.2, -0.7), scale = (0.07,0.04), align = TextNode.ALeft) 
        self.accelV = 0
        self.repelV = 0

    self.DO=DirectObject()

    # notice the names used in the accept and confront with what we did while assigning patterns above with collisionHandler.addInPattern and collisionHandler.addOutPattern methods
    self.DO.accept('CmoverC-into-CobstacleC', collideEventIn)
    self.DO.accept('CmoverC-out-CobstacleC', collideEventOut)

self.DO.accept(‘CobstacleC-into-CmoverC’, self.collideEventIn)

self.DO.accept(‘CobstacleC-out-CmoverC’, self.collideEventOut)

    def tovv(task):
        if (self.initno==1):
            self.tovObject.destroy()
            self.tovVobstacle.destroy()
        self.tovVar = "%10.3f px" % self.meter2.getZ()
        self.tovObject = OnscreenText(text = "meter2 Z: " + self.tovVar, pos = (-1.2, -0.9), scale = (0.07,0.04), align = TextNode.ALeft) 
        if (self.initno==0 or self.V_obstacle != Vec3(0,0,0)):
            self.tovVobs = "x %10.3f px y %10.3f px z %10.3f px" % (self.obstacle.getX(),  self.obstacle.getY(),  self.obstacle.getZ())
            self.tovVobstacle = OnscreenText(text = "self.V_obstacle: " + self.tovVobs, pos = (-1.2, -0.<img src="/uploads/default/original/1X/ae031e9834d19166598edd060b063d44f1829139.gif" width="15" height="15" alt="8)" title="Cool"/>, scale = (0.07,0.04), align = TextNode.ALeft) 
        if (self.initno==0):
            self.initno=1
#        self.text1 = TextNode('variable1')
#        self.text1.setText(self.tov_var)
#        if (self.initno==0):
#            self.textNodePath1 = aspect2d.attachNewNode(self.text1)
#            self.textNodePath1.setScale(0.17)
#            self.textNodePath1.setPos(-0.5,0,-0.7)
#            self.initno=1
#        task.delayTime += 100
        return Task.again
    myTask = taskMgr.doMethodLater(0.11, tovv, 'tov')

def obstaclemove(self, task):
    dt = globalClock.getDt()
    if dt > .2:
        return Task.cont
    self.V_obstacle /= DECCEL
    self.V_obstacle += self.accelV * dt * ACCEL
    self.obstacle.setPos(self.obstacle.getPos() + (self.V_obstacle * dt))
    return Task.cont

def moveFloater(self, task):
    angledegrees = task.time * 6.0
    angleradians = angledegrees * (math.pi / 180.0)
    self.floater.setPos(20*math.sin(angleradians),-20.0*math.cos(angleradians),0)
    self.floater.setHpr(angledegrees, 0, 0)
    return Task.cont

def moveBox(self, task):
    angledegrees = task.time * 6.0
    angleradians = angledegrees * (math.pi / 180.0)
    self.meter.setPos(20*math.sin(angleradians),-20.0*math.cos(angleradians),0)
    self.meter.setHpr(angledegrees, 0, 0)
    return Task.cont

def randomMoveBox(self, task):
    randomNo = random.uniform(1, 10)
    self.meter2.setPos(randomNo,0,randomNo)
    self.meter2.setHpr(0, 0, 0)
    return Task.cont

def setKey(self, key, value):
    self.keyMap[key] = value

def move(self, task):
    elapsed = globalClock.getDt()
    piVsTime = task.time*60
    piVsradians = piVsTime * (math.pi / 180.0)
    if (self.keyMap["space"]!=0):
        self.cam = self.cam+1
        if (self.cam > 200):
            self.cam = 0
      
    if (self.cam == 0):
        base.camera.reparentTo(render)
    elif (self.cam == 5):
        base.camera.reparentTo(self.keyboardMover)
        base.camera.setPos(self.keyboardMover.getPos())
    elif (self.cam > 10):
        base.camera.reparentTo(self.keyboardMover)
        base.camera.setY(self.keyboardMover.getY() - self.cam/10)
        base.camera.setZ(self.keyboardMover.getZ() + 2)

    if (self.keyMap["left"]!=0):
          self.keyboardMover.setH(self.keyboardMover.getH() + elapsed*self.meter2.getZ()*30)
    if (self.keyMap["right"]!=0):
          self.keyboardMover.setH(self.keyboardMover.getH() - elapsed*self.meter2.getZ()*30)
    if (self.keyMap["forward"]!=0):
        if (-(elapsed*math.sin(piVsradians)*25)<0):
            self.keyboardMover.setY(self.keyboardMover, (elapsed*math.sin(piVsradians)*25))
        elif (-(elapsed*math.sin(piVsradians)*25)>=0):
            self.keyboardMover.setY(self.keyboardMover, -(elapsed*math.sin(piVsradians)*25))
    self.keyboardMover.setPos(self.keyboardMover.getPos() + (self.repelV))
    return Task.cont




#def SpinCameraTask(task):
#    angledegrees = task.time * 6.0
#    angleradians = angledegrees * (math.pi / 180.0)
#    base.camera.setPos(20*math.sin(angleradians),-20.0*math.cos(angleradians),0)
#    base.camera.setHpr(angledegrees, 0, 0)
#    return Task.cont

#taskMgr.add(SpinCameraTask, "SpinCameraTask")

w = World()
run()

Please, put the code in “code” tags, because the indentation is lost. Thank you.