#0 

04-10-2009 12:07:16

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

Bonjour tout le monde,
Voilà mon problème, je me suis aperçu que le système de collision d'Irrlicht me réduit grandement mes fps (340fps quand il n'est pas activé et 37 quand il y est). Ceci est extrèmement dérangeant! Je voudrais donc savoir si quelqu'un sait comment je pourrais en faire un moi-même qui ne soit pas aussi gourmand.
Il me faut gérer la gravité, les pentes (glissades), les montées d'escaliers. les sauts.

Le mieux serait que ce système soit dans un thread que je puisse suspendre et relancer selon les besoins.

Dernière modification par johnplayer (04-10-2009 12:25:55)


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


#1 

04-10-2009 16:37:26

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

Perso, je passes par Newton (2.xx quite à faire).

C'est donc pas du 'perso' (toujours difficile à écrire et encore plus à optimiser) , mais une lib externe, et cela a le mérite d'être efficace, complet et rapide dans le code.
L'un des gros avantage de Newton justement, c'est qu'il sait gérer que les collisions si l'on veut.
En prime, avec quelques fonctions supplémentaire on a de suite de la physique, ce qui est très pratique.
Enfin, il se présente sous la forme d'une lib statique, donc c'est sans douleur et sans lourdeur wink


Force et sagesse...

Hors ligne


#2 

05-10-2009 12:46:21

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

Merci mais j'ai déjà essayé de l'utiliser mais je n'y suis pas arrivé faute d'exemples et de tutos. Sinon il est vrai que c'était la solution que j'avais envisagé au départ. Par contre, si tu as des tutos je serais très intéressé et je réessaierais de l'utilisé.


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 

05-10-2009 21:10:24

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

Par exemple j'ai tout le code de N3xtD, avec une partie collision faite par Newton 2.xx. Je peux isoler le truc si tu veux, et dans les jours à venir faire un petit truc explicatif si cela
te tente wink


Force et sagesse...

Hors ligne


#4 

05-10-2009 22:02:40

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

Oui ce serait sympa car je rame carrément. Merci pour ton aide car au vu des perf je ne peux pas me permettre d'utiliser les collisions d'irrlicht.


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 

05-10-2009 22:35:58

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

J'essaie de te faire un truc dès demain, je travaille très très tard en ce moment, donc je ne le te mettrais en ligne que probablement mercredi dans la matinée, mais pas de soucis, je vais pondre un truc le plus simple et clair possible.


Force et sagesse...

Hors ligne


#6 

06-10-2009 11:01:11

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

J'avais newton 1.53 avec un tuto, j'ai donc réessayé (il faut mettre de la bonne volonté) et finalement j'ai un début. J'ai initialisé et créé l'update et mon arme(qui est censé jeter des bombes sous formes de boule le fait merveilleusement bien avec les collisions. Maintenant, le problème est que mon world est actuellement en 1 seul mesh mais par la suite il sera divisé en plusieurs mesh.

Code c++ :

// configuration des collisions de la map
    bibliotheque.g_newtonmap = NewtonCreateTreeCollision(bibliotheque.nWorld, NULL);
    NewtonTreeCollisionBeginBuild(bibliotheque.g_newtonmap);
    u32 CMeshBuffer, j;
    int v1i, v2i, v3i;
    IMeshBuffer *mb;

    float vArray[9]; // vertex array (3*3 floats)

    int tmpCount = 0;

    for (CMeshBuffer=0; CMeshBuffer < bibliotheque.node_terrain[0]->getMesh()->getMeshBufferCount(); CMeshBuffer++)
    {   
        mb = bibliotheque.node_terrain[0]->getMesh()->getMeshBuffer(CMeshBuffer);

        video::S3DVertex* mb_vertices = (irr::video::S3DVertex*)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;

            NewtonTreeCollisionAddFace(bibliotheque.g_newtonmap, 3, (float*)vArray, 12, 1);
        }

    }
    NewtonTreeCollisionEndBuild(bibliotheque.g_newtonmap, 0);
    bibliotheque.g_newtonmapbody = NewtonCreateBody(bibliotheque.nWorld, bibliotheque.g_newtonmap);


Je me suis demandé si je pouvais charger, via une petite retouche, tous les triangles de tout les meshs les uns à la suite des autres.


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 

06-10-2009 11:10:46

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

Bon, je vois que tu as pas mal avancé quand même finalement wink

Je me suis demandé si je pouvais charger, via une petite retouche, tous les triangles de tout les meshs les uns à la suite des autres.


C'est au choix. Tu peux faire digéré à Newton un seul arbre de collision pour ce qui est de ton monde, ou alors créer plusieurs
arbres en fonction des mesh qui définissent ton monde. Perso en terme de performance, je ne serais te dire ce qui est le mieux.
Si ton monde n'évolue pas, alors pourquoi pas créer effectivement un seul arbre et lui balancer tous les polygones de tes mesh.

Newton semble bien supporter un nombre de polygones important. Quand je lui envoi un terrain complet, soit environ 200.000 polygones, cela se passe bien.

Sinon, petit conseil en passant, passe plutôt par Newton v2.xx, qui est bien mieux optimisé et donc beaucoup plus rapide. En plus, dans la majorité des cas, tu n'a même pas à changer ton code par rapport à la version 1.53 car il sont compatible à 90% wink


Force et sagesse...

Hors ligne


#8 

06-10-2009 11:22:35

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

Ok je vais voir pour la version 2.xx. Pour les arbres, n'y a-t-il pas moyens de les mettre et de les retirer suivant les besoins, comme mon terrain je vais rendre certaines parties visibles et cacher les autres pour gagner en perf donc les meshs du terrain non visibles ne doivent pas etre pris en compte dans les collisions afin d'optimiser le code. De plus, comment faire pour les collisions de la camera?
Et merci encore pour tes réponses.


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


#9 

06-10-2009 11:34:01

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

En fait, la gestion des collisions t'incombant, cela sera à toi de faire ce qu'il faut pour éliminer de l'arbre de test les éléments non visible ou non souhaités.

Après, si tu glisse ver la partie physique, il y a l'instruction NewtonWorldFreezeBody() qui permet de rendre actif ou non un body dans la gestion de la physique, et donc de soulager le moteur.

Pour ce qui est de la camera, il te suffit de lui assigner un volume anglobant (comme une capsule par exemple) et de la définir à travers Newton, ce qui est bien plus facile que pour un mesh static concave.... (NewtonCreateSphere() ou encore NewtonCreateChamferCylinder() etc...)


Force et sagesse...

Hors ligne


#10 

07-10-2009 19:43:00

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

Ok merci pour les précisions. Je vais essayer ça dès que possible.


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


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
883 membres
1429 sujets
11121 messages
Dernier membre inscrit: Saidov17
82 invités en ligne
Aucun membre connecté
RSS Feed