#25 

30-03-2009 00:51:48

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
Site web

sa aurais besoin d'être un peut optimisé quand même smile
environs 1min pour faire le trimesh .... ( qui plus est marche pas  *-* )

Hors ligne


#26 

30-03-2009 07:13:11

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

Bizarre, avec Newton je n'ai jamais eu ce soucis.

Tu pourrais poster juste la routine de récupération pour voir ou pourrais être les différences ...


Force et sagesse...

Hors ligne


#27 

30-03-2009 17:39:03

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
Site web

voila :

creation de la physique :

Code:

    TerrainPhysique::TerrainPhysique(Physique*World,GameEngine::TerrainEngine::CTerrainNode*geom)
    {
        user = NULL;    Node = geom;    phy = World;
        btTransform Transform;
            Transform.setIdentity();
            Transform.setOrigin(btVector3(0,0,0));
        btDefaultMotionState *MotionState = new btDefaultMotionState(Transform);
        formCollide = new CollisionForm(phy->getDevice());
            formCollide->makeTerrain(geom);
        node = new btRigidBody(0.0f,MotionState,formCollide->getShape(),formCollide->getLocalInertia());
            node->setUserPointer((void*)(this));
        //setType(OTP_STATIC);// plante
        phy->getWorldPhysic()->addRigidBody(node);
        //setPosition(irr::core::vector3df(0,0,0));// plante aussi : |
        Kst = NULL;
    }

make terrain :

Code:

    void CollisionForm::makeTerrain(GameEngine::TerrainEngine::CTerrainNode*terrain)
    {
        btTriangleMesh *CollisionMesh = new btTriangleMesh();
        int j = 0;
        for(int i=0; i<terrain->numQuad; i++)
            meshBufferToPhysic(terrain->GetQuadNode(i)->mbuffer,CollisionMesh,terrain->getScale());
        Shape = new btBvhTriangleMeshShape(CollisionMesh, true);
        setOrigine(0.0f,terrain->getBoundingBox().getCenter());
    }

trimesh :

Code:

    void CollisionForm::meshBufferToPhysic(irr::scene::IMeshBuffer *TMeshBuffer, btTriangleMesh *TCollisionMesh, const irr::core::vector3df &TScale)
    {
        btVector3 TriangleVertices[3];
        irr::u16 *Indices = TMeshBuffer->getIndices();
        if(TMeshBuffer->getVertexType() == irr::video::EVT_STANDARD)
        {
            irr::video::S3DVertex *Vertices = (irr::video::S3DVertex*)TMeshBuffer->getVertices();
            for(irr::u32 i = 0; i < TMeshBuffer->getIndexCount(); i += 3)
            {
                TriangleVertices[0] = btVector3(Vertices[Indices[i]].Pos.X * TScale.X,Vertices[Indices[i]].Pos.Y * TScale.Y,Vertices[Indices[i]].Pos.Z * TScale.Z);
                TriangleVertices[1] = btVector3(Vertices[Indices[i+1]].Pos.X * TScale.X,Vertices[Indices[i+1]].Pos.Y * TScale.Y,Vertices[Indices[i+1]].Pos.Z * TScale.Z);
                TriangleVertices[2] = btVector3(Vertices[Indices[i+2]].Pos.X * TScale.X,Vertices[Indices[i+2]].Pos.Y * TScale.Y,Vertices[Indices[i+2]].Pos.Z * TScale.Z);
                TCollisionMesh->addTriangle(TriangleVertices[0], TriangleVertices[1], TriangleVertices[2],true);
            }
        }
        else
        {
            irr::video::S3DVertex2TCoords *Vertices = (irr::video::S3DVertex2TCoords*)TMeshBuffer->getVertices();
            for(irr::u32 i = 0; i < TMeshBuffer->getIndexCount(); i += 3)
            {
                TriangleVertices[0] = btVector3(Vertices[Indices[i]].Pos.X * TScale.X,Vertices[Indices[i]].Pos.Y * TScale.Y,Vertices[Indices[i]].Pos.Z * TScale.Z);
                TriangleVertices[1] = btVector3(Vertices[Indices[i+1]].Pos.X * TScale.X,Vertices[Indices[i+1]].Pos.Y * TScale.Y,Vertices[Indices[i+1]].Pos.Z * TScale.Z);
                TriangleVertices[2] = btVector3(Vertices[Indices[i+2]].Pos.X * TScale.X,Vertices[Indices[i+2]].Pos.Y * TScale.Y,Vertices[Indices[i+2]].Pos.Z * TScale.Z);
                TCollisionMesh->addTriangle(TriangleVertices[0], TriangleVertices[1], TriangleVertices[2],true);
            }
        }
    }

Hors ligne


#28 

30-03-2009 22:35:33

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

J'ausculte cela demain, et en rentrant je te donnerais mon sentiment wink


Force et sagesse...

Hors ligne


#29 

30-03-2009 23:17:55

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
Site web

Hors ligne


#30 

31-03-2009 18:48:58

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

Bon je viens un peu de regarder ton code (désolé pour le retard, journée longue et difficile).
Apparement, tout semble plutôt bien ficelé.

Je sais que suivant le taille du terrain, on arrive très vite à un nombre non négligeable de
triangle, mais finalement pas plus qu'avec un terrain généré par le moteur de terrain natif
d'Irrlicht.
Donc pourquoi cette lenteur ?

As-tu essayer en terme de vitesse le même code, mais en mettant de coté les lignes

Code:

                TCollisionMesh->addTriangle(TriangleVertices[0], TriangleVertices[1], TriangleVertices[2],true);

Comment mémorise les ploygones ta classe 'btTriangleMesh' ?


Force et sagesse...

Hors ligne


#31 

31-03-2009 19:27:53

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
Site web

les triangles sont stocké dans un array propre au moteur physique, pour la lenteur, je viens d'essayer en m'étant false en dernier paramètre ... ses déjà mieux ... ( 2 à 3 sec )
le paramètre est sencé être pour enlevé les vertices en double

seul problème avec se que tu dit ses que si j'enlève 'addTriangle' je n'est plus de géométrie coté physique ...
mise a par ça les collision avec le terrain non toujours pas lieux, et les fonctions de base pour intérragir avec un cette objet plante ... pointeur invalid je suppose mais ou ? tout marche convenablement avec les objets 'normaux'

[edit] : qui plus est la géométrie récupéré semble ok, vue que les objets disparaisse pile a la rencontre du terrain ... a moins que le problème des polygones 'retournés' ? mais dans se cas il y aurais collision par en dessous ... mais  non plus hmm

Dernière modification par Magun (31-03-2009 19:50:52)

Hors ligne


#32 

31-03-2009 20:21:59

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

C'est en effet très bizarre. As-tu testé la même chose, mais sur un terrain définit beuaoucps plus 'light', genre 4 Quads contenant chacun pas plus de
128 faces par exemple ?
Car, par rapport à d'autre objet, le terrain n'est rien d'autre qu'un maillage constitué de triangle... neutral


Force et sagesse...

Hors ligne


#33 

31-03-2009 23:04:28

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
Site web

j'utilise 16 quads contenant 16 face ... raisonnable donc ...
qui plus est cela est encore plus dur si gdb  enlève les problèmes et supprime carrément les collisions du terrain ... donc intraçable hmm
je vais demander à se bon vieux Copland aussi big_smile

Hors ligne


#34 

01-04-2009 21:03:45

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

Magun :

j'utilise 16 quads contenant 16 face ... raisonnable donc ...


si tu entends par là que tu as fait un terrain->setValue(16,16,...) cela fait un terrain avec 131072 faces.

si effectivement tu as 16 quad de 16 faces, alors cela fait 256 faces, bien qu'en théorie ce n'est pas possible,
car même si tu écris 'terrain->SetValue(4,4,...) , cela fait 16 quad de 32 faces, donc 512 faces, ce qui est tout aussi léger.

wink


Force et sagesse...

Hors ligne


#35 

02-04-2009 21:14:13

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
Site web

j'ai un total de 131304 polygone smile
mais ma physique marche toujours pas hmm

Dernière modification par Magun (02-04-2009 21:14:33)

Hors ligne


#36 

02-04-2009 21:37:50

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

Si j'ai bien suivi, par  contre, d'après ce que tu disais, si tu importe un mesh en forme de terrain, et que tu l'intègre à ta physique,
là ça marche, ?


Force et sagesse...

Hors ligne


#37 

02-04-2009 22:57:42

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
Site web

normalement oui, j'ai déjà essayé mon trimesh il marche ( mise a par qu'il n'y a pas de collision trimesh vs trimesh )
ah mon avis j'ai oublier une ligne quelque par mais je voie pas où ...
ou alors bullet veut que tout les polygones soient relier ? dans se cas il me faudrait modifier un peut le terrain pour mettre 2 polygone qui relie les extrémités neutral
sa me parait bizarre ...

je peut aussi faire un soft body de type "tissu" solide et je déforme suivant la hauteur du terrain hmm
boff quand même ...

il y a aussi une class spécial terrain dans bullet mais je voie pas trop comment l'utiliser ...
"btHeightfieldTerrainShape (int heightStickWidth, int heightStickHeight, void *heightfieldData, btScalar maxHeight, int upAxis, bool useFloatData, bool flipQuadEdges)"
http://www.continuousphysics.com/Bullet … Shape.html

Dernière modification par Magun (03-04-2009 02:04:05)

Hors ligne


#38 

05-04-2009 17:07:15

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
Site web

Encore moi big_smile
je t'embête uhn ? smile

y a un petit soucis, avec le frustum culling, si on utilise 2 terrain neutral


en plus y a un gros soucis sur mon code, la physique ne marche que sur le deuxième terrain ...., ou alors il y a le problème, que je te parlais présédament, avec un seul ...

Dernière modification par Magun (05-04-2009 17:09:42)

Hors ligne


#39 

05-04-2009 17:40:31

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

Je pense que c'est du au fait qu'à l'origine je n'ai pas vraiment prévu les déplacement de terrain, ce qui doit poser des
soucis sur les bonne position des box des quad.
Je vais bientôt revenir dessus, d'ici au début de la semaine en 8 normalement, car je vais intégrer ce moteur de terrain
dans mon projet, et donc va falloir que je corrige tous ces bug .


Force et sagesse...

Hors ligne


#40 

25-04-2009 10:21:30

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

J'ai essayé d'utiliser le moteur de terrain mais j'obtiens des erreurs :

Code:

1>Jeu.obj : error LNK2019: symbole externe non résolu "public: void __thiscall CTerrainNode::setMaterialType(enum irr::video::E_MATERIAL_TYPE)" (?setMaterialType@CTerrainNode@@QAEXW4E_MATERIAL_TYPE@video@irr@@@Z) référencé dans la fonction _main
1>Jeu.obj : error LNK2019: symbole externe non résolu "public: void __thiscall CTerrainNode::setMaterialTexture(unsigned int,class irr::video::ITexture *)" (?setMaterialTexture@CTerrainNode@@QAEXIPAVITexture@video@irr@@@Z) référencé dans la fonction _main
1>Jeu.obj : error LNK2019: symbole externe non résolu "public: void __thiscall CTerrainNode::Construct(char *,float)" (?Construct@CTerrainNode@@QAEXPADM@Z) référencé dans la fonction _main
1>Jeu.obj : error LNK2019: symbole externe non résolu "public: void __thiscall CTerrainNode::SetValues(int,int,int)" (?SetValues@CTerrainNode@@QAEXHHH@Z) référencé dans la fonction _main
1>Jeu.obj : error LNK2019: symbole externe non résolu "public: __thiscall CTerrainNode::CTerrainNode(class irr::scene::ISceneNode *,class irr::scene::ISceneManager *,int)" (??0CTerrainNode@@QAE@PAVISceneNode@scene@irr@@PAVISceneManager@23@H@Z) référencé dans la fonction _main
1>d:\Visual Studio 2008\Projects\Dreams and Fantasy\Dreams and Fantasy\\Dreams and Fantasy.exe : fatal error LNK1120: 5 externes non résolus

Si une âme charitable pouvait m'éclairer. Merci d'avance.


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


#41 

25-04-2009 10:39:22

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

C'est bon, j'ai résolu le probleme.


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


#42 

25-11-2009 05:20:24

christianclavet
Membre
Lieu: Montreal, Canada
Date d'inscription: 25-11-2009
Messages: 10
Site web

Je viens de tester... Ça fonctionne vraiment bien, l'exemple 4 me donne un 1800 FPS!!! Vraiment impressionnant!


Projet:
The First King
http://first-king.sourceforge.net

Hors ligne


#43 

09-12-2009 01:01:36

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
Site web

ey TMyke wink
je code un éditeur de scene vite fait intergant un éditeur de terrain, j'ai un peut la flemme de coder une petit fonction pour enregistré le "nouveaux terrain" en format height map dans une IImage*
je me demandais si tu n'avais pas sa dans tes code ? smile

ps : l'editeur utilise mon scene manager que je vais bientot faire par ainssi que sont éditeur avec donc voila si je pouvais gagné un peut de temps ? wink

Hors ligne


#44 

13-12-2009 10:35:17

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

@christianclavet: cela faisait un moment que l'on ne m'avais pas parlé de mon petit terrain engine wink

@Magun:  Je vais voir cela , je te tiens au courant...


Force et sagesse...

Hors ligne


#45 

13-12-2009 22:23:28

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
Site web

merci d'avance smile

Hors ligne


#46 

14-12-2009 19:08:11

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

P'tite question: en fait, tu modife le terrain dynamiquement, et tu souhaiterais faire une sauvegarde ? Si ce n'est pas une image, est-ce grave pour toi ?


Force et sagesse...

Hors ligne


#47 

15-12-2009 15:11:29

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
Site web

oui je le modifie dynamiquement, et bien pour l'image oui cela l'est plutôt étant donner que je le charge après je me base sur un système de sérialisation pour les scènes et donc plus pratique en format image wink

edit : oui sauvegarde smile

Dernière modification par Magun (15-12-2009 15:12:04)

Hors ligne


#48 

15-12-2009 20:26:06

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

µOK, je vais étudier cela wink


Force et sagesse...

Hors ligne


#49 

14-04-2010 18:19:21

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
Site web

j'ai modifier pas mal le moteur et puis je me suis dit que quelque nouveaux serait intéresser par ma dernier modif :] qui cherche toujours a faire se genre de petit chose :

dans la gestion des quads.h:

Code c++ :


   irr::s32 debug_data; // ajouter la variable


dans la gestion des quads.cpp:

Code c++ :


               // dans le constructeur rajouter
                     debug_data = 0;
                void CQuadNode::setDebugDataVisible(irr::s32 stat)
                {
                    debug_data = stat;
                }
                void CQuadNode::RenderQuad(irr::scene::ISceneManager* mgr , unsigned short FrustumCode)
                {
                  if( m_pParent == NULL ) FrustumCode = 1; //FRUSTUM_INTERSECT;
                  else
                  {
                    if( FrustumCode ) //FRUSTUM_ALLIN
                    {
                        FrustumCode = m_pQuadTerrain->_isVisible(Box);
                        if( !FrustumCode  && m_pParent ) return;
                    }
                  }

                  if( m_pChildren[0] != NULL )
                  {
                      // pas nécessaire et crée un "bug" si l'on puis dire car les quads sont rendue plusieurs fois et se superpose sur le rendue ( visible en EMT_TRANSPARENT_ADD_COLOR )
                      //if( m_pChildren[0] ) m_pChildren[0]->RenderQuad(mgr, FrustumCode );
                      //if( m_pChildren[1] ) m_pChildren[1]->RenderQuad(mgr, FrustumCode );
                      //if( m_pChildren[2] ) m_pChildren[2]->RenderQuad(mgr, FrustumCode );
                      //if( m_pChildren[3] ) m_pChildren[3]->RenderQuad(mgr, FrustumCode );
                  }
                  else
                  {
                        ++m_pQuadTerrain->nQuad;
                        irr::video::SMaterial mat;
                            mat.Lighting = false;

                        irr::video::IVideoDriver* driver = mgr->getVideoDriver();
                        if(debug_data & scene::EDS_NORMALS)
                        {
                            core::vector3df normalizedNormal;
                            const f32 DebugNormalLength = 20.f;
                            const video::SColor DebugNormalColor(255,255,140,0);

                            const scene::IMeshBuffer* mb = mbuffer;
                            const u32 vSize = video::getVertexPitchFromType(mb->getVertexType());
                            const video::S3DVertex* v = ( const video::S3DVertex*)mb->getVertices();
                            const bool normalize = mb->getMaterial().NormalizeNormals;

                            driver->setMaterial(mat);
                            for (u32 i=0; i != mb->getVertexCount(); ++i)
                            {
                                normalizedNormal = v->Normal;
                                if (normalize) normalizedNormal.normalize();
                                driver->draw3DLine(v->Pos, v->Pos + (normalizedNormal * DebugNormalLength), DebugNormalColor);
                                v = (const video::S3DVertex*) ( (u8*) v+vSize );
                            }
                        }
                        if(Debug || debug_data & scene::EDS_BBOX_BUFFERS)
                        {
                            mat.FogEnable = false;
                            driver->setMaterial(mat);
                            driver->draw3DBox(Box, video::SColor(255,0,255,0));
                        }
                        if(debug_data & scene::EDS_MESH_WIRE_OVERLAY)
                        {
                            mat.Wireframe = true;
                            driver->setMaterial(mat);
                            driver->drawIndexedTriangleList(&mbuffer->Vertices[0],mbuffer->getVertexCount(),&mbuffer->Indices[0],mbuffer->getIndexCount()/3 );
                        }
                        mat = Material;
                        if(debug_data & scene::EDS_HALF_TRANSPARENCY) mat.MaterialType = video::EMT_TRANSPARENT_ADD_COLOR;
                        driver->setMaterial(mat);
                        driver->drawIndexedTriangleList(&mbuffer->Vertices[0],mbuffer->getVertexCount(),&mbuffer->Indices[0],mbuffer->getIndexCount()/3 );
                  }
                }

et dans CTerrainNode.cpp

Code c++ :


                void CTerrainNode::setDebugDataVisible(s32 dbg)
                {
                    DebugDataVisible = dbg;
                    for(unsigned short j=0 ; j<max_grille; ++j)
                        grille[j]->setDebugDataVisible(dbg);
                }


CTerrainNode.h

Code c++ :


     virtual void setDebugDataVisible(s32);



par contre je n'est toujours pas trouver d'où venais le problème avec les lights ... vraiment moche le rendue =S
un petit rendue de mon éditeur, par ce que c'est petit nouveaux vont pas trouver à quoi correspond se code wink

bon j'avoue tout les debug_mode ensemble sa fait un peut moche mais bon ses pour montré ...
ps: éviter de mettre la vision des normals sa pompe .... ... beacoup !

Dernière modification par Magun (14-04-2010 18:27:09)

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