/**
  * adds an object to the physics space
  *
  * @param obj the PhysicsControl or Spatial with PhysicsControl to add
  */
 public void add(Object obj) {
   if (obj instanceof PhysicsControl) {
     ((PhysicsControl) obj).setPhysicsSpace(this);
   } else if (obj instanceof Spatial) {
     Spatial node = (Spatial) obj;
     for (int i = 0; i < node.getNumControls(); i++) {
       if (node.getControl(i) instanceof PhysicsControl) {
         add(((PhysicsControl) node.getControl(i)));
       }
     }
   } else if (obj instanceof PhysicsCollisionObject) {
     addCollisionObject((PhysicsCollisionObject) obj);
   } else if (obj instanceof PhysicsJoint) {
     addJoint((PhysicsJoint) obj);
   } else {
     throw (new UnsupportedOperationException(
         "Cannot add this kind of object to the physics space."));
   }
 }
 /**
  * removes an object from the physics space
  *
  * @param obj the PhysicsControl or Spatial with PhysicsControl to remove
  */
 public void remove(Object obj) {
   if (obj == null) return;
   if (obj instanceof PhysicsControl) {
     ((PhysicsControl) obj).setPhysicsSpace(null);
   } else if (obj instanceof Spatial) {
     Spatial node = (Spatial) obj;
     for (int i = 0; i < node.getNumControls(); i++) {
       if (node.getControl(i) instanceof PhysicsControl) {
         remove(((PhysicsControl) node.getControl(i)));
       }
     }
   } else if (obj instanceof PhysicsCollisionObject) {
     removeCollisionObject((PhysicsCollisionObject) obj);
   } else if (obj instanceof PhysicsJoint) {
     removeJoint((PhysicsJoint) obj);
   } else {
     throw (new UnsupportedOperationException(
         "Cannot remove this kind of object from the physics space."));
   }
 }