Historique des modifications - Message

Message #11343

Sujet: Maillage d'une ville composé de plusieurs immeubles


Type Date Auteur Contenu
Création du message 12-06-2013 17:46:35 Kaze
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.

Retour

Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
116 invités en ligne
membre en ligne: -
RSS Feed