#0 

12-06-2013 19:46:35

Kaze
Membre
Date d'inscription: 12-03-2011
Messages: 60

Bonjour,

Pour ceux qui ne le savent pas, je cherche à créer une ville en créant une centaine d'immeubles. Je cherche maintenant à créer un maillage de cette ville pour pouvoir utiliser la physique (j'utilise Newton). J'ai réussi à créer un maillage avec des boites paramétrées de telle manière qu'elles correspondent à mes immeubles mais comme j'ai un rebord sur le toit, il n'était pas pris en compte. Je cherche donc à créer un maillage par vertices pour coller le plus possible à mon idée d'immeuble. Je vais montrer mon code et essayer d'être plus clair :

Création des immeubles : le nombre d'étage en aléatoire mais la surface est constante.

Code c++ :

std::vector<irr::scene::Building> Ville;
    irr::scene::Building *immeuble;
    for(int i=0;i<10;i++){
        for(int j=0;j<10;j++){
           
            int k = rand()%(60-20)+20;
            int type = rand()%(6-1)+1;
                   
            immeuble = new irr::scene::Building(sceneManager->getRootSceneNode(),
                                    sceneManager,
                                    0,
                                    irr::core::vector3df(50*i,0,50*j),// position
                                    irr::core::vector3df(type,0,0),// type d'immeuble
                                    irr::core::vector3df(20,k,20));// nbr d'étage (x,y,z)
           
            Ville.push_back(*immeuble);
            immeuble->drop();
        }
    }



Ensuite j'ai crée deux méthodes, la première (dans la classe irr::scene::Building) qui permet de récupérer les 16 vertices utiles à modeler parfaitement mon immeuble :

Code c++ :

irr::f32 *irr::scene::Building::getVerticesBox() const {
    irr::f32 *array = new irr::f32[48];
   
    // Socle de base
    array[0] = m_position.X-profondeur; array[1] = 0; array[2] = m_position.Z-largeur;
    array[3] = m_position.X-profondeur; array[4] = 0; array[5] = m_position.Z+largeur;
    array[6] = m_position.X+profondeur; array[7] = 0; array[8] = m_position.Z+largeur;
    array[9] = m_position.X+profondeur; array[10] = 0; array[11] = m_position.Z-largeur;
   
    //Hauteur maximale -> rebord exterieur
    array[12] = m_position.X-profondeur; array[13] = 4*hauteur+m_etage.Y/20; array[14] = m_position.Z-largeur;
    array[15] = m_position.X-profondeur; array[16] = 4*hauteur+m_etage.Y/20; array[17] = m_position.Z+largeur;
    array[18] = m_position.X+profondeur; array[19] = 4*hauteur+m_etage.Y/20; array[20] = m_position.Z+largeur;
    array[21] = m_position.X+profondeur; array[22] = 4*hauteur+m_etage.Y/20; array[23] = m_position.Z-largeur;
   
    //Hauteur maximale -> rebord intérieur
    array[24] = m_position.X-profondeur+0.5; array[25] = 4*hauteur+m_etage.Y/20; array[26] = m_position.Z-largeur+0.5;
    array[27] = m_position.X-profondeur+0.5; array[28] = 4*hauteur+m_etage.Y/20; array[29] = m_position.Z+largeur-0.5;
    array[30] = m_position.X+profondeur-0.5; array[31] = 4*hauteur+m_etage.Y/20; array[32] = m_position.Z+largeur-0.5;
    array[33] = m_position.X+profondeur-0.5; array[34] = 4*hauteur+m_etage.Y/20; array[35] = m_position.Z-largeur+0.5;
   
    //Hauteur du toit
    array[36] = m_position.X-profondeur+0.5; array[37] = 4*hauteur; array[38] = m_position.Z-largeur+0.5;
    array[39] = m_position.X-profondeur+0.5; array[40] = 4*hauteur; array[41] = m_position.Z+largeur-0.5;
    array[42] = m_position.X+profondeur-0.5; array[43] = 4*hauteur; array[44] = m_position.Z+largeur-0.5;
    array[45] = m_position.X+profondeur-0.5; array[46] = 4*hauteur; array[47] = m_position.Z-largeur+0.5;
   
    return array;
}



La seconde (dans la classe qui gère la physique) est censé (je dis bien censé) mailler chaque immeuble grâce à ces vertices mais il ne se passe rien du tout, comme s'il ne crée rien. PS : Je suis sur que l'erreur vient de cette méthode.

Code c++ :

void Physics::MaillageParVertices(std::vector<irr::scene::Building>& Ville){
    irr::s32 nbrImmeuble = (irr::s32)Ville.size();
   
    NewtonCollision *treeCollision;
    irr::core::matrix4 mat;
    irr::core::vector3df position;
   
    treeCollision = NewtonCreateTreeCollision(Physics::newtonWorld, 0);
    NewtonTreeCollisionBeginBuild(treeCollision);
   
    for(int k=0;k<nbrImmeuble;k++){
       
        position = irr::core::vector3df();
        position = Ville[k].getPosition();
        irr::f32 *verticesArray = Ville[k].getVerticesBox();
        NewtonTreeCollisionAddFace (treeCollision, 16, verticesArray, 12, 0);
       
    }
   
    NewtonTreeCollisionEndBuild(treeCollision, 1);
    Physics::newtonBody = NewtonCreateBody(Physics::newtonWorld, treeCollision, mat.pointer());
    NewtonReleaseCollision(Physics::newtonWorld, treeCollision);
    NewtonBodySetUserData(Physics::newtonBody,reinterpret_cast<void*>(newtonNode));
    mat.setTranslation(position);
    NewtonBodySetMatrix(Physics::newtonBody, mat.pointer());
   
}



J'ai créé un cube grâce à la physique, mais ce cube traverse mes immeubles.
Est-ce que vous pourriez m'aider ?

Merci d'avance.

Hors ligne


#1 

12-06-2013 23:21:28

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

je ne sais pas pour Newton, ça me semble correct, perso j'utilise Bullet
pour NewtonTreeCollisionAddFace il est stipuler:

const NewtonCollision* treeCollision - the pointer to the Tree Collision collision shape.
    int vertexCount - number of vertices in vertexPtr
    const dFloat *vertexPtr - pointer to an array of vertices. Each vertex should consist of at least 3 floats.
    int strideInBytes - size of each vertex in bytes. This value should be 12 or larger.
    int faceAttribute - ID that identifies the polygon. The application can use this value to customize the behavior of the collision geometry.


donc NewtonTreeCollisionAddFace(treeCollision, 48, verticesArray, 3*sizeof(float), 0);
après la disposition des floats dans l'array a une importance, également t'est indices, ici je supose que Newton att quelque chose du même ressort que GL_TRIANGLE
donc peut-être que sa bloque de ce coter la

bref, étant donner l'allure de t'est immeuble dans ton précédant poste, pourquoi tu n'utilise pas la bounding box de chaque mesh ?
sur bullet il y a btGImpactCompoundShape pour crée des shapes avec d'autre afin d'optimiser les calcules, basé ta physique sur un mesh est très couteux en calcul, donc regarde de ce coter

avec un peut de recherche je tombe sur NewtonCreateCompoundCollision
l'intérét majeur c'est quand vachement plus simple et plus optimiser,
chaque immeuble crée sont NewtonBox qui est ajouter automatiquement dans ton NewtonCompoundCollision de ton manager, ou tu gère chaque NewtonBox comme un body distinct, sa reste moins optimiser

ps:
        position = irr::core::vector3df();

n'est pas indispenssable, position n'a pas beusoin d'une initialiser
c'est une reference pas un pointeur

Hors ligne


#2 

12-06-2013 23:32:29

Kaze
Membre
Date d'inscription: 12-03-2011
Messages: 60

Le problème de la bounding box, c'est que mon immeuble n'est pas une boite. Si je devais simplifier, c'est une boite avec un cadre sur le toit (qui représente le rebord). Si je ne voulais utiliser que des bounding box, il m'en faudrait 5 et je pensais que ça allait être couteux en calcul alors qu'un rendement par vertices me semblait plus approprier. Je vais regarder ce que tu m'as donné même si j'aimerais comprendre où se trouve mon erreur.

PS : voila le résultat avec une bounding box :

Dernière modification par Kaze (12-06-2013 23:36:05)

Hors ligne


#3 

12-06-2013 23:48:42

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

uhm d'accort

vertexCount => tu a 48 vertex (3 vertex = 1 triangle)
strideInBytes => 1 vertex = 3 position x,y,z = 3*sizeof(float)

si je ne m'abuse ...

bref, dans ton cas il vaut mieux avoir 5 box plutot qu'un mesh, c'est pas pour rien qu'on optimise les calcules d'intersection sur les mesh avec des structure BVH wink

Hors ligne


#4 

13-06-2013 00:26:25

Kaze
Membre
Date d'inscription: 12-03-2011
Messages: 60

Dans ce cas, je comprend alors qu'il est préférable de créer 5 box même si je ne sais absolument pas ce qu'est une structure BVH. Je vais donc faire ça et j'essaierai de vous montrer le résultat.

Hors ligne


#5 

13-06-2013 08:22:43

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

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