int main()
{
int lastFPS = -1;
int windowW = 640;//important de stocker la taille de la fenetre dans des variable pour positionner le curseur
int windowH = 480;
float init_ant_posX=1000.f;
float init_ant_posZ=2000.f;
// Fenetre
SIrrlichtCreationParameters params;
params.AntiAlias = 2;
params.Bits = 16;
params.Fullscreen = false;
params.WindowSize = dimension2d<u32>(windowW, windowH);
params.DriverType = video::EDT_OPENGL;
IrrlichtDevice* device = createDeviceEx(params);
// Driver
video::IVideoDriver* driver = device->getVideoDriver ();
driver->setFog(video::SColor(0, 200, 170, 120), video::EFT_FOG_LINEAR, 4000.0f, 12000.0f, 0.03f, false, false);
// Scene Manager
scene::ISceneManager *sceneManager = device->getSceneManager ();
sceneManager->setAmbientLight(video::SColorf(1.0, 1.0, 1.0f, 0.0f));
// Curseur
device->getCursorControl ()-> setVisible (false);
// Terrain
scene::ITerrainSceneNode* terrain = sceneManager->addTerrainSceneNode(
"heightmap.bmp", // heightmap
0, // parent node
IDFlag_IsPickable, // ID
core::vector3df(0.f, 0.f, 0.f), // position
core::vector3df(0.f, 0.f, 0.f), // rotation
core::vector3df(40.f, 4.4f, 40.f), // scale
video::SColor ( 255, 255, 255, 255 ), // vertexColor,
5, // maxLOD
scene::ETPS_17, // patchSize
100 // smoothFactor
);
terrain->setMaterialFlag(video::EMF_LIGHTING, false); // Lumiere
terrain->setMaterialFlag(video::EMF_FOG_ENABLE, true);
terrain->setMaterialTexture(0, driver->getTexture("texture.bmp")); // Texture
terrain->setMaterialTexture(1, driver->getTexture("detailmap.jpg"));
terrain->setMaterialType(video::EMT_DETAIL_MAP); // Type de material
terrain->scaleTexture(1.0f, 20.0f); // Scale texture
// Création du selector du terrain
scene::ITriangleSelector* selector = sceneManager->createTerrainTriangleSelector(terrain, 0);
terrain->setTriangleSelector(selector);
// Skybox
sceneManager->addSkyBoxSceneNode(
driver->getTexture("irrlicht2_up.jpg"),
driver->getTexture("irrlicht2_dn.jpg"),
driver->getTexture("irrlicht2_lf.jpg"),
driver->getTexture("irrlicht2_rt.jpg"),
driver->getTexture("irrlicht2_ft.jpg"),
driver->getTexture("irrlicht2_bk.jpg"));
// Fourmi
float antScale = 2.0f;
scene::IAnimatedMesh* model = sceneManager->getMesh("formica rufa.3ds");
scene::IAnimatedMeshSceneNode* Nmodel = sceneManager->addAnimatedMeshSceneNode(model);
Nmodel->setFrameLoop(1, 310);
Nmodel->setScale(core::vector3df(antScale,antScale,antScale));
Nmodel->setMaterialFlag(video::EMF_LIGHTING, false);
Nmodel->setMaterialTexture(0,driver->getTexture("texture.jpg") );
Nmodel->setPosition(core::vector3df(init_ant_posX,terrain->getHeight(init_ant_posX,init_ant_posZ),init_ant_posZ));
Nmodel->setID(IDFlag_IsPickable);
core::aabbox3df boundingBox = Nmodel->getBoundingBox();
core::vector3df extent = boundingBox.getExtent();
show3dVector("Taille de la foumi: ",extent);
selector->drop();
// Arbre
float treeScale = 300.f;
scene::IMesh* tree = sceneManager->getMesh("Tree/DG_Tree.obj");
scene::IMeshSceneNode* Ntree = sceneManager->addMeshSceneNode(tree);
Ntree->setScale(core::vector3df(treeScale,treeScale,treeScale));
Ntree->setMaterialFlag(video::EMF_LIGHTING, false);
Ntree->getMaterial(1).setTexture(0,driver->getTexture("Tree/Leaf.png"));
Ntree->setMaterialType(video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF);
Ntree->setPosition(core::vector3df(2000.f,0.f,2000.f));
Ntree->setID(ID_IsNotPickable);
// Selector de l'arbre
scene::ITriangleSelector* selector2 = sceneManager->createTriangleSelector(tree,Ntree);
Ntree->setTriangleSelector(selector2);
// Création de l'animator et l'attache au mesh de la fourmi
scene::ISceneNodeAnimator* anim = sceneManager->createCollisionResponseAnimator(
selector2, Nmodel, extent,
core::vector3df(0,0,0));
selector2->drop();
Nmodel->addAnimator(anim);
anim->drop();
// Camera
SKeyMap keyMap[4];
keyMap[0].Action = EKA_MOVE_FORWARD;
keyMap[0].KeyCode = KEY_UP;
keyMap[1].Action = EKA_MOVE_BACKWARD;
keyMap[1].KeyCode = KEY_DOWN;
keyMap[2].Action = EKA_STRAFE_LEFT;
keyMap[2].KeyCode = KEY_LEFT;
keyMap[3].Action = EKA_STRAFE_RIGHT;
keyMap[3].KeyCode = KEY_RIGHT;
scene::ICameraSceneNode *camera;
float speed=0.03f;
camera = sceneManager->addCameraSceneNodeFPS (0,50.0f, speed, ID_IsNotPickable, keyMap, 5, true, 0.4);
camera->setPosition(core::vector3df(init_ant_posX, terrain->getHeight(init_ant_posX,init_ant_posZ) + CEventManager::CameraHeightOnTerrain, init_ant_posZ));
camera->setTarget(Nmodel->getPosition());
camera->setFarValue(15000.0f); // horizon
// Mouvement du model
CEventManager mManager(driver,sceneManager,Nmodel,terrain,camera);
// Evenements
CEventReceiver capteur(device,&mManager); // creation capteur d'events
device->setEventReceiver(&capteur);
// Inclinaison sur le terrain
scene::ISceneCollisionManager* collMan = sceneManager->getSceneCollisionManager();
// Ligne de collision
core::line3df verticalLine;
core::vector3df modelPos;
// Tracks the current intersection point with the level or a mesh
core::vector3df intersection;
// Used to show with triangle has been hit
core::triangle3df hitTriangle;
scene::ISceneNode * selectedSceneNode;
video::SMaterial material;
material.NormalizeNormals = true ;
material.setTexture(0,0);
material.Lighting = false;
int cpt=0;
while (device->run())
{
driver->beginScene(true,true,0);
// Mouvement du model
mManager.moveObjects();
modelPos = Nmodel->getPosition();
verticalLine.start = modelPos;
verticalLine.start.Y += 1000;
core::vector3df endPoint = modelPos;
endPoint.Y -= 1000;
verticalLine.end = endPoint;
selectedSceneNode =
collMan->getSceneNodeAndCollisionPointFromRay(
verticalLine,
intersection,
hitTriangle,
IDFlag_IsPickable, // This ensures that only nodes that we have set up to be pickable are considered
0); // Check the entire scene (this is actually the implicit default)
if(selectedSceneNode != 0)
{
driver->setMaterial(material);
driver->setTransform(video::ETS_WORLD, core::matrix4());
driver->draw3DTriangle(hitTriangle, video::SColor(255,255,0,0));
core::vector3df normal = hitTriangle.getNormal().normalize();
core::vector3df newModelRotation = Nmodel->getRotation();
// Inclinaison en X
float cosX = normal.dotProduct(core::vector3df(1,0,0));
float angleX = acos(cosX);
//cout<<"angleX: "<<angleX<<endl;
// Inclinaison en Z
float cosZ = normal.dotProduct(core::vector3df(0,0,1));
float angleZ = acos(cosZ);
//cout<<"angleZ: "<<angleZ<<endl;
newModelRotation.X = angleX;
newModelRotation.Z = angleZ;
Nmodel->setRotation(newModelRotation);
//show3dVector("Normale: ",hitTriangle.getNormal());
//show3dVector("Normale normalisee: ",normal);
}
// Affichage
sceneManager->drawAll();
driver->endScene();
int fps = driver->getFPS();
if (lastFPS != fps)
{
core::stringw str = L"3DAntSimulator - Irrlicht Engine [";
str += driver->getName();
str += "] FPS:";
str += fps;
device->setWindowCaption(str.c_str());
lastFPS = fps;
}
device->sleep(25);
}
device->drop();
return 0;
}