def test_ConstructionInfo_to_RigidBody(self): """ Verify that the initial motion state is transferred correctly to the RigidBody. """ mass = 10 pos = Vec3(1, 2, 3) rot = Quaternion(0, 1, 0, 0) t = Transform(rot, pos) ms = DefaultMotionState(t) cs = EmptyShape() inert = Vec3(1, 2, 4) # Compile the Rigid Body parameters. ci = RigidBodyConstructionInfo(mass, ms, cs, Vec3(2, 4, 6)) assert ci.localInertia == Vec3(2, 4, 6) ci.localInertia = inert assert ci.localInertia == inert # Construct the rigid body and delete the construction info. body = RigidBody(ci) del ci # Verify that the object is at the correct position and has the correct # mass and inertia. t = body.getMotionState().getWorldTransform() assert t.getOrigin() == pos assert t.getRotation() == rot assert body.getInvMass() == 1 / mass assert body.getInvInertiaDiagLocal() == Vec3(1, 0.5, 0.25)
def getRB(pos=Vec3(0, 0, 0), cshape=SphereShape(1), bodyID=0): """ Return a Rigid Body plus auxiliary information (do *not* delete; see note below). .. note:: Do not delete the tuple until the end of the test because it may lead to memory access violations. The reason is that a rigid body requires several indepenent structures that need to remain in memory. """ t = Transform(Quaternion(0, 0, 0, 1), pos) ms = DefaultMotionState(t) mass = 1 # Build construction info and instantiate the rigid body. ci = RigidBodyConstructionInfo(mass, ms, cshape) rb = RigidBody(ci, bodyID) # Ensure the body remains activated. rb.forceActivationState(4) return rb
def getRB(pos=Vec3(0, 0, 0), cshape=SphereShape(1)): """ Return a Rigid Body plus auxiliary information (do *not* delete; see note below). .. note:: Do not delete the tuple until the end of the test because it may lead to memory access violations. The reason is that a rigid body requires several indepenent structures that need to remain in memory. """ t = Transform(Quaternion(0, 0, 0, 1), pos) ms = DefaultMotionState(t) mass = 1 # Build construction info and instantiate the rigid body. ci = RigidBodyConstructionInfo(mass, ms, cshape) return RigidBody(ci)
def runSimulation(sim): # Create the collision shapes for the ball and ground. cs_ball = SphereShape(1) cs_ground = StaticPlaneShape(Vec3(0, 1, 0), 1) # Create a Rigid Body for the static (ie mass=0) Ground. q0 = Quaternion(0, 0, 0, 1) ms = DefaultMotionState(Transform(q0, Vec3(0, -1, 0))) ci = RigidBodyConstructionInfo(0, ms, cs_ground) rb_ground = RigidBody(ci, bodyID=1) del ms, ci # Create a Rigid body for the dynamic (ie mass > 0) Ball. ms = DefaultMotionState(Transform(q0, Vec3(0, 5, 0))) inertia = cs_ball.calculateLocalInertia(1) ci = RigidBodyConstructionInfo(1, ms, cs_ball, inertia) rb_ball = RigidBody(ci, bodyID=2) del ms, inertia, ci # Ensure that Bullet never deactivates the objects. rb_ground.forceActivationState(4) rb_ball.forceActivationState(4) # Add both bodies to the simulation. sim.addRigidBody(rb_ground) sim.addRigidBody(rb_ball) # Sanity check: the ball must be at position y=5 pos = rb_ball.getMotionState().getWorldTransform().getOrigin() pos = pos.topy() assert pos[1] == 5 # Step the simulation long enough for the ball to fall down and # come to rest on the plane. for ii in range(10): sim.stepSimulation(1, 100) # Verify that the y-position of the ball is such that the ball # rests on the plane. pos = rb_ball.getMotionState().getWorldTransform().getOrigin() return pos.topy()
from azBullet import DefaultMotionState, Transform from azBullet import RigidBody, RigidBodyConstructionInfo sim = azBullet.BulletBase() sim.setGravity(Vec3(0, -10, 0)) # Create a collision shape for the Ball and for the Ground. ballShape = SphereShape(1) groundShape = StaticPlaneShape(Vec3(0, 1, 0), 1) # Create a Rigid Body for the Ground based on the collision shape. mass = 0 groundRigidBodyState = DefaultMotionState( Transform(Quaternion(0, 0, 0, 1), Vec3(0, -1, 0))) ci = RigidBodyConstructionInfo(mass, groundRigidBodyState, groundShape) groundRigidBody = RigidBody(ci) groundRigidBody.setRestitution(1.0) sim.addRigidBody(groundRigidBody) del mass, ci # Create a Rigid body for the Ball based on its collision shape. Let Bullet do # the heavy lifting and compute the mass and inertia for us. fallRigidBodyState = DefaultMotionState( Transform(Quaternion(0, 0, 0, 1), Vec3(0, 20, 0))) mass = 1 fallInertia = ballShape.calculateLocalInertia(mass) ci = RigidBodyConstructionInfo( mass, fallRigidBodyState, ballShape, fallInertia) fallRigidBody = RigidBody(ci) fallRigidBody.setRestitution(0.5) sim.addRigidBody(fallRigidBody)
inertia, principal = cs.calculatePrincipalAxisTransform(masses) print('\nCenter of Mass: ', principal.getOrigin().topy()) print('Inertia Values: ', inertia) print('Inertia Principal Axis: ', principal.getRotation().topy()) del t1, t2, csSphere # Construct the rigid body for the compound shape based on the just computed # inertia tensor. print('\nTotal Mass: {}'.format(sum(masses))) ci = azBullet.RigidBodyConstructionInfo( sum(masses), azBullet.DefaultMotionState(principal), cs, inertia, ) body = RigidBody(ci) # Add the body with its compound shape to the simulation. sim.addRigidBody(body) del masses, ci # Apply an initial force and torque (only valid for the first simulation step # because Bullet will clear all the forces afterwards). body.clearForces() body.applyCentralForce(Vec3(*(0, 1, 0))) # body.applyTorque(Vec3(*(0, 1, 0))) # Step the simulation and print the position of the Ball. for ii in range(10): wt = body.getMotionState().getWorldTransform() pos = wt.getOrigin().topy()
# Instantiate the Bullet simulation. sim = azBullet.BulletBase() sim.setGravity(Vec3(0, -10, 0)) # Create the collision shape for Ball and Ground. ballShape = SphereShape(1) groundShape = StaticPlaneShape(Vec3(0, 1, 0), 1) # Create the rigid body for the Ground. Since it is a static body its mass must # be zero. mass = 0 groundRigidBodyState = DefaultMotionState( Transform(Quaternion(0, 0, 0, 1), Vec3(0, -1, 0))) ci = RigidBodyConstructionInfo(mass, groundRigidBodyState, groundShape) groundRigidBody = RigidBody(ci) groundRigidBody.setRestitution(1.0) sim.addRigidBody(groundRigidBody) del mass, ci # Create the rigid body for the Ball. Since it is a dynamic body we need to # specify mass and inertia. The former we need to do ourselves but Bullet can # do the heavy lifting for the Inertia and compute it for us. fallRigidBodyState = DefaultMotionState( Transform(Quaternion(0, 0, 0, 1), Vec3(0, 20, 0))) mass = 1 fallInertia = ballShape.calculateLocalInertia(mass) ci = RigidBodyConstructionInfo(mass, fallRigidBodyState, ballShape, fallInertia) fallRigidBody = RigidBody(ci) fallRigidBody.setRestitution(0.5)