# Model # bouncingBox = Model(t0, T) # add the dynamical system to the non smooth dynamical system bouncingBox.nonSmoothDynamicalSystem().insertDynamicalSystem(body) # # Simulation # # (1) OneStepIntegrators osi = MoreauJeanOSI(theta) osi.insertDynamicalSystem(body) ground = btCollisionObject() ground.setCollisionFlags(btCollisionObject.CF_STATIC_OBJECT) groundShape = btBoxShape(btVector3(30, 30, .5)) basis = btMatrix3x3() basis.setIdentity() ground.getWorldTransform().setBasis(basis) ground.setCollisionShape(groundShape) ground.getWorldTransform().getOrigin().setZ(-.5) # (2) Time discretisation -- timedisc = TimeDiscretisation(t0, h) # (3) one step non smooth problem osnspb = FrictionContact(3) osnspb.numericsSolverOptions().iparam[0] = 1000
def importObject(self, name, translation, orientation, velocity, contactors, mass, inertia, body_class, shape_class): if body_class is None: body_class = BulletDS if self._broadphase is not None and 'input' in self._data: if mass == 0.: # a static object rbase = btQuaternion(orientation[1], orientation[2], orientation[3], orientation[0]) for c in contactors: (w, x, y, z) = c.orientation c_orientation = btQuaternion(x, y, z, w) rc_orientation = mul(rbase, c_orientation) c_origin = btVector3(c.translation[0], c.translation[1], c.translation[2]) rc_origin = quatRotate(rbase, c_origin) rc_sorigin = btVector3(rc_origin.x() + translation[0], rc_origin.y() + translation[1], rc_origin.z() + translation[2]) static_cobj = btCollisionObject() static_cobj.setCollisionFlags( btCollisionObject.CF_STATIC_OBJECT) self._static_origins.append(rc_sorigin) self._static_orientations.append(rc_orientation) transform = btTransform(rc_orientation) transform.setOrigin(rc_sorigin) self._static_transforms.append(transform) static_cobj.setWorldTransform(transform) static_cobj.setCollisionShape( self._shape.get(c.name)) self._static_cobjs.append(static_cobj) self._broadphase.addStaticObject(static_cobj, int(c.group)) else: # a moving object bws = BulletWeightedShape( self._shape.get(contactors[0].name), mass) if inertia is not None: bws.setInertia(inertia[0], inertia[1], inertia[2]) body = body_class(bws, translation + orientation, velocity, contactors[0].translation, contactors[0].orientation, contactors[0].group) for contactor in contactors[1:]: shape_id = self._shapeid[contactor.name] body.addCollisionShape(self._shape.get(contactor.name), contactor.translation, contactor.orientation, contactor.group) # set external forces self._set_external_forces(body) # add the dynamical system to the non smooth # dynamical system nsds = self._broadphase.model().nonSmoothDynamicalSystem() nsds.insertDynamicalSystem(body) nsds.setOSI(body, self._osi) nsds.setName(body, str(name))