#1 

10-05-2013 19:08:39

wamilou
Membres
Date d'inscription:
Messages: 15
IP: 88.188.82.111
Courriel

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


#2 

10-05-2013 21:10:39

johnplayer
Membres
Avatar de johnplayer
Date d'inscription:
Messages: 431
IP: 83.192.85.95
Courriel

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


#3 

11-05-2013 06:05:13

wamilou
Membres
Date d'inscription:
Messages: 15
IP: 88.188.82.111
Courriel

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


Hors ligne


#4 

11-05-2013 08:50:53

johnplayer
Membres
Avatar de johnplayer
Date d'inscription:
Messages: 431
IP: 83.192.85.95
Courriel

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).


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


#5 

11-05-2013 09:09:39

wamilou
Membres
Date d'inscription:
Messages: 15
IP: 88.188.82.111
Courriel

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


#6 

11-05-2013 15:29:37

johnplayer
Membres
Avatar de johnplayer
Date d'inscription:
Messages: 431
IP: 83.192.85.95
Courriel

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


#7 

11-05-2013 19:26:51

wamilou
Membres
Date d'inscription:
Messages: 15
IP: 88.188.82.111
Courriel

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

Sinon, merci beaucoup !


Hors ligne


#8 

12-05-2013 08:42:51

Copland
Modérateurs
Date d'inscription:
Messages: 657
IP: 109.223.36.58
Courriel  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é
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
177 invités en ligne
membre en ligne: -
RSS Feed