Historique des modifications - Message

Message #11343

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


TypeDateAuteurContenu
Création du message12-06-2013 17:46:35Kaze
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

OptionsLiens officielsCaractéristiquesStatistiquesCommunauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1441 sujets
11339 messages
Dernier membre inscrit: Saidov17
88 invités en ligne
membre en ligne: -
RSS Feed