Did not figure it out yet… still trying 
So here is the code:
public class TestIsland extends BaseGame {
private Surfboard player;
private CollisionResults results;
private float agl;
private Node rootNode, n;
//.....
}
@Override
protected void initGame() {
pManager = new BasicPassManager();
rootNode = new Node( "rootNode" );
ZBufferState buf = display.getRenderer().createZBufferState();
buf.setEnabled( true );
buf.setFunction( ZBufferState.CF_LEQUAL );
rootNode.setRenderState( buf );
PointLight light = new PointLight();
light.setDiffuse( new ColorRGBA( 0.75f, 0.75f, 0.75f, 0.75f ) );
light.setAmbient( new ColorRGBA( 0.5f, 0.5f, 0.5f, 1.0f ) );
light.setLocation( new Vector3f( 100, 100, 100 ) );
light.setEnabled( true );
lightState = display.getRenderer().createLightState();
lightState.setEnabled( true );
lightState.attach( light );
rootNode.setRenderState( lightState );
timer.reset();
cam.setFrustumPerspective( 45.0f, (float) display.getWidth() / (float) display.getHeight(), 1f, farPlane );
cam.setLocation( new Vector3f( 100, 50, 100 ) );
cam.lookAt( new Vector3f( 0, 0, 0 ), Vector3f.UNIT_Y );
cam.update();
setupKeyBindings();
setupFog();
buildTerrain();
buildPlayer();
buildInput();
buildChaseCamera();
buildSphere();
Node reflectedNode = new Node( "reflectNode" );
buildSkyBox();
reflectedNode.attachChild( skybox );
rootNode.attachChild( reflectedNode );
waterEffectRenderPass = new WaterRenderPass( cam, 4, false, true );
waterEffectRenderPass.setWaterPlane( new Plane( new Vector3f( 0.0f, 1.0f, 0.0f ), 0.0f ) );
waterQuad = new Quad( "waterQuad", 1, 1 );
FloatBuffer normBuf = waterQuad.getNormalBuffer( 0 );
normBuf.clear();
normBuf.put( 0 ).put( 1 ).put( 0 );
normBuf.put( 0 ).put( 1 ).put( 0 );
normBuf.put( 0 ).put( 1 ).put( 0 );
normBuf.put( 0 ).put( 1 ).put( 0 );
waterEffectRenderPass.setWaterEffectOnSpatial( waterQuad );
rootNode.attachChild( waterQuad );
waterEffectRenderPass.setReflectedScene( reflectedNode );
waterEffectRenderPass.setSkybox( skybox );
pManager.add( waterEffectRenderPass );
RenderPass rootPass = new RenderPass();
rootPass.add( rootNode );
pManager.add( rootPass );
rootNode.setCullMode( SceneElement.CULL_NEVER);
rootNode.setRenderQueueMode( Renderer.QUEUE_OPAQUE );
rootNode.updateGeometricState( 0.0f, true );
rootNode.updateRenderState();
timer.reset();
results = new BoundingCollisionResults() {
public void processCollisions() {
if (getNumber() > 0) {
System.out.println("Collision: YES");
} else {
System.out.println("Collision: NO");
}
}
};
}
@Override
protected void update(float interpolation) {
timer.update();
tpf = timer.getTimePerFrame();
Vector3f transVec2 = new Vector3f(player.getLocalTranslation());
Vector3f heightTerrain = new Vector3f(0,0,0);
tb.localToWorld(transVec2, heightTerrain);
if ( tb.getHeight(player.getLocalTranslation()) > 8.4 ){
//System.out.println("heightTerrain.y:" + tb.getHeight(player.getLocalTranslation()));
player.setVelocity(-1f);
}
input.update( tpf );
chaser.update(tpf);
//collisions check player and sphere
results.clear();
player.calculateCollisions(n, results);
if(player.hasCollision(n, true)) {
logger.info("hasCollision also reports true");
}
GameTaskQueueManager.getManager().getQueue(GameTaskQueue.UPDATE).execute();
if ( KeyBindingManager.getKeyBindingManager().isValidCommand( "exit",
false ) ) {
finished = true;
}
skybox.getLocalTranslation().set( cam.getLocation() );
skybox.updateGeometricState( 0.0f, true );
Vector3f transVec = new Vector3f( cam.getLocation().x, waterEffectRenderPass.getWaterHeight(), cam.getLocation().z );
setTextureCoords( 0, transVec.x, -transVec.z, textureScale );
setVertexCoords( transVec.x, transVec.y, transVec.z );
//We don't want the chase camera to go below the world, so always keep
//it 2 units above the level.
if(cam.getLocation().y < (tb.getHeight(cam.getLocation()))) {
cam.getLocation().y = tb.getHeight(cam.getLocation()) ;
cam.update();
}
//make sure that if the player left the level we don't crash. When we add collisions,
//the fence will do its job and keep the player inside.
float characterMinHeight = 0.0f + agl;
if (!Float.isInfinite(characterMinHeight) && !Float.isNaN(characterMinHeight)) {
player.getLocalTranslation().y = characterMinHeight;
}
//get the normal of the terrain at our current location. We then apply it to the up vector
//of the player.
tb.getSurfaceNormal(player.getLocalTranslation(), normal);
if(normal != null) {
player.rotateUpTo(normal);
}
rootNode.updateGeometricState(tpf, true);
pManager.updatePasses(tpf);
}
Now the buildPlayer() and buildSphere()
private void buildPlayer(){
Spatial model = null;
try {
java.net.URL bikeFile = TestIsland.class.getClassLoader().getResource("data/model/bike.jme");
BinaryImporter importer = new BinaryImporter();
model = (Spatial)importer.load(bikeFile.openStream());
model.setModelBound(new BoundingBox());
model.updateModelBound();
//scale it to be MUCH smaller than it is originally
model.setLocalScale(.015f);
} catch (IOException e) {
logger
.throwing(this.getClass().toString(), "buildPlayer()",
e);
}
//set the vehicles attributes (these numbers can be thought
//of as Unit/Second).
player = new Surfboard("Player Node", model);
player.setAcceleration(15);
player.setTurnSpeed(4.5f);
player.setWeight(25);
player.setMaxSpeed(155);
player.setMinSpeed(0);
player.setLocalRotation(new Matrix3f(0,0,1.0f,0,1.0f,0,-1.0f,0,0));
player.setLocalTranslation(new Vector3f(0,0, (float)display.getWidth()* 1.4f));
rootNode.attachChild(player);
rootNode.updateGeometricState(0, true);
//we now store this initial value, because we are rotating the wheels the bounding box will
//change each frame.
agl = ((BoundingBox)player.getWorldBound()).yExtent;
player.setRenderQueueMode(Renderer.QUEUE_OPAQUE);
}
private void buildSphere(){
// Make a box
Sphere s=new Sphere("My sphere",50,50,1f);
s.setLocalScale(5f);
s.setLocalTranslation(new Vector3f(263.75204f, 2.1998527f, 1154.8876f));
s.setModelBound(new BoundingBox());
s.updateModelBound();
// Make a node and give it children
rootNode.updateWorldBound();
rootNode.attachChild(s); // Put it in the scene graph
}
It must be the node n! It is built in the buildSphere()