RigidBodyPhysics Example: Getting Started
From H3D.org
Welcome to the very first example of H3DAPI RigidBodyPhysics (RBP), in this example we'll show you how to add physics-enabled simulation to current geometry nodes. The example displays 2 objects: a ground and a panel. When you press 'G', RBP is enabled and the panel (according to law of gravitation) falls down to the ground.
Alternatively, you can download the example here.
Contents |
The example
Step 1: The geometry nodes
<Transform DEF='BOX-T'> <Shape DEF='BOX-S'> <Appearance DEF='A'> <Material diffuseColor='0.7 0.2 0.4' /> <FrictionalSurface /> </Appearance> <Box DEF='BOX-G' size='0.4 0.004 0.4' /> </Shape> </Transform> <Transform DEF='BOX2-T'> <Shape DEF='BOX2-S'> <Appearance USE='A' /> <Box DEF='BOX2-G' size='0.7 0.008 0.05' /> </Shape> </Transform>
BOX is the ground and BOX2 is the panel. Nothing really fancy, let's move on fast to the next step!
Step 2: Adding RigidBodyPhysics
The node to indicate RigidBodyPhysics scope is <RigidBodyCollection>, here you can set the global settings for it. Refer to the Specs for more information. In this example we will use ODE engine and set the gravity force along the y-axis, downward.
<RigidBodyCollection physicsEngine='ODE' gravity='0 -1 0'>
Next we will define group of collidable objects through <CollidableCollection> and <CollidableShape>
<CollisionCollection containerField='collider' bounce='0'> <CollidableShape DEF='BOX-C' containerField='collidables'> <Shape USE='BOX-S' containerField='shape' /> </CollidableShape> <CollidableShape DEF='BOX2-C' containerField='collidables'> <Shape USE='BOX2-S' containerField='shape' /> </CollidableShape> </CollisionCollection>
The CollisionCollection holds a collection of objects that can be collided against each other.
Next we define our RigidBody objects (within the RigidBodyCollection node)
<RigidBody DEF='BOX-R' fixed='true'> <Geometry USE='BOX-C' containerField='geometry' /> <Box USE='BOX-G' containerField='massDensityModel' /> </RigidBody> <RigidBody DEF='BOX2-R'> <Geometry USE='BOX2-C' containerField='geometry' /> <Box USE='BOX2-G' containerField='massDensityModel' /> </RigidBody>
The RigidBody present an rigid object that those physics law can be applied upon.
Another way of looking at it is that while <Shape> gives you the look, <RigidBody> adds the sense of realistic to it. And to make sure that the "look" object and the "realistic" object are always coordinately identical, we route from RigidBody's position and orientation to the <Transform>'s translation and rotation (this would be outside of <RigidBodyCollection>:
<ROUTE fromNode='BOX-R' fromField='position' toNode='BOX-T' toField='translation' /> <ROUTE fromNode='BOX-R' fromField='orientation' toNode='BOX-T' toField='rotation' /> <ROUTE fromNode='BOX2-R' fromField='position' toNode='BOX2-T' toField='translation' /> <ROUTE fromNode='BOX2-R' fromField='orientation' toNode='BOX2-T' toField='rotation' />
So to make it short, the <Shape>, <Box> at el create the geometry object which you can see, then <RigidBody> creates the realistic object, and <CollidableCollection> group these realistic objects together and make sure they could collide against each other.
Step 3: Toggling button
We purposely set enable to false, we now allow user to press 'g' to toggle enable/disable:
<KeySensor DEF='K' /> <PythonScript DEF='P' url='eg01.py' /> <ROUTE fromNode='K' fromField='keyPress' toNode='P' toField='toggleRBP' />
And the python script:
rbc, = references.getValue() class ToggleRBP(AutoUpdate(SFString)): def update(self, event): global rbc if event.getValue() == 'g' or event.getValue() == 'G': val = 1 - rbc.enabled.getValue() print 'RBP toggled: ' + str(val) rbc.enabled.setValue(val) return '' toggleRBP = ToggleRBP()
Conclusion
After this simple example, you now have an idea how to write a simple h3d application with RigidBodyPhysics.

