Pages: 1
Bonjour,
Je suis nouveau sous Irrlicht et sous la programmation 3D en général. Je m'étais initialement formé pendant quelques semaines à Ogre3D mais n'étant pas satisfait de l'interfaçage - un peu trop compliqué à mon goût... - avec WPF j'ai décidé de m'initier à Irrlicht hier.
Je dois dire que je suis convaincu jusqu'à présent mais encore est-il que je n'arrive pas à trouver ce dont j'ai absolument besoin pour mon projet. En gros, mon programme consiste à visualiser des objets en 3D, disons des maisons. Et l'utilisateur doit avoir la possibilité:
1. De changer la couleur de certaines partie de la maison SEPAREMENT: mettre les fenetres en rouges, les portes en bleu, les murs en orange...
2.Remplacer le type de toit par un autre.
Je dispose de ces objets au format 3ds, il m'a semblé que j'aurais besoin de pouvoir accéder aux sous-mesh de ces objets pour pouvoir leur appliquer mes textures individuellement, mais je suis vraiment perdu car je n'arrive pas à trouver comment le faire avec Irrlicht. (Je ne travail pas avec des animation mais avec des objets statiques)
Mon autre problème concerne le remplacement du toit: le toit peut être vue comme une sous-mesh, et j'aurais donc besoin de remplacer cette sous-mesh par un autre mesh. Autre chose, il y a aussi certaines sous-mesh que j'aimerais pouvoir cacher par défaut.
Quelqu'un pourrait t-il me donner la marche à suivre avec Irrlicht sachant que je ne suis pas un expert en la matière ?
Je vous remercie !
Petite question subsidiare: Comment est determiné le nom des sous-mesh d'un fichier 3ds ?
Dernière modification par Joeyy (01-04-2013 13:50:14)
Hors ligne
Je pense que tu te complique la tache. Etant donné que tu n'auras pas de problème de performances, il serait mieux que tes éléments soient dans des fichiers différents.
Un truc du genre:
DOSSIER : Maison001
-> Toit01.3ds
-> Toit02.3ds
-> Murs.3ds
...
Ensuite, tu créés un ISceneNode* EmptySceneNode, que tu appelles Root par exemple, et tu lui attaches les éléments de ta maison (ImeshSceneNode*). Ensuite puisque tu connais les éléments attachés à Root, tu n'auras aucun mal à supprimer des éléments pour les remplacer par d'autres.
Il est possible de trouver les éléments mais ce serait fastidieux de les modifiés.
Si je ne me trompe pas ton objet est chargé comme suit:
IMesh* modele3ds;
IMeshBuffer* element0 = modele3ds->getMeshBuffer(0);
IMeshBuffer* element1 = modele3ds->getMeshBuffer(1);
... jusqu'à modele3ds->getMeshBufferCount(); (ou un truc du genre, je fais de tete^^).
Bonne prog'
Hors ligne
Merci beaucoup pour ta réponse rapide !
Effectivement ton idée est excellente et c'est vrai qu'elle simplierait grandement les choses. Elle a en plus le mérite d'être plus facilement maintenable. Cependant voici les points qu'elle soulève:
1. Je reprends un ancien projet, je refais quasiment tout depuis le début mais le fait est que j'hérite des modèles 3ds déjà fait, ce n'est pas moi qui les modélise. Ne sera t-i pas fastidieux de découper ces modèles en plusieurs sous-modèles ? Il y a en a une quinzaine, les formes sont relativement simples : il s'agit grosso-modo de maisons. Je précise également que les sous partie sont déjà repérées par l'usage de matériaux différents dans le 3ds, y a t-il une technique pour les extraire rapidement (Copié-collé ?). Je dispose de Blender 2.66 pour éventuellement éditer ces fichiers 3ds mais encore une fois je ne suis pas un expert et je n'ai peut-être pas les mêmes idées et la même vision des choses que toi. Ma question est donc celle d'un débutant: cela n'induirait-il pas une charge très élevée de travail dans mon cas ?
2. Dans l'hypothèse où je serais parvenu à séparer chaque sous-partie dans un fichier distinct comme ce que tu expliques, comment les positionner de manière parfaite avec Irrlicht ? Comment positioner la fenetre à l'endroit exact où elle doit être sur le mur ? Cette perspective m'effraie un peu pour être honnête, mais je suis prêt à apprendre pourvu que ce ne soit pas d'une technicité hallucinante avec du code DirectX inside :p.
Merci beaucoup pour le code permettant d'accéder aux sous-mesh!
Qu'est ce qui rendrait la modification de leurs attributs si difficile ?
En tout cas, merci beaucoup pour ton aide !!
Je me demandais si quelqu'un lirais mon message un jour
Dernière modification par Joeyy (01-04-2013 12:41:42)
Hors ligne
1) ne t’inquiète pas pour ça, ça prend 10min a tout casser, n'oublie pas de redéfinir le centre sur chaque partie, mais surment qu'il y a une fonctions sur blender pour sélectionner par material
2) t'a deux solutions:
-soit tu découpe ton mesh par material, tu garde les positions des vertices, mais tu seras obliger de changer les matérials de tout les fenêtres, sa implique d'avoir un modele de fenêtre par model de corps de maison, et ... etc, c'est surement la solutions la plus simple, mais asse limité
-soit tu découpe par type d'obj (supprime les doublons), tu définisse des bonnes sur le corps de la maison avec des noms explicites, tu le charge en premier et tu charge le reste avec fonctions des potion/rotation des bonnes par les noms que tu a donnée, ou plus simple tu les mes en parents, de cette façon tu peut modifier essaiment chaque fenetre, chaque porte individuellement que ce soit couleur, forme, ... etc
Hors ligne
Je suis épaté par la réactivité ce forum, ça donne envie d'en savoir plus pour pouvoir aider les autres à mon tour,je vous suis vraiment reconnaissant pour votre aide !
Desolé pour les questions assez basiques que je vais poser, j'ai juste besoin d'une réponse brève pour dégrossir le sujet, je ferai ensuite l'effort de documentation
-Qu'entends-tu par redéfinir le centre ?
-Si je comprends bien la première solution: j'ai ma maison et disons que je veux dans un premier temps isoler les portes dans un fichier 3ds. Si j'ai bien compris, je supprime tout ce qu'il y a autour mais en ne changeant pas la position des portes que je vais laisser. J'applique le même material à toutes les portes. Je répète ça pour toutes les sous-parties que je souhaite isoler, puis je charge toutes les mesh sur la même node. C'est bien cela que tu entends par découper par material en gardant la position des vertices ?! Dans la mesure où chaque maison est spéciale (on ne réutilises pas les mêmes portes, et les mêmes fenêtre d'une maison à l'autre), je trouve cette méthode intéressante.
-Je n'ai pas bien compris ce que tu m'as expliqué, j'ai compris que: je dois repérer les points clés du modèle par des bones, puis je charge d'abord ces bones puis je charge le reste relativement à ces bones. Par contre pour la partie: chargement du reste c'est un peu flou... comment cela se traduit-il dans Irrlicht ? C'est ça qui me préoccupe, parce que je n'ai pas d'idée sur la manière d'implémenter cette approche. Le concept de parent dont tu parlais ne m'évoque pas grand chose
Dernière modification par Joeyy (01-04-2013 14:38:11)
Hors ligne
1)ah désoler je ne suis pas très doué pour expliquer ... ^^"
le centre c'est la position du mesh dans sont espace, en gros c'est une position absolue dans le qu'elle les autres vertices sont associer, si tu bouge la position dans blender ça n'affecte pas blender, mais quand tu passe par un moteur 3d, irrlicht dans ton cas le rendue du mesh, ou plus spécialement la transformations qui lui est appliquer ce feras par rapport a cette possition
ici tu voie bien le centre est différent, il serviras de point de repère pour placer le mesh dans l'espace
2) oui c'est ça tu vire tout les vertices autres que ceux des portes, tu peut avoir des matèrials différent (texture), mais si tu veut changer la couleur d'une porte, sur irrlicht, ce ne seras pas aise, et tu retombe sur ton problème initial ...
3) plus ou moin oui, par exemple, en admettant, que les fondations de t'a maison ne soit pas modifiable (hors toit, fenetre, portes, ...), si tu supprime tout c'est éléments du modelès, tu as ce que j'apelle le corps de t'a maison, si maintenant (je ne sais pas si c'est ce que tu cherche) toutes t'est fenetre ont la même taille, de même que tout les portes, dans ce cas tu pourrais très bien ajouter des bonnes sur le corps qui représente les positions/rotations des éléments que tu veut ajouter.
sur chaque bonne dans blender, tu lui donne une clée pour connaitre le type d'obj qui seras la
de cette façon l'osque tu chargeras le corps tu aurras access au bonnes, et au clée que tu auras définie
tu fait un petit boucle sur tout les bonnes et suivant sont nom tu charge t'elle ou t'elle mesh, tu crée un scene node et tu le set en parent du bonne
cf: http://irrlicht.sourceforge.net/docu/_i … ource.html
je sais pas si je suis bien claire
ça te simplifi grandement la tache si chaque obj doit pouvoir être modifier indépandement
ps: je reviendrais ce soire, je doit recopier mais cours
Hors ligne
Merci beaucoup pour ton aide et j'y vois vraiment plus claire!
J'ai utilisé ta première méthode et elle marche vraiment très bien. Les choses sont vraiment simples avec Irrlicht comparé à Ogre3D. J'ai découpé mes objets très rapidement avec blender en faisant des copié-collé dans des nouveaux fichiers et le positionnement relatifs entre eux a été conservé après importation dans Irrlicht.
Concernant le problème pour modifier la texture des mesh individuellement je pense avoir trouvé la parade: Créer un node pour chaque mesh et donner à ces node la même position - pour le positionnement des meshs entre eux. Comme je n'ai pas de problème de performances ça convient très bien dans mon cas.
Reste encore à m'assurer que ça marchera, j'ai testé le fait de mettre plusieurs nodes au même endroit et ça à l'air de marcher, mais je n'ai pas le temps de tester dans l'immédiat si le fait d'appliquer des textures différentes sur des nodes placé au même endroit mais chargées avec des mesh différentes ne pose pas de problème. Je le ferai ce soir.
L'idée c'est donc d'appliquer ensuite ma texture à chaque node, chaque node correspondant à une mesh. Reste plus qu'à mettre en place tout avec un tableau de nodes etc.. et à formaliser le système mais ça s'annonce très simple.
Voilà, je vais le faire de cette manière je pense ! Merci beaucoup pour votre aide, je vous tiendrai au courant de mon avancement
Merci beaucoup!!
Dernière modification par Joeyy (01-04-2013 16:13:25)
Hors ligne
Ca a l'air de plutôt bien marcher !
Cependant je rencontre un problème vraiment gênant que je n'arrive pas à surmonter, certaines parties de mes objets sont transparentes comme le montrent les images ci-dessous.
Au début j'ai pensé que cela était dû au fait que j'avais mis plusieurs node au même endroit - et que peut-être elles se gênaient mutuellement - mais ce n'est pas le cas car ce phénomène se produit même lorsqu'un seul objet est chargé comme le montrent les images ci-dessous.
En tatonnant j'ai determiné que cela a l'air de provenir d'un paramétrage de la caméra (j'utilise la camera FPS prédéfinie), car seules les faces (du mesh), qui font face à la caméra sont rendues transparentes. En déplacant la caméra les faces réaparaissent - mais les nouvelles qui sont visées disparaissent. J'ai d'abord pensé à la méthode des camera setNearValue(), mais cela se produit même si la caméra est très éloigné.
Voici mon code (très basique):
Je ne vois pas trop à quoi cela peut être dû
PS: Ah oui, j'utilises Irrlicht Lime donc le code au dessus est en C#, mais je pense que c'est sensiblement la même chose.
Dernière modification par Joeyy (02-04-2013 09:03:55)
Hors ligne
essaye
le fait de positionner plusieurs obj en même endroit ne peut engendré ce genre de doucis
dans le pire des cas si deux polygone ce chevauche tu auras un problème de depth, ça donneras des sorte de lines
je voie par contre que tu passe de ~270 à 30 fps avec le toit, même si t'est pas sensé avoir des soucis de performance, soit ta une bécane est moisi soit ton toit a trop de polygone, tu peut optimiser en passant par addOctreeSceneNode
si tu n'utilise pas d'animation/bones tu peut éviter de passer par un "animated mesh"
Hors ligne
Ça fonctionne!!!!!
Merci beaucoup ! Ce forum est vraiment génial, c'est fou, j'ai essayé de me former à Ogre3D pendant 3-4 semaines, j'avais beaucoup avancé mais sans vraiment parvenir à mon but.
Entre comment convertir mes 3ds au format Ogre - avec la taille gigantesque que ça prend sur le disque - et comment intégrer le moteur dans un WPF pour avoir une interface utilisateur native Windows, rien n'était simple. Mais en à peine 2 jours - en incluant le jour où je l'ai découvert - j'ai quasiment bouclé mon projet avec Irrlicht et l'aide de ce forum vraiment génial, je n'en reviens pas.
Avant de crier victoire, c'est vrai que le taux de FPS a vraiment chuté... J'utilises un PC pas terrible du tout, c'est un notebook Samsung N150 avec un chipset graphique intégré (Intel Graphics Media Accelerator 3150), c'est peut être la cause. Je vais essayer sur le Dell Optiplex 755 de mon salon pour voir.
En tout cas vraiment merci, maintenant il ne me reste plus qu'à mettre une image 2D en fond d'écran, à écrire le code pour restreindre les déplacement de la caméra à des rotations autour de l'objet en l'empêchant de couper le plan (x,z) et à formaliser le chargement des maisons. Je pense que je vais utiliser un conteneur pour mes nodes qui permet d'indexer les éléments avec des clés "string", comme ça le nom de la clé sera le nom du fichier.
Les sous-parties de la maison auront des noms tels que:
Dossier Maison1
-CORPS.obj
-FENETRE.obj
-TOIT.obj, s'il n'y a qu'un seul toit
-Sinon TOIT1.obj, TOIT2.obj etc...
La méthode de chargement:
-Crée la liste des fichiers du le dossier,
-Si un fichier TOIT1.obj existe, il y a plusieurs toits, on charge alors le premier.
-On crée autant de nodes que nécessaire qu'on positionne toutes au point (0,0,0)
-On charge chaque sous-partie dans une node
L'interface graphique permet ensuite de changer les couleurs et les textures de chaque sous-partie etc...
Merci, je suis vraiment béni et reconnaissant pour votre aide, dans l'immédiat je vais essayer de lancer le programme sur l'ordinateur du bureau pour voir ce qu'il en est des FPS, je vous tiendrai au courant de mon avancement
Edit1: J'ai utilisé des Mesh et AddOctreeSceneNode mais le FPS est inchangé sur mon notebook
Dernière modification par Joeyy (02-04-2013 10:13:54)
Hors ligne
Petite parenthèse pour poser une question de grand débutant, j'ai du mal à déployer l'application sur mon autre ordinateur. J'ai tenté un simple copier-collé mais la console me retourne que IrrlichtLime.dll est introuvable, il se trouve pourtant dans le même dossier que l'executable.
Quelques détails utiles:
-J'utilises le HelloWorld des exemples (il me semble que certains dossiers de destinations sont modifiés, par exemple les executables ne se trouvent pas dans le bin du dossier de l'exemple mais dans un dossier parent).
-Sur mon notebook (ordinateur sur lequel je développe), je peux lancer le programme avec ou sans debug depuis Visual Studio et via l'explorer - j'ai copié l'intégralité du projet, c'est-à-dire tous les dossiers et tous les exemples, dans un dossier partagé sur le réseau
-Sur l'ordinateur sur lequel je souhaite lancer le programme, ça me met que le dll en question est introuvable. Les dlls (Irrlicht.dll et IrrlichtLime.dll) se trouvent pourtant:
1. Dans le dossier de l'executable (Bin/Debug) de la solution, c'est là que ce trouve le .exe
2. Dans le dossier Bin/Debug que j'ai crée dans le dossier 01.HelloWorld.
Je ne vois pas comment faire pour faire fonctionner cela
Dernière modification par Joeyy (02-04-2013 11:18:15)
Hors ligne
Pour les performances il y a aussi les VBO. Tu peux les activer en atteignant les meshbuffer de tes meshs.
Les VBOs sont une méthode qui permet de mettre les objets 3D dans la ram de la carte graphique (VRAM) au lieu de la ram processeur. Le gain de performances peut être conséquent.
Par contre, il faut que la carte graphique le supporte.
Tu peux faire un truc barbare du genre :
Sinon faire :
Hors ligne
Merci beaucoup pour ta méthode que j'ai implémentée
Apparement la carte graphique - disons plutot le chipset graphique - de mon noteboot ne prend pas ca en charge. J'aurais aimé pouvoir essayer sur un autre ordinateur, de même que pour les FPS mais voilà 3h que j'essaye de faire tourner ça sur un autre ordinateur mais ça ne marche pas, comme je l'ai décrit plus haut. Je suis vraiment à cours d'idée.
Je sais que le problème vient de moi parce que les exemples livrés avec Irrlicht fonctionnent tous sur l'autre ordinateur, mais dès que je compile moi-même ça ne passe plus. J'ai vraiment pas mal ramé, j'ai notamment essayé de partir d'un projet vide mais mêmes résultats, en release:
-Tout fonctionne sur le PC de développement. Quand j'enlève une ou les deux dlls du dossier de l'executable, le programme ne se lance pas ce qui prouve qu'il utilise bien celles de ce dossier.
-Sur l'autre ordinateur, je veille à ce que les dlls soient bien dans le dossier de l'exécutable mais en lançant il y a la fenetre de crash windows et je peux lire dans la ligne de commande que IrrlichtLime.dll ou une de ses dépendances n'a pas pu être chargée. J'ai essayé en copiant-collant les dlls un peu partout dans l'arborescence et ai fait un peu tout ce qui me venait en tête...
Dernière modification par Joeyy (02-04-2013 13:55:56)
Hors ligne
Au temps pour moi!!
Je prenais les mauvaises dll
J'ai veillé à bien prendre celle du dossier release fournies avec les exemples et tout fonctionne impeccablement. Je suis à 330FPS sur le Dell Optiplex! Allez, c'est parti pour de la prog.
Hors ligne
Ma tête a sûrement disjoncté à cause de ces deux jours à coder comme un fou ce projet, mais voila 30min que j'ai un mal fou à trouver comment appliquer une couleur sur une mesh (ou sur une node vu qu'apparement c'est le concept), je vois des choses à propos des textures et sur les lumières, mais rien sur comment appliquer une couleur à partir d'un code RGB.
Je vous serais reconnaissant si vous aviez un lien, ou une fonction à me communiquer parce que le wiki n'a pas l'air de traiter ça - c'est vrai qu'à mon avis c'est surtout moi qui ne l'ai pas trouvé - et je n'arrive pas du tout à m'en sortir avec la documentation... D'ailleurs ça m'énerves un peu de ne jamais réussir à comprendre les docs, je suis ultra dépendant des wiki et des tutoriaux. Il n'y a que sur MSDN que je suis à l'aise, sur tout le reste je nage complètement sans savoir où chercher.
Edit: Trouvé sur ce forum, seul endroit où je n'ai pas pensé à chercher:
Dernière modification par Joeyy (03-04-2013 18:03:12)
Hors ligne
ce n'est pas tout a fait la solutions
après ça dépend ou tu veut agir
le soucis la c'est que tu crée une ressource pour pas grand chose, et tu doit faire gaffe a bien décharger la texture quand tu n'en a plus besoin
soit tu agi sur le material du node
soit tu agi sur les vertices (qui modifieras aussi le rendue des nodes utilisant le même mesh)
quelque chose dans le style
ps: un mesh, un node
Hors ligne
Merci beaucoup!
Je n'utilise mes mesh qu'avec un seul node alors je pense que j'utiliserai plutôt la première solution, mais ça pourrait me servir dans l'avenir! Petite question: y a t-il une amélioration des performances en agissant directement sur les vertices ?
PS: Merci pour la correction grammaticale
Dernière modification par Joeyy (03-04-2013 18:56:59)
Hors ligne
Salut,
Que tu agisses sur les vertices ou sur le material n'a pas une forte incidence sur le framerate, simplement l'un est plus adapter par rapport à l'autre en fonction du type de rendu que tu mettras en place dans ton projet voilà tout .
Hors ligne
Pages: 1
Options | Liens officiels | Caractéristiques | Statistiques | Communauté |
---|---|---|---|---|
Corrections |
|
xhtml 1.0 css 2.1 Propulsé par FluxBB Traduit par FluxBB.fr |
882 membres 1429 sujets 11119 messages |
Dernier membre inscrit: LiseBuisson96 45 invités en ligne Aucun membre connecté RSS Feed |