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
10-05-2013 21:10:39
- johnplayer
- Membres

- 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
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
11-05-2013 08:50:53
- johnplayer
- Membres

- 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
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
Hors ligne
11-05-2013 15:29:37
- johnplayer
- Membres

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



