def getImpulse(m1,m2): vr = m1.getVelocity().copy() vr.sub(m2.getVelocity()) n = Vector2d.normal(m2.getPosition(),m1.getPosition()) impulse = n.copy() #m1.getPosition().display() #m2.getPosition().display() #impulse.display() s = Vector2d.dotProduct(vr,n)*(1 + 0.5) impulse.mulScalar(s) return impulse
def step(self,step): for mobile in self.mobiles: mobile.applyStep(step) grav = self.gravity.copy() grav.mulScalar(mobile.getMass()) #grav.rotate(mobile.getAngle()) mobile.applyForce(step,grav) for mobile2 in self.mobiles: if mobile != mobile2: if mobile.isBound(mobile2.getPosition(),mobile2.getRadius()) == 1: n = Vector2d.normal(mobile2.getPosition(),mobile.getPosition()) vn = Vector2d.dotProduct(mobile.getVelocity(),n) if vn < 0: #mobile.getVelocity().display() #n.display() Mobile.solveCollide(mobile,mobile2) mobile.applyStep(step) mobile2.applyStep(step) for plane in self.planes: #d = plane.distancePoint(mobile.getPosition()) #vn = Vector2d.dotProduct(mobile.getVelocity(),plane.getNormal()) #if d < 0 and vn < 0: # plane.reflective(mobile) for submobile in mobile.getMobiles(): d = plane.distancePoint(submobile.getPhysicalPosition()) vn = Vector2d.dotProduct(submobile.getVelocity(),plane.getNormal()) if d < submobile.getRadius() and vn < 0: #ADDED CONDITION OVER PHYSICAL POINTS if submobile.getUpdatedPhysicalPoints().count > 0: ppcollide = 0 for point in submobile.getUpdatedPhysicalPoints(): if plane.distancePoint(point) < 0: self.groundcollider.collideEvent(point) n = plane.getNormal().copy() n.normalize() n.mulScalar(-plane.distancePoint(point)) #n.display() mobile.getPosition().add(n) mobile.updateMobiles() ppcollide = 1 if ppcollide == 1: plane.reflective(submobile) for submobile2 in mobile.getMobiles(): v = submobile2.getVelocity() v.set(0.0,v.getY()) mobile.angularVelocity = mobile.angularVelocity * 0.8