Beispiel #1
0
def rigid_sphere(center=(0, 0, 0), radius=1, mass=1, 
        rotation=Quaternion(0, 0, 0, 1), motion_state=None):
    """
    Create a :class:`SphereShape` :class:`RigidBody`.
    """
    if not isinstance(center, Vector3):
        center = Vector3(*center)
    shape = SphereShape(radius)
    if motion_state is None:
        motion_state = DefaultMotionState(Transform(rotation, center))
    inertia = shape.calculateLocalInertia(mass)
    rigid_body_ci = RigidBodyConstructionInfo(mass, motion_state, shape,
            inertia)
    rigid_body = RigidBody(rigid_body_ci)
    return rigid_body
Beispiel #2
0
def test_hello_world():
    """
    Port of the hello world example from the tutorial.
    """
    # Setup world
    broadphase = DbvtBroadphase()
    collision_config = DefaultCollisionConfiguration()
    dispatcher = CollisionDispatcher(collision_config)
    solver = SequentialImpulseConstraintSolver()
    world = DiscreteDynamicsWorld(dispatcher, broadphase, solver,
            collision_config)
    world.setGravity(Vector3(0, -9.8, 0))
    # Create collision shapes
    ground_shape = StaticPlaneShape(Vector3(0, 1, 0), 1)
    ball_shape = SphereShape(1)
    # Create ground rigid body
    ground_motion_state = DefaultMotionState(
            Transform(Quaternion(0, 0, 0, 1), Vector3(0, -1, 0)))
    ground_rigid_body_ci = RigidBodyConstructionInfo(0, ground_motion_state,
            ground_shape, Vector3(0, 0, 0))
    ground_rigid_body = RigidBody(ground_rigid_body_ci)
    world.addRigidBody(ground_rigid_body)
    # Create ball rigid body
    ball_motion_state = DefaultMotionState(
            Transform(Quaternion(0, 0, 0, 1), Vector3(0, 50, 0)))
    mass = 1
    ball_inertia = ball_shape.calculateLocalInertia(mass)
    ball_rigid_body_ci = RigidBodyConstructionInfo(mass, ball_motion_state,
            ball_shape, ball_inertia)
    ball_rigid_body = RigidBody(ball_rigid_body_ci)
    world.addRigidBody(ball_rigid_body)
    # Simulate 300 frames, should be enough for the sphere to reach rest state
    for i in range(300):
        world.stepSimulation(1.0 / 60.0, 10)
        #trans = ball_rigid_body.motionState.worldTransform
        #print trans.origin.y
    # Verify ball position
    trans = ball_motion_state.worldTransform
    assert_almost_equal(trans.origin.y, 1.0, places=5)
    trans = ball_rigid_body.motionState.worldTransform
    assert_almost_equal(trans.origin.y, 1.0, places=5)