Historique des modifications - Message

Message #8355

Sujet: Problème de rendu des triangle3d


Type Date Auteur Contenu
Dernière modification 18-07-2010 23:12:37 mr.xyz
Voila le main :

Code c++ :


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;
}
 
Création du message 18-07-2010 23:10:56 mr.xyz
Voila le main :

Code c++ :


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;
}
 

Retour

Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
154 invités en ligne
membre en ligne: -
RSS Feed