#0 

10-05-2013 21:08:39

wamilou
Membre
Date d'inscription: 10-05-2013
Messages: 15

Bonjour à tous,

Je suis nouveau par ici et j'aimerai un peu d'aide pour la fonction getCollisionPoint().
Elle marche mais seulement elle me renvoie un mesh qui n'ait pas le bon :x

Code c++ :

position2d<int> pos = device->getCursorControl()->getPosition();
const core::line3d<float> ray = smgr->getSceneCollisionManager()->getRayFromScreenCoordinates(pos);
vector3df point;
triangle3df triangle_hit;
ISceneNode *node_hit = 0;
if (smgr->getSceneCollisionManager()->getCollisionPoint(ray, selector, point, triangle_hit, node_hit))
{
        node_hit->setPosition(vector3df(0,100,0)); // Ceci est un test
}



Je précise que selector est un IMetaTriangleSelector qui fonctionne car je l'utilise pour la collision avec ma caméra fps :p
Je précise aussi que si j'utilise le vecteur3df point, j'obtiens la position exacte où le joueur regarde donc il y a vraiment un problème avec node_hit !
Donc je pense que sa vient d'autre part, mais où ...

Est-ce que quelqu'un sait comment résoudre ce problème assez embêtant ?
Merci d'avance à ceux qui répondront :3

Hors ligne


#1 

10-05-2013 23:10:39

johnplayer
Habitué
Date d'inscription: 30-09-2007
Messages: 431

vérifie que ton pointeur "node_hit" ne soit pas nul avant de l'utiliser.
Quand tu dis : "Elle marche mais seulement elle me renvoie un mesh qui n'ait pas le bon", tu veux dire que le setPosition se fait sur le mauvais node? Ou il ne se fait pas du tout?


core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."

Hors ligne


#2 

11-05-2013 08:05:13

wamilou
Membre
Date d'inscription: 10-05-2013
Messages: 15

Merci d'avoir répondu.

Le setPosition se fait sur le mauvais node, c'est sa que j'ai du mal à comprendre.
Voilà j'ai fait une screenshot :


Je donne la partie aussi où je crée le triangle de collision selector

Code c++ :

    IMetaTriangleSelector* selector = smgr->createMetaTriangleSelector();

    for(int x=0; x<10; x++) {
        for(int y=0; y<10; y++) {
            for(int z=0; z<10; z++) {
                if(x>4 || ((y==0 || y==9) || (z==0 || z==9 || (z==3 && x<=1) ))) {
                    IAnimatedMesh* mesh = smgr->getMesh("models/grass/grass.dae");
                    if (!mesh)
                    {
                        device->drop();
                        return 1;
                    }
                    IAnimatedMeshSceneNode* cube = smgr->addAnimatedMeshSceneNode( mesh );
                    cube->setMaterialTexture( 0, driver->getTexture("models/grass/grass.png") );
                    cube->setPosition( vector3df(x-5,y-5,z-5) );
                    cube->addShadowVolumeSceneNode();

                    ITriangleSelector *cube_tr = smgr->createTriangleSelector(
                        cube->getMesh(), cube);
                    selector->addTriangleSelector(cube_tr);
                }
            }
        }
    }

Dernière modification par wamilou (11-05-2013 10:43:52)

Hors ligne


#3 

11-05-2013 10:50:53

johnplayer
Habitué
Date d'inscription: 30-09-2007
Messages: 431

Tu t'y prends mal. Pour la detection prends plutot le rayon qui va vers l'avant de la camera.

Code c++ :


// segment de détection
line3df ray;
// distance maximale de détection voulue (tout objet face à toi mais trop loin ne sera pas détecté)
f32 longueur = 1000.0f;
// calcule du segment de détection
ray.start = camera->getPosition();
ray.end = normalize(camera->getTarget() - camera->getPosition())*longueur; // target-position = vecteur avant de la camera, c'est là où tu regardes
// détection de la collision
ISceneCollisionManager *collisionMgr = smgr->getCollisionManager();
vector3df outPoint;
triangle3df outTri;
ISceneNode *outNode = collisionMgr->getSceneNodeAndCollisionPointFromRay(ray, outPoint, outTri);
// si une collision a été détecté
if(outNode)
{
    outNode->setPosition(vector3df(0,100,0));
}


1/ Tu n'as plus besoin de triangleselector;
2/ Tu peux limiter la détection en distance mais aussi au niveau des nodes détectable!
Les paramètres "idBitMask" et "collisionRootNode" te servent à filtrer les nodes compatibles avec la détection.
Pour "idBitMask", ce sont des flags, regardes le tuto 7. ( node = smgr->addAnimatedMeshSceneNode(smgr->getMesh("../../media/faerie.md2"), 0, IDFlag_IsPickable | IDFlag_IsHighlightable); )
Pour "collisionRootNode", c'est là où débute ta collision. Normalement, il est à 0 donc on scrute tout les nodes enfants au RootSceneNode. Si tu mets un autre node, seul ce node et ses enfants seront soumis à la détection).

Dernière modification par johnplayer (11-05-2013 10:58:43)


core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."

Hors ligne


#4 

11-05-2013 11:09:39

wamilou
Membre
Date d'inscription: 10-05-2013
Messages: 15

Merci. Je n'ai pas la fonction normalize donc j'ai fait :

Code c++ :

ray.end = (cam->getTarget() - cam->getPosition()).normalize()*longueur;



Mais il n'y a plus aucune détection ... Je vois pas d'où sa peut venir hmm

Hors ligne


#5 

11-05-2013 17:29:37

johnplayer
Habitué
Date d'inscription: 30-09-2007
Messages: 431

désolé pour le "normalize", c'est une erreur de ma part.
Re-désolé! Pour le selector il faut le créé dans les nodes.
Si ton meta selector c'était juste pour la détection des objet tu peux le supprimer.

Code c++ :


for(int x=0; x<10; x++) {
        for(int y=0; y<10; y++) {
            for(int z=0; z<10; z++) {
                if(x>4 || ((y==0 || y==9) || (z==0 || z==9 || (z==3 && x<=1) ))) {
                    IAnimatedMesh* mesh = smgr->getMesh("models/grass/grass.dae");
                    if (!mesh)
                    {
                        device->drop();
                        return 1;
                    }
                    IAnimatedMeshSceneNode* cube = smgr->addAnimatedMeshSceneNode( mesh );
                    cube->setMaterialTexture( 0, driver->getTexture("models/grass/grass.png") );
                    cube->setPosition( vector3df(x-5,y-5,z-5) );
                    cube->addShadowVolumeSceneNode();
                    // selector du node
                    ITriangleSelector *cube_tr = smgr->createTriangleSelector(cube->getMesh(), cube);
                    // certainement pour la collision de camera? sinon à supprimer
                    selector->addTriangleSelector(cube_tr);
                    // selector pour le rayon de collision
                    cube->setTriangleSelector(cube_tr);
                    cube_tr->drop();
                }
            }
        }
    }

core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."

Hors ligne


#6 

11-05-2013 21:26:51

wamilou
Membre
Date d'inscription: 10-05-2013
Messages: 15

Effectivement, mais j'avais commenté juste cette ligne en croyant qu'elle servait à rien ^^

Sinon, merci beaucoup !

Hors ligne


#7 

12-05-2013 10:42:51

Copland
Modérateur
Lieu: ZarbiLand
Date d'inscription: 22-09-2006
Messages: 657
Site web

Hey sur ton screenshot il semblerai que tu ais plusieurs parcelles au même endroit l'une sur l'autre vu l'effet de clignotement qu'on peut visualiser.
Ton problème ne viendrait-il pas plustôt de là ?


Config : I5 2400, ATI HD6870 1Go DDR5, 4Go DDR3.
Single Boot : Windows Seven.

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
23 invités en ligne
Aucun membre connecté
RSS Feed