#0 

30-05-2013 18:05:23

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

Bonjour,

je cherche à créer une ville, et pour ce faire, j'ai créé un classe qui crée un immeuble en partant d'un cube dont l'échelle est modifiée. Le but étant d'appliquer différentes textures pour avoir des immeubles différents. Voici mon code :

main.cpp

Code c++ :

int i=0;
std::vector<Building> Ville;
Building *immeuble;
for (int k=0;k<2;k++){
immeuble = new Building(device, driver, sceneManager);
Ville.push_back(*immeuble);

if(k==0){Ville[k].construire(1, irr::core::vector3df(10,0,-10), irr::core::vector3df(10,10,10), 2);}
if(k==1){Ville[k].construire(2, irr::core::vector3df(20,0,-40), irr::core::vector3df(10,20,10), 2);}
}



building.hpp

Code c++ :

#ifndef BUILDING_HPP
#define BUILDING_HPP

#include "newt/Newton.h"
#include "main.hpp"

class Building
{
    public :
   
    Building(irr::IrrlichtDevice *device, irr::video::IVideoDriver *driver, irr::scene::ISceneManager *sceneManager/*, NewtonWorld *newtonWorld*/);

    void construire(int typeChoix, irr::core::vector3df positionChoix, irr::core::vector3df tailleChoix, int coeffChoix);
    void facade();
   
    private :
   
    irr::IrrlichtDevice* buildingDevice;
    irr::video::IVideoDriver* buildingDriver;
    irr::scene::ISceneManager* buildingSceneManager;
    irr::scene::ISceneNode* buildingNode;
   
    static NewtonWorld* buildingWorld;
    static NewtonBody* buildingBody;
   
    int coeff;
    int type;
    irr::core::vector3df position;
    irr::core::vector3df taille;
};

#endif



Building.cpp

Code c++ :

#include "building.hpp"

// VARIABLES STATIQUES
NewtonWorld* Building::buildingWorld = NULL;
NewtonBody* Building::buildingBody = NULL;
/*
int Building::coeff = 0;
int Building::type = 0;
irr::core::vector3df Building::position = irr::core::vector3df(0,0,0);
irr::core::vector3df Building::taille = irr::core::vector3df(0,0,0);*/

// --------- ---------

Building::Building(irr::IrrlichtDevice *device, irr::video::IVideoDriver *driver, irr::scene::ISceneManager *sceneManager/*, NewtonWorld *newtonWorld*/)
{
    buildingDevice = device;
    buildingDriver = driver;
    buildingSceneManager = sceneManager;
    //buildingWorld = newtonWorld;
   
    buildingNode = NULL;
}

void Building::construire(int typeChoix, irr::core::vector3df positionChoix, irr::core::vector3df tailleChoix, int coeffChoix)
{
    type = typeChoix;
    position = positionChoix;
    taille = tailleChoix;
    coeff = coeffChoix;
   
    facade();
}

void Building::facade()
{
    taille.Y = taille.Y*coeff;
    float longueur = 2*taille.X, hauteur = 2*taille.Y, largeur = 2*taille.Z;
   
    irr::scene::IMesh* buildMesh = buildingSceneManager->getMesh("ressources/immeuble/formeBis.3ds");
    buildingNode = buildingSceneManager->addMeshSceneNode(buildMesh);
   
    if(type == 1){buildingNode->setMaterialTexture(0, buildingDriver->getTexture("ressources/immeuble/1/facade.png"));}
    if(type == 2){buildingNode->setMaterialTexture(0, buildingDriver->getTexture("ressources/immeuble/2/facade.png"));}
    if(type == 3){buildingNode->setMaterialTexture(0, buildingDriver->getTexture("ressources/immeuble/3/facade.png"));}
    if(type == 4){buildingNode->setMaterialTexture(0, buildingDriver->getTexture("ressources/immeuble/4/facade.png"));}
    if(type == 5){buildingNode->setMaterialTexture(0, buildingDriver->getTexture("ressources/immeuble/5/facade.png"));}
   
    buildingSceneManager->getMeshManipulator()->makePlanarTextureMapping(buildMesh, taille.Y/(coeff*2));
    buildingNode->setMaterialFlag(irr::video::EMF_LIGHTING, false);
    buildingNode->setScale(taille);
    buildingNode->setPosition(position);
}



Mes textures représentent une fenêtre et pour modifier cette texture texture en fonction du nombre d'étages de l'immeuble, j'utilise la fonction "makePlanarTextureMapping". Lorsque je fabrique un immeuble, je n'ai aucun problème mais lorsque j'en fais un second, la texture du premier est aussi multipliée et donc le nombre d'étages n'est plus respecté. Pourriez vous m'aider ?

Merci d'avance.
Kaze

Hors ligne


#1 

30-05-2013 21:40:25

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

Je ne ferais pas comme ça. Si tu ne veux pas plomber tes perfs, il faut que tu dérives Building de ISceneNode et que dans ton buffer tu créés "manuellement" tes meshs avec tes coordonnées de textures. Ainsi tu peux mettre une multitude de building dans un même node et gérer convenablement tes textures. Ensuite, tu peux même utiliser les VBO puisque tu as un gros mesh.
Maintenant ton histoire de texture est simple. Tu importes plusieurs fois le même mesh donc irrlicht ne charge que le premier (pour éviter les doublons en mémoire). Lorsque tu essais de charger un mesh déjà en mémoire, irrlicht te renvoie un pointeur sur celui déjà chargé. Donc lorsque tu fais "makePlanarTextureMapping(buildMesh..." tu modifies l'UNIQUE INSTANCE du mesh ayant pour nom ''ressources/immeuble/formeBis.3ds" donc tout les nodes qui utilisent ce mesh sont modifiés en même temps.


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


#2 

30-05-2013 23:57:58

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

Alors j'avais compris pourquoi le programme ne marchait pas, mon problème était de trouver une solution. C'est ce que tu as l'air d'avoir fait sauf que je n'ai absolument rien compris. Je suis encore nouveau dans l'utilisation d'Irrlicht donc, serait-il possible de détailler plus, ou de m'explication les différentes étapes à faire parce que je nage dans le brouillard.
Encore désolé.

PS : En plus je ne sais pas créer des mesh. J'avais toujours fais mes modèles avec blender que j'avais ensuite importer dans Irrlicht.

Dernière modification par Kaze (30-05-2013 23:59:23)

Hors ligne


#3 

31-05-2013 09:28:51

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

Tuto sur la creation d'un SceneNode perso : tuto SDZ
Le tuto est clair, j'ai appris à créer mes scenenode perso très facilement avec.

Un mesh est facile à créer. Un mesh est composé de triangles donc 3 vertex (sommets) + 3 indices (ordres dans lequel sont reliés les vertex). L'ordre des vertex détermine le "sens" dans lequel est visible le triangle. Mais t'inquiètes pas, tout est bien expliqué dans le tuto. Après si tu as des difficultés je suis toujours là.^^


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


#4 

31-05-2013 11:22:20

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

OK merci, je me lance dans le tuto et je reviendrais si j'ai encore un problème. Merci beaucoup !

Hors ligne


#5 

02-06-2013 00:46:28

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

J'ai réussi un créer un cube grâce à cette méthode et j'ai compris que je pouvais associer une coordonnée 2D de ma texture à mon vertex pour former mon image de façade. Mais je ne vois pas comment dire au vertex qu'il doit chercher la coordonnée (x;y) dans tel texture et pas dans une autre. Comment fait-on pour associer une texture à un vertex ?

Hors ligne


#6 

02-06-2013 13:23:10

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

Tu ne peux utiliser qu'une texture. Quand tu créés tes immeubles, fait plus qu'un cube.
Tu devrais le créer de la sorte:
Tu pars sur une forme de prisme (sans la face du dessous car elle ne se verra pas);
Tu découpes ce prisme par étage de l'immeuble (une façade sera composée de plusieurs rectangles juxtaposés dans le sens de la hauteur);
Dans ces rectangles, tu découpes des rectangles qui correspondront à tes fenêtres (ces rectangles doivent être détachés de ceux de l'étage comme ça tu peux lui affecter des coordonnées de texture différentes suivant le style de la fenêtre);

Dans ta texture :
Dans un coin, tu fais le revêtement de la façade. Ensuite, tu mets plusieurs styles de fenêtre dans la texture et tu attribut les coordonnées qui vont bien en fonction de ce que tu veux.


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 

02-06-2013 15:53:44

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

En réalité, j'ai un énorme problème. Je ne comprend même pas à quoi sert le fait de fabriquer des SceneNode. Pour moi ce n'est qu'une boite dans laquelle je ne peux mettre qu'une seule forme.

Au départ, je fabriquais un cube que je texturais pour ne faire que les façades latérales, ensuite je faisais un plan avec une autre texture pour modéliser le toit et je terminais en fabriquant un rebord dans une troisième texture et je plaçais tout ça dans un seul SceneNode.

Mais avec ce système je n'arrive pas à utiliser différentes textures. J'ai l'impression de devoir utiliser 3 SceneNode pour ne faire qu'un immeuble. Et en plus je cherche à en représenter plus d'une centaine ce qui nous donne plus de 300 SceneNode. En plus j'aimerais transmettre des données à mon SceneNode (différents coefficients qui me permette de caractériser un immeuble d'un autre, genre le nombre d'étages ou les dimensions) mais je suis cantonné à ce constructeur que je n'arrive pas à modifier sans faire hurler mon compilo :

Code c++ :

irr::scene::CSceneNodePerso::CSceneNodePerso(irr::scene::ISceneNode* parent,
                                             irr::scene::ISceneManager* mgr,
                                             irr::s32 id): irr::scene::ISceneNode(parent, mgr, id)



Je n'arrive pas à faire grand chose avec ces SceneNode perso. Pourriez vous m'aider ?

Hors ligne


#8 

02-06-2013 20:13:44

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

Il ne faut pas utiliser plusieurs textures, il faut tout mettre dans une texture. Il faudrait que tu regardes les tuto sur le unwrap UVW et faire de la modélisation t'aiderais à mieux comprendre comment sont créés les meshs et comment sont appliquées les textures. Tu n'as pas à utiliser plusieurs mesh et plusieurs textures pour un objet, d'ailleurs c'est carrément déconseillé! Pour chaque scenenode, tu as un enregistrement dans la liste de rendu a CHAQUE frame. Il vaut mieux quelques gros scenenode (gros = beaucoup de triangles) plutôt que beaucoup de petit scenenode. Je vais essayé de te faire un exemple mais fais les recherches comme je te l'ai expliqué plus haut.


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 

02-06-2013 22:11:48

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

Le problème est que pour gérer la collision avec mon moteur physique (qui est Newton) je suis obligé d'avoir des formes simples. Et puis si je reprend ton idée, je dois fabriquer mes immeubles un par un en découpant chaque fenêtre puis en choisissant moi-même chaque texture, or le principe est que ce soit automatique : avec un "random", j'ai un nombre d'étage et donc un nombre de fenêtre différent à chaque fois, avec un autre, j'ai un type d'immeuble au hasard (type = différentes texture de façade, de toit, et de rebord). Je ne pourrais rien automatiser si j'utilise cette méthode.

Dernière modification par Kaze (02-06-2013 22:34:19)

Hors ligne


#10 

03-06-2013 14:44:41

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

Bien sûr que si! Il te suffit de coder un créateur d'immeuble (mesh) qui prend en paramètre le nombre d'étages, le nombre de fenêtre en façade et tout le reste. J'avais commencé à préparer un exemple de node avec création automatique d'un immeuble mais tu m'as l'air de chercher un code tout fait sad.
Pour newton, je ne vois pas le problème. Tu créés ton immeuble donc tu peux bien créer une collision avec un cube qui sera tout simplement la BoundingBox de ton immeuble. Un cube, tu ne trouves pas que c'est simple comme forme?

Lorsque tu auras un minimum potasser sur les idées que je t'ai donné au lieu de les réfuter sans raisons valables, je pourrais t'aider. Fais les recherches dont je t'ai parlé plus haut et tu comprendras les idées que je t'ai donné. Avec ma méthode, il se pourrait même que tu puisses créer plusieurs immeuble dans le même node (avec quelques modifications et ajouts bien sûr).

Sur ce, je te souhaite de bonnes recherches wink.


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


#11 

04-06-2013 20:32:57

Gehogor
Abonné
Lieu: Paris
Date d'inscription: 02-06-2009
Messages: 130
Corrections: 7

Je reviens sur le moteur physique Newton, pourquoi tu ne peux utiliser que des formes simples ? Quand tu parles de formes simples tu veux dire des formes uniquement convexes ? Ou plutôt des prismes à base rectangulaires ?

Je maitrise bien aujourd'hui Newton connecté à Irrlicht et je n'ai aucun problème de conversion de mesh simple ou complexe vers Newton. Si tu as besoin, je pourrai te filer des fonctions si j'ai en stocke bien sûr.

Après en ce qui concerne l'évolution de la discussion, et dans la plus grande courtoisie possible, je partage les sentiments de johnplayer.

       A bientôt.


Et hop... wink

Hors ligne


#12 

08-06-2013 16:12:14

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

Après avoir passer la dernière semaine à essayer de créer des immeubles avec fenêtres dont le nombre dépendait de la dimension désirée comme expliqué, je me suis rendu compte qu'il y avait une manière très simple d'appliquer plusieurs textures à un seul SceneNode et de faire passer des informations supplémentaires. Donc j'ai pu créer ma répétition de texture sans avoir le problème que j'avais avant et mes différents immeubles avec seulement 8 vertices. Je n'ai jamais voulu de code tout fait, je voulais juste comprendre le principe.

Hors ligne


#13 

09-06-2013 08:46:50

Gehogor
Abonné
Lieu: Paris
Date d'inscription: 02-06-2009
Messages: 130
Corrections: 7

Excellent, j'espère que je pourrai voir des images du résultat !
                                                     
                                        A bientôt.


Et hop... wink

Hors ligne


#14 

09-06-2013 16:18:43

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

Là j'ai créé une ville de 100 immeubles avec 5 textures différentes. Mais tous les immeubles ont une surface de 20x20 et l'étage est générer au hasard :


Sinon, là j'ai créé 5 immeubles avec mes 5 textures différentes dont les surfaces varient :

Hors ligne


#15 

09-06-2013 16:25:51

Gehogor
Abonné
Lieu: Paris
Date d'inscription: 02-06-2009
Messages: 130
Corrections: 7

Très sympa !


Et hop... wink

Hors ligne


#16 

09-06-2013 16:30:32

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

désactive le mipmap
sa rendra mieux

sinon si tu cherche des performances, il est vrai que tu pourrais passer par un seul mesh et donc un seul node

Hors ligne


#17 

09-06-2013 16:34:12

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

C'est vrai que c'est sympa. Je vois que je me trompais quand je pensais que tu cherchais un code tout prêt. Désolé^^.
Par contre, tu as toujours 1 immeuble/node?


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


#18 

09-06-2013 16:58:05

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

Oui, c'est le seul défaut mais dans un node, j'ai la facade, le toit et le rebord. Donc il serait possible de créer plusieurs immeubles dans un node.

PS : c'est quoi le mipmap ?

Dernière modification par Kaze (09-06-2013 16:58:31)

Hors ligne


#19 

09-06-2013 17:30:51

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

le mipmap c'est pour décrémenter la qualiter de la texture en fonction de la distance, pour des raison de performances, à l'heure actuelle avec les performances des gpu ce n'est plus nécéssaire
les limite d'irrlicht sont cpu et non gpu, c'est pour ça si tu passe de n node a 1 en les mergents tu gagne en vitesse et tu diminue les changement de context

(c'est le flou que tu peut observer quand tu est a distance)

Hors ligne


#20 

09-06-2013 18:03:54

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

J'ai désactiver le mipmap, avec une fonction trouver sur internet mais je trouve le résultat beaucoup plus brouillon. Je vais peut-être mettre en place un brouillard.

Voici le résultat sans mipmap :

Hors ligne


#21 

09-06-2013 18:57:44

Gehogor
Abonné
Lieu: Paris
Date d'inscription: 02-06-2009
Messages: 130
Corrections: 7

En effet moins beau, par contre as-tu activé l'antialiasing ? Il faut l'activer par "material". Ça fera beaucoup plus fin au niveau des traits et donc plus beau.


Et hop... wink

Hors ligne


#22 

09-06-2013 19:19:45

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

L'antiliasing est activé. J'ai essayé de rajouter un filtre anisotrope ce qui rend mieux mais je perds en performance donc je ne pense pas le garder.

Dernière modification par Kaze (09-06-2013 20:27:20)

Hors ligne


#23 

09-06-2013 20:59:15

Gehogor
Abonné
Lieu: Paris
Date d'inscription: 02-06-2009
Messages: 130
Corrections: 7

C'est bizarre, on ne dirait pas. J'ai fait un petit essai de mon coté et voilà ce que ça donne avec l'antialiasing...


Et hop... wink

Hors ligne


#24 

09-06-2013 21:21:49

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

Voila ce que ça donne avec l'anti aliasing et le filtre anisotrope, je ne vois pas beaucoup de différences avec la première image :

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