#0 

06-04-2011 18:40:53

ment0s-
Petit nouveau
Date d'inscription: 06-04-2011
Messages: 8

Bonjour à tous, 
Etant nouveau dans le monde de la 3D, je suis actuellement un tutoriel sur le siteduzéro.
Actuellement, je suis en train d'essayer de gérer les collisions directement avec irrlicht, sans utiliser de moteur physique (tel que newton, ou bullet).
Je ne sais pas comment expliquer mon problème mais je vais tout de même essayé :
Lorsque j'utilise la fonction createCollisionResponseAnimator(), je met la gravité à -1 pour pas me "balader dans l'espace". Or, le problème qui se pose est que quand je la met à cette valeur, ma caméra recule sans cesse. Lorsque je met cette valeur à 0, la collision entre les murs et la caméra est détecter, mais je ne suis pas on va dire, "cloué au sol".

Voici le code source de mon fichier main.cpp :

Code c++ :


#include <irrlicht.h>
#include <iostream>

using namespace std;
using namespace irr;

int main()
{
    IrrlichtDevice *device = createDevice(video::EDT_OPENGL, core::dimension2d<u32>(640,480), 32);   // 32, true pour le plein ecran
    video::IVideoDriver *driver = device -> getVideoDriver();
    scene::ISceneManager *sceneManager = device -> getSceneManager();
    device -> getCursorControl() -> setVisible(false);
    // La salle :
    scene::IAnimatedMesh *room = sceneManager -> getMesh("room.3ds");
    scene::ImeshSceneNode *Nroom = sceneManager -> addMeshSceneNode(room -> getMesh(0));
    // Desactiver la lumiere :
    Nroom -> setMaterialFlag(video::EMF_LIGHTING,false);
    //  Nombre de repetition de la texture :
    sceneManager -> getMeshManipulator() -> makePlanarTextureMapping(room -> getMesh(0), 0.004f);
    // Choix de la texture :
    Nroom -> setMaterialTexture(0, driver -> getTexture("carrelage.jpg"));
    // Creations de triangles pour la collision :
    scene::ITriangleSelector *selector = 0;
    if (Nroom)
    {
        selector = sceneManager->createOctTreeTriangleSelector(room->getMesh(0), Nroom);
        Nroom->setTriangleSelector(selector);
        selector->drop();
    }
    // Caméra :
    SKeyMap keyMap[5];
    keyMap[0].Action = EKA_MOVE_FORWARD;
    keyMap[0].KeyCode = KEY_KEY_Z;
    keyMap[1].Action = EKA_MOVE_BACKWARD;
    keyMap[1].KeyCode = KEY_KEY_S;
    keyMap[2].Action = EKA_STRAFE_LEFT;
    keyMap[2].KeyCode = KEY_KEY_Q;
    keyMap[3].Action = EKA_STRAFE_RIGHT;
    keyMap[3].KeyCode = KEY_KEY_D;
    // Camera type FPS :
    scene::ICameraSceneNode *camera = sceneManager -> addCameraSceneNodeFPS(0, 100.0f, 0.3f, -1, keyMap, 5);
    video::SColor color(0,255,255,255);
    // Camera devant la map :
    camera->setTarget(Nroom->getPosition());

    // Detection de la collision sous irrlicht :
    scene::ISceneNodeAnimator *anim = sceneManager->createCollisionResponseAnimator(selector, camera, core::vector3df(1,1,1), core::vector3df(0,0,0), core::vector3df(0,4,0));
    camera->addAnimator(anim);
    anim->drop();
    // Boucle de rendu :
    while(device -> run())
    {
        driver -> beginScene(true, true, color);
        sceneManager -> drawAll();
        driver->endScene();
    }
    device -> drop();
    return 0;
}



Voila, je ne sais pas comment faire exactement, et si vous avez compris mon problème.
Bonne soirée à tous wink

Hors ligne


#1 

06-04-2011 19:38:16

mmorpglefilm
Abonné
Lieu: la galaxie UDFy-38135539
Date d'inscription: 18-05-2010
Messages: 162
Site web

Je croie que le problème viens du fait que tu tente d'utiliser un variable qui à était "droper" (détruite je croie).
Il faudrait placer la ligne selector->drop(); juste avent la boucle de rendue.

Hors ligne


#2 

07-04-2011 08:23:19

Hawk
Membre
Lieu: Wissous
Date d'inscription: 08-11-2008
Messages: 91
Site web

Non, je pense pas que le drop est un rapport quelconque avec le problème. Le drop est là pour diminuer la valeur du compteur de référence de l'objet, et éventuellement le détruire si ce compteur atteint 0. Sans le drop, tout ce qu'il risque, c'est une fuite mémoire, pas un bug.

Je pense pour plusieurs idées dans ton cas :
- Si la caméra recule, ça semble vouloir dire que ta gravité n'est pas dirigée vers le bas, mais dans une autre direction. C'est un peu bizarre. Ou alors c'est que tu es sur un terrain en pente, et donc la gravité t'emmène vers le bas de la pente, donc te fait reculer. Peut être en diminuant ton facteur -1 (par exemple à -0.1)
- Si la caméra descend, là je pense que ça peut être réglé en donnant une bonne enveloppe à ta caméra. Quand tu fais ton createCollisionResponseAnimator, le 3ème et le 5ème paramètres vont servir à définir l'enveloppe physique de la caméra. Le 3ème définit les rayons d'un ellipsoide autour de ta caméra (qui est donc au centre). En gros, ça revient à dire que tu définis la taille de ton personnage pour savoir quand est-ce qu'il va se cogner. Dans ton code, tu as défini un personnage qui fait 1 de rayon dans chacune des directions. (une boule en fait).  Le 5ème argument sert à placer ta caméra par rapport au centre de cet ellipsoide. Si tu le laisse à {0,0,0}, ta caméra sera au centre du personnage, ce qui correspond au ventre. En général, on veut le mettre un peu plus haut, donc plutot au niveau des yeux. Donc on va mettre une valeur du genre {0,1,0}.
Je pense que dans ton cas, le problème est surtout la définition des rayons de ton ellipsoide.

Hors ligne


#3 

07-04-2011 19:08:59

ment0s-
Petit nouveau
Date d'inscription: 06-04-2011
Messages: 8

J'ai essayé ce que tu m'as dis de faire mmorpglefilm. ça fonctionne correctement maintenant ma caméra ne traverse plus du tout la scene, et aucun recule. La gravité est bonne. Merci de votre aide en tout cas ! (Je reviendrai sans doute dans pas longtemps pour d'autre problèmes lol)

Bonne soirée wink

Hors ligne


#4 

08-04-2011 08:26:04

Hawk
Membre
Lieu: Wissous
Date d'inscription: 08-11-2008
Messages: 91
Site web

Au temps pour moi, j'avais pas vu en effet que tu avais fait un drop du selector avant le createCollisionResponseAnimator(), effectivement, mmorpglefilm avait raison.

Hors ligne


#5 

08-04-2011 13:52:49

mmorpglefilm
Abonné
Lieu: la galaxie UDFy-38135539
Date d'inscription: 18-05-2010
Messages: 162
Site web

"Je reviendrai sans doute dans pas longtemps pour d'autre problèmes lol"

Souvenir souvenir. smile

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
882 membres
1429 sujets
11119 messages
Dernier membre inscrit: LiseBuisson96
14 invités en ligne
Aucun membre connecté
RSS Feed