#0 

18-07-2010 22:05:07

mr.xyz
Membre
Date d'inscription: 01-07-2010
Messages: 15

Bonjour,

Pour gérer les collisions, j'affiche le hittriangle ( le triangle en collision avec mon mesh) en rouge via la fonction draw3DTriangle (comme le tuto 7 officiel). Au début sa marchait bien, mais depuis hier les triangles sont complètement transparents, sans couleur, ils ne s'affichent que pendant que je bouge la caméra, alors que le code n'a pas changé je pense :s ... (j'ai restesté avec le tuto officiel, et la sa marche, donc je ne comprend vraiment plus rien) Merci d'avance, si vous souhaitez que je poste du code ya pas de soucis smile !

Dernière modification par mr.xyz (18-07-2010 22:07:51)

Hors ligne


#1 

18-07-2010 22:43:34

nabouill
Abonné
Date d'inscription: 17-09-2009
Messages: 242
Corrections: 1

Salut

si vous souhaitez que je poste du code ya pas de soucis


ouais ce serait pas mal, sinon comment veut tu, car là par rapport a ce que tu dit, ça ne peut venir que d'un problème de code (enfin je pense wink )


mes sites: www.manga-vf.fr et www.series-vf.fr

Hors ligne


#2 

19-07-2010 01:10:56

mr.xyz
Membre
Date d'inscription: 01-07-2010
Messages: 15

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

Dernière modification par mr.xyz (19-07-2010 01:12:37)

Hors ligne


#3 

21-07-2010 17:46:44

mr.xyz
Membre
Date d'inscription: 01-07-2010
Messages: 15

Up please smile

Hors ligne


#4 

29-07-2010 18:04:43

mr.xyz
Membre
Date d'inscription: 01-07-2010
Messages: 15

Désolé j'aime pas trop up mais bon..
Je ne trouve toujours pas de solution, j'ai beau changer la couleur tu triangle affiché, il reste transparent, pour n'importe quelle valeur

Hors ligne


#5 

29-07-2010 22:26:21

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 908
Corrections: 2
Site web

tu dit avoire essayer de changer la couleur mais le premier truc que je regarde et je voie << video::SColor(255,255,0,0) >> ... pour moi c'est claire tu essaye d'afficher un triangler avec l'alpha à 100% transparent essaye plutot avec 255,255,0,255 ...
SColor est en mode rgba et non argb ... tu était au courrant au moin ? ou alors tu croyais que l'alpha a 0 = pas de transparence ...

ah et ses mieux si tu affiche ton triangle après le rendue de ta scene, sa se veras mieux s'il se superpose << sceneManager->drawAll(); >> tu le mais avans ta condition

Hors ligne


#6 

30-07-2010 00:26:00

mr.xyz
Membre
Date d'inscription: 01-07-2010
Messages: 15

Merci beaucoup, il fallait en effet afficher le triangle après l'affichage de la scene (il me semblait avoir testé cette solution pourtant). Par contre (c'est peut être une différence de version à voir) moi c'est bien argb. Et oui je m'étais trompé en metant 0 pour la transparence

Merci beaucoup en tout cas même si je pouvais avancer sur mon projet je m'obstinais à résoudre ce problème et tu me permets d'avancer maintenant. Encore merci wink

Hors ligne


#7 

30-07-2010 01:42:22

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 908
Corrections: 2
Site web

euh oui argb ... dsl j'ai confondue avec mon moteur 3d ...

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
881 membres
1427 sujets
11117 messages
Dernier membre inscrit: Bidule
15 invités en ligne
Aucun membre connecté
RSS Feed