CollisionHandlerPusher

I dont’t find the roaming ralph in c++ version:
in this topic [url]Roaming Ralph in C++] the link is broken
I try to do it by myself and i write this code:

#include "pandaFramework.h"
#include "pandaSystem.h"
#include "collisionTraverser.h"
#include "collisionNode.h"
#include "collisionPlane.h"
#include "collisionHandlerPusher.h"
#include "collisionSphere.h"
#include "nodePath.h"
#include "collisionHandlerEvent.h"
#include "plane.h"
#include "lpoint3.h"
#include "lvector3.h"
#include "boundingPlane.h"

#define ACCEL 200
float vel =0;

PandaFramework framework;
AsyncTaskManager* taskMgr = AsyncTaskManager::get_global_ptr();
WindowFramework *window;
NodePath smile;

AsyncTask::DoneStatus rotCamTask(GenericAsyncTask* task, void* data) {
	window->get_camera_group().look_at(smile);
	return AsyncTask::DS_cont;
}

AsyncTask::DoneStatus moveSmile(GenericAsyncTask* task, void* data) {
	vel += ACCEL*task->get_dt();
	smile.set_z(smile.get_z() - vel*task->get_dt());
	return AsyncTask::DS_cont;
}

int main(int argc, char *argv[]) {
	framework.open_framework(argc, argv);
	framework.set_window_title("My Panda3D Window");
	window = framework.open_window();
 	
	CollisionTraverser trav;
	trav.show_collisions(window->get_render());
	CollisionHandlerPusher* notifier = new CollisionHandlerPusher();
	notifier->add_in_pattern("%fn-in-%in");
	
	smile = window->load_model(framework.get_models(), "models/frowney");
	smile.reparent_to(window->get_render());
	smile.set_pos(0, 0, 10);
	
	CollisionSphere* col_solid = new CollisionSphere(0, 0, 0, 1);
	CollisionNode* col_node = new CollisionNode("Sphere");
	col_node->add_solid(col_solid);
	NodePath col = smile.attach_new_node(col_node);
	col.show();
    trav.add_collider(col, notifier);
    
    CollisionPlane* col_plane = new CollisionPlane(LPlane(LVector3f(0, 0, 1), LPoint3f(0, 0, 0)));
    col_node = new CollisionNode("Floor");
    col_node->add_solid(col_plane);
    NodePath floor = window->get_render().attach_new_node(col_node);
    floor.show();
    
 	NodePath cam = window->get_camera_group();
 	cam.set_pos(0, -10, 4);
 	cam.look_at(smile);
 	
 	// Add our task.
  	taskMgr->add(new GenericAsyncTask("Rotate camera", &rotCamTask, (void*) &smile));
  	taskMgr->add(new GenericAsyncTask("Move smile", &moveSmile, (void*) &smile));
 	
 
	framework.main_loop();
	framework.close_framework();
	return (0);
}

but when the smile touch the floor, the sphere crosses the plane.

Why?