#0 

25-11-2007 17:01:31

tekilla
Membre
Date d'inscription: 05-07-2007
Messages: 14

Bonjours voila je travail sur un petit projet perso et j'ai choisi Irrlicht et la physique de newton mais je block a un endroit :
Les collision

enfaite pour faire une collision avec un objet pas de probleme mais quand c'est pour la camera ... le je suis sur le c*** ^^

donc je vien vous demandez de l'aide pour gerée les collision de ma camera avec newton
voice mon code :

Code:

    //Geré les touche
    SKeyMap keyMap[4] = {
        {EKA_MOVE_FORWARD,    KEY_KEY_Z},
        {EKA_MOVE_BACKWARD,    KEY_KEY_S},
        {EKA_STRAFE_LEFT,    KEY_KEY_Q},
        {EKA_STRAFE_RIGHT,    KEY_KEY_D},
    };
    // On crée la cam et on la place
    cam = smgr->addCameraSceneNodeFPS(0, 200.0f, 250.0f, -1, keyMap, 4);

et pour charger la carte :

Code:

    // add skybox
    smgr->addSkyBoxSceneNode(driver->getTexture("data/irrlicht2_up.bmp"),driver->getTexture("data/irrlicht2_dn.bmp"),driver->getTexture("data/irrlicht2_lf.bmp"),driver->getTexture("data/irrlicht2_rt.bmp"),driver->getTexture("data/irrlicht2_ft.bmp"),driver->getTexture("data/irrlicht2_bk.bmp"));

    // Load level in quake3 format
    device->getFileSystem()->addZipFileArchive("./data/chiropteraDM.pk3");
    scene::IAnimatedMesh* q3levelmesh = smgr->getMesh("maps/chiropteradm.bsp");
    scene::ISceneNode* q3node = smgr->addOctTreeSceneNode(q3levelmesh->getMesh(0));

    //LevelNewtonCollision
    NewtonCollision* nmapcollision = NewtonCreateTreeCollision(nWorld, NULL);
    NewtonTreeCollisionBeginBuild(nmapcollision);
    u32 CMeshBuffer, j;
    int v1i, v2i, v3i;
    IMeshBuffer *mb;
    float vArray[9]; // vertex array (3*3 floats)
    int tmpCount = 0;

    scene::IMesh *mesh = q3levelmesh->getMesh(0);
    for (CMeshBuffer=0; CMeshBuffer<mesh->getMeshBufferCount(); CMeshBuffer++)
    {
        mb = q3levelmesh->getMesh(0)->getMeshBuffer(CMeshBuffer);
        S3DVertex2TCoords* mb_vertices = (S3DVertex2TCoords*)mb->getVertices();
        u16* mb_indices  = mb->getIndices();
        // add each triangle from the mesh
        for (j=0; j<mb->getIndexCount(); j+=3)
        {
            v1i = mb_indices[j];
            v2i = mb_indices[j+1];
            v3i = mb_indices[j+2];
            vArray[0] = mb_vertices[v1i].Pos.X;
            vArray[1] = mb_vertices[v1i].Pos.Y;
            vArray[2] = mb_vertices[v1i].Pos.Z;
            vArray[3] = mb_vertices[v2i].Pos.X;
            vArray[4] = mb_vertices[v2i].Pos.Y;
            vArray[5] = mb_vertices[v2i].Pos.Z;
            vArray[6] = mb_vertices[v3i].Pos.X;
            vArray[7] = mb_vertices[v3i].Pos.Y;
            vArray[8] = mb_vertices[v3i].Pos.Z;
            box.addInternalPoint(mb_vertices[v1i].Pos.X, mb_vertices[v1i].Pos.Y, mb_vertices[v1i].Pos.Z);
            box.addInternalPoint(mb_vertices[v2i].Pos.X, mb_vertices[v2i].Pos.Y, mb_vertices[v2i].Pos.Z);
            box.addInternalPoint(mb_vertices[v3i].Pos.X, mb_vertices[v3i].Pos.Y, mb_vertices[v3i].Pos.Z);
            NewtonTreeCollisionAddFace(nmapcollision, 3, &vArray[0], 12, 1);
        }
    }
    NewtonTreeCollisionEndBuild(nmapcollision, 0);
    NewtonBody* nmapbody = NewtonCreateBody(nWorld, nmapcollision);
    box = q3node->getTransformedBoundingBox();
    NewtonSetWorldSize (nWorld, (float*)&(box.MinEdge.X), (float*)&(box.MaxEdge.X));
    NewtonReleaseCollision(nWorld, nmapcollision);

le code pour la map se trouve dans une fonction "Prepare()" et celui de la cam dans "Init"

Voila merci de bien vouloir aider un newbie comme moi big_smile

Hors ligne


#1 

26-11-2007 18:59:57

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

A mon avis, il te faut gérer une collision en forme d'élipse pour ta camera, perso j'utiliserai une Sphere invisible.
Du coup le déplacement de ta caméra s'effecturai directement sur la Sphere et non plus sur la cam car là c'est newton qui gerera le déplacement camera.


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

Hors ligne


#2 

26-11-2007 22:39:11

tekilla
Membre
Date d'inscription: 05-07-2007
Messages: 14

Slt

dabord merci a toi pour ta réponse c'est aussi se que j'ai penser pour faire un test j'ai dabord essayer de faire sa avec une box (enfaite je crée une box j'applique la collision etc... sauf que je détourne le boundingbox pour lui donner les coordonée de la camera) pour sa j'ai essayer de faire sa :

box->node->setPosition(vector3df(cam->getPosition));

mais sa marche pas est actuellement mon niveau ne me permet pas de résoudre se probleme ^^ esque tu pourais m'aider encore un peu stp sad ?

Hors ligne


#3 

27-11-2007 13:20:40

tekilla
Membre
Date d'inscription: 05-07-2007
Messages: 14

slt

voila c'est bon j'ai reussi en "fusionnant" la methode de map loading de irrlicht et newton afin dutiliser le triangleselctor de irrlicht puisque je pouvais pas utiliser celui de newton

voila je partage mon code pour ceux qui on le meme prob wink (PS c'est bourrin)

Code:

void CGame::Prepare()
{
    // add skybox
    smgr->addSkyBoxSceneNode(driver->getTexture("data/irrlicht2_up.bmp"),driver->getTexture("data/irrlicht2_dn.bmp"),driver->getTexture("data/irrlicht2_lf.bmp"),driver->getTexture("data/irrlicht2_rt.bmp"),driver->getTexture("data/irrlicht2_ft.bmp"),driver->getTexture("data/irrlicht2_bk.bmp"));

    // Load level in quake3 format
    device->getFileSystem()->addZipFileArchive("./data/chiropteraDM.pk3");
    scene::IAnimatedMesh* q3levelmesh = smgr->getMesh("maps/chiropteradm.bsp");
    scene::ISceneNode* q3node = smgr->addOctTreeSceneNode(q3levelmesh->getMesh(0));
    scene::ITriangleSelector* selector = 0;
    selector = smgr->createOctTreeTriangleSelector(q3levelmesh->getMesh(0), q3node, 128);
    q3node->setTriangleSelector(selector);
    selector->drop();

    //LevelNewtonCollision
    NewtonCollision* nmapcollision = NewtonCreateTreeCollision(nWorld, NULL);
    NewtonTreeCollisionBeginBuild(nmapcollision);
    u32 CMeshBuffer, j;
    int v1i, v2i, v3i;
    IMeshBuffer *mb;
    float vArray[9]; // vertex array (3*3 floats)
    int tmpCount = 0;

    scene::ICameraSceneNode* camera = 
        smgr->addCameraSceneNodeFPS(0, 100.0f, 300.0f, -1, 0, 0, true);
    camera->setPosition(core::vector3df(-100,-100,-150));

    scene::ISceneNodeAnimator* anim = smgr->createCollisionResponseAnimator(
        selector, camera, core::vector3df(30,50,30),
        core::vector3df(0,-3,0), 
        core::vector3df(0,50,0));
    camera->addAnimator(anim);
    anim->drop();

    scene::IMesh *mesh = q3levelmesh->getMesh(0);
    for (CMeshBuffer=0; CMeshBuffer<mesh->getMeshBufferCount(); CMeshBuffer++)
    {
        mb = q3levelmesh->getMesh(0)->getMeshBuffer(CMeshBuffer);
        S3DVertex2TCoords* mb_vertices = (S3DVertex2TCoords*)mb->getVertices();
        u16* mb_indices  = mb->getIndices();
        // add each triangle from the mesh
        for (j=0; j<mb->getIndexCount(); j+=3)
        {
            v1i = mb_indices[j];
            v2i = mb_indices[j+1];
            v3i = mb_indices[j+2];
            vArray[0] = mb_vertices[v1i].Pos.X;
            vArray[1] = mb_vertices[v1i].Pos.Y;
            vArray[2] = mb_vertices[v1i].Pos.Z;
            vArray[3] = mb_vertices[v2i].Pos.X;
            vArray[4] = mb_vertices[v2i].Pos.Y;
            vArray[5] = mb_vertices[v2i].Pos.Z;
            vArray[6] = mb_vertices[v3i].Pos.X;
            vArray[7] = mb_vertices[v3i].Pos.Y;
            vArray[8] = mb_vertices[v3i].Pos.Z;
            box.addInternalPoint(mb_vertices[v1i].Pos.X, mb_vertices[v1i].Pos.Y, mb_vertices[v1i].Pos.Z);
            box.addInternalPoint(mb_vertices[v2i].Pos.X, mb_vertices[v2i].Pos.Y, mb_vertices[v2i].Pos.Z);
            box.addInternalPoint(mb_vertices[v3i].Pos.X, mb_vertices[v3i].Pos.Y, mb_vertices[v3i].Pos.Z);
            NewtonTreeCollisionAddFace(nmapcollision, 3, &vArray[0], 12, 1);
        }
    }
    NewtonTreeCollisionEndBuild(nmapcollision, 0);
    NewtonBody* nmapbody = NewtonCreateBody(nWorld, nmapcollision);
    box = q3node->getTransformedBoundingBox();
    NewtonSetWorldSize (nWorld, (float*)&(box.MinEdge.X), (float*)&(box.MaxEdge.X));
    NewtonReleaseCollision(nWorld, nmapcollision);
    
    // hide cursor
    device->getCursorControl()->setVisible(false);

    MakeCube(vector3df((float)(2*100)-2, 800.0f, (float)(2*100)-2));
}

sinon maintenant le probleme c'est comment faire pour crée la collision entre la camera
et les objet qui sont gerée avec newton :s ? parsque la camera elle passe a travers mon ti cube mais mon cube réagit bien sur la carte

(au faite je suis toujours preneur pour celui qui me file un code permetant de gerée la collision de la camera uniquement avec newton ^^)

ciaooo

Hors ligne


#4 

27-11-2007 19:10:06

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

Je pense que t'a pas bien compris ce que je t'expliquais brevement plus haut.
Je me sers d'ode donc Newton je ne connais pas ses méthodes spécifique, mais pour te filer un exemple de théorie :
Tu créais une Sphere sous irrlicht un SphereSceneNode par exemple.
Tu lui appliques un Objet Newton Sphere pour que ta sphere collisionne avec tout les objets du monde.
Tu Lis la camera à ta sphere par Irrlicht avec un setParent ou addChild ou un truc comme ça je sais plus.
Ensuite pour déplacer ta camera, tu déplaces l'objet Newton (body ?) et non pas l'objet Irrlicht !
Si tu débutes, je te conseille de lire les tutos fourni avec le SDK de newton, tu finiras bien par trouver ce que tu cherches, le tout est de persévérer wink.
Bon courage !


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

Hors ligne


#5 

27-11-2007 21:19:23

tekilla
Membre
Date d'inscription: 05-07-2007
Messages: 14

ah ok c'est bon je vois en gros je crée une sphere sous irrlicht que je "surperpose"(je cest pas si le terme est juste ^^) avec un objet newton (sphere) et japplique les collision a la sphere puis je lis la cam a la sphere irrlicht qui est elle meme lié a la sphere newton smile

merci je my met de suite big_smile

Hors ligne


#6 

27-11-2007 23:23:03

tekilla
Membre
Date d'inscription: 05-07-2007
Messages: 14

resalut voila je poste la ou je me suis arreter avant daller me coucher ^^

Code:

NewtonSphere *CGame::MakeSphere(vector3df loc)
{
    NewtonSphere *tmp1 = new NewtonSphere;

    tmp1->mesh = smgr->getMesh("data/sphere.3ds");
    tmp1->node = smgr->addAnimatedMeshSceneNode(tmp1->mesh);
    tmp1->node->setMaterialFlag(video::EMF_LIGHTING, false);
    tmp1->node->setMaterialTexture(0, driver->getTexture("data/wood.jpg"));
    
    // Create a box primitive. 38 is just an estimated value of the size of the model,
    tmp1->collision = NewtonCreateBox(nWorld, 38, 100, 38, NULL);
    tmp1->body = NewtonCreateBody(nWorld, tmp1->collision);

    // Set user data pointer to the scene node
    NewtonBodySetUserData(tmp1->body, tmp1->node);

    // Set body mass & inertia matrix
    NewtonBodySetMassMatrix (tmp1->body, 10.0f, 150.0f, 150.0f, 150.0f);

    // Set the freeze threshhold to 1 unit (default is 0.01 but irrlight uses a large unit scale)
    NewtonBodySetFreezeTreshold(tmp1->body, 1.0, 1.0, 1.0); 

    // Set callback functions for the body
    NewtonBodySetTransformCallback(tmp1->body, SetMeshTransformEvent);
    NewtonBodySetForceAndTorqueCallback(tmp1->body, ApplyForceAndTorqueEvent);

    // Set the position of the body
    matrix4 mat;
    mat.setTranslation(loc);
    NewtonBodySetMatrix(tmp1->body, &mat.M[0]);
    
    if (currentCube == 512)
    {
        printf("* Too many cubes!");
        return NULL;
    }

    Sphere[currentSphere] = tmp1;
    currentSphere ++;

    return tmp1;
}

je reprend demain et je des que je trouve je poste le tout ici smile

bonne nuit XD

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