#0 

01-04-2013 10:36:40

Joeyy
Membre
Date d'inscription: 01-04-2013
Messages: 13

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


#1 

01-04-2013 10:52:13

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

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'


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 

01-04-2013 12:31:16

Joeyy
Membre
Date d'inscription: 01-04-2013
Messages: 13

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 ? smile

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 big_smile

Dernière modification par Joeyy (01-04-2013 12:41:42)

Hors ligne


#3 

01-04-2013 14:09:04

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

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


#4 

01-04-2013 14:34:28

Joeyy
Membre
Date d'inscription: 01-04-2013
Messages: 13

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 wink

-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 hmm

Dernière modification par Joeyy (01-04-2013 14:38:11)

Hors ligne


#5 

01-04-2013 15:26:28

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

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

http://t1.gstatic.com/images?q=tbn:ANd9GcTJyKcLvgPSrO5MvoWDFza7QJWbXZ2xvhOzUW5OXaZ1OwGcHhY_xg
http://t0.gstatic.com/images?q=tbn:ANd9GcTSip1mzMjCMSnzrZqPNwcMh0Y48lrVjo2a3XGvJ3HaQXrUIoi2

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


#6 

01-04-2013 16:08:33

Joeyy
Membre
Date d'inscription: 01-04-2013
Messages: 13

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 smile

Merci beaucoup!!

Dernière modification par Joeyy (01-04-2013 16:13:25)

Hors ligne


#7 

02-04-2013 08:56:08

Joeyy
Membre
Date d'inscription: 01-04-2013
Messages: 13

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.

http://hfr-rehost.net/self/de802b48c5ea57a0dd172ecc2316bfe251e8aca9.png
http://hfr-rehost.net/self/42661d103b9cbe6eab01a7a6d5e891131fbca332.png

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):

Code c++ :


IrrlichtDevice device = IrrlichtDevice.CreateDevice(DriverType.Direct3D9, new Dimension2Di(640, 480));
            VideoDriver driver = device.VideoDriver;
            SceneManager smgr = device.SceneManager;

            AnimatedMesh mesh1 = smgr.GetMesh("../../media/TT_A.3ds");
            AnimatedMesh mesh2 = smgr.GetMesh("../../media/STRUCTURE.3ds");
            AnimatedMesh mesh3 = smgr.GetMesh("../../media/PIGNON_A.3ds");
           
            SceneNode node1 = null;
            SceneNode node2 = null;
            SceneNode node3 = null;

            node1 = smgr.AddMeshSceneNode(mesh1.GetMesh(0));
            node2 = smgr.AddMeshSceneNode(mesh2.GetMesh(0));
            node3 = smgr.AddMeshSceneNode(mesh3.GetMesh(0));
           
            node1.Position.Set(new Vector3Df(0, 0, 0));
            node2.Position.Set(new Vector3Df(0, 0, 0));
            node3.Position.Set(new Vector3Df(0, 0, 0));

            node1.SetMaterialTexture(0, driver.GetTexture("../../media/BOIS_FONCE.png"));
            node1.SetMaterialType(MaterialType.Solid);

            node2.SetMaterialTexture(0, driver.GetTexture("../../media/rockwall.jpg"));
            node2.SetMaterialType(MaterialType.Solid);

            node3.SetMaterialTexture(0, driver.GetTexture("../../media/stones.jpg"));
            node3.SetMaterialType(MaterialType.Solid);
               

            smgr.AmbientLight.Set(1,1,1);
            LightSceneNode light = smgr.AddLightSceneNode(null, new Vector3Df(0, 400, -200), new Colorf(1f, 1f, 1f),100f);
            node1.SetMaterialFlag(MaterialFlag.Lighting, false);
            node2.SetMaterialFlag(MaterialFlag.Lighting, false);
            node3.SetMaterialFlag(MaterialFlag.Lighting, false);

            smgr.AddCameraSceneNodeFPS(null, 4f,0.02f);
            device.CursorControl.Visible = false;



Je ne vois pas trop à quoi cela peut être dû hmm
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


#8 

02-04-2013 09:33:15

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

essaye

Code c++ :


node->setMaterialFlag(EMF_FRONT_FACE_CULLING,false);
node->setMaterialFlag(EMF_BACK_FACE_CULLING,false);



le fait de positionner plusieurs obj en même endroit ne peut engendré ce genre de doucis wink
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


#9 

02-04-2013 10:06:49

Joeyy
Membre
Date d'inscription: 01-04-2013
Messages: 13

Ç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 wink

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


#10 

02-04-2013 11:15:49

Joeyy
Membre
Date d'inscription: 01-04-2013
Messages: 13

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 hmm

Dernière modification par Joeyy (02-04-2013 11:18:15)

Hors ligne


#11 

02-04-2013 11:18:40

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

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 :

Code c++ :



// charge le mesh
IMesh* mon_mesh = smgr->getMesh("../../media/TT_A.3ds");

// set les VBO pour tous les meshbuffers du mesh
for(u32 a=0; a < mon_mesh->getMeshBufferCount(); a++)
{
    // recupère le mesh buffer courant
    IMeshBuffer* buffer = mon_mesh->getMeshBuffer(a);
    // active les VBO en statique
    buffer->setHardwareMappingHint(EHM_STATIC, EBT_VERTEX_AND_INDEX);
}



Sinon faire :

Code c++ :


// vérifie que la carte graphique accepte les VBO
bool useVBO = driver->queryFeature(EVDF_VERTEX_BUFFER_OBJECT);

// set le minimum de triangles que doit avoir un meshbuffer pour etre mis en VRAM
driver->setMinHardwareBufferVertexCount(2);

// charge le mesh => Si le mesh comporte plus que la limite de vertices, il sera chargé en VRAM
IMesh* mon_mesh = smgr->getMesh("../../media/TT_A.3ds");


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


#12 

02-04-2013 13:52:35

Joeyy
Membre
Date d'inscription: 01-04-2013
Messages: 13

Merci beaucoup pour ta méthode que j'ai implémentée smile
Apparement la carte graphique - disons plutot le chipset graphique big_smile - 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...

http://hfr-rehost.net/self/24e747657c2c636bc0d5a9b5517cdf55be1d3cc5.png

http://hfr-rehost.net/self/498c0bbcc51931f119efdab874161caaf00d86b8.png

Dernière modification par Joeyy (02-04-2013 13:55:56)

Hors ligne


#13 

02-04-2013 14:17:47

Joeyy
Membre
Date d'inscription: 01-04-2013
Messages: 13

Au temps pour moi!!
Je prenais les mauvaises dll big_smile
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


#14 

03-04-2013 15:53:29

Joeyy
Membre
Date d'inscription: 01-04-2013
Messages: 13

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:

Code c++ :

IImage *tmp = videodriver->createImage (ECF_R5G6B5,core::dimension2d<s32>(1,1));
    tmp->setPixel (1,1,SColor(255,0,128,128));
    cube->setMaterialTexture(0,videodriver->addTexture("../../media/TT_A.3ds",tmp));

Dernière modification par Joeyy (03-04-2013 18:03:12)

Hors ligne


#15 

03-04-2013 17:54:07

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

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

Code c++ :


for(unsigned int i = 0; i<node->getMaterialCount(); ++i)
{
    node->getMaterial(i).EmissiveColor= irr::video::SColor(255,0,128,128);
    node->getMaterial(i).DiffuseColor = irr::video::SColor(255,0,128,128);
}


soit tu agi sur les vertices (qui modifieras aussi le rendue des nodes utilisant le même mesh)

Code c++ :


//node is an instance of ImeshSceneNode*
irr::scene::IMesh *mesh = node->getMesh();
for(unsigned int i = 0; i<mesh->getMeshBufferCount(); ++i)
{
    irr::scene::IMeshBuffer *buffer = mesh->getMeshBuffer(i);
    switch(buffer->getVertexType)
    {
        case irr::video::EVT_STANDAR:
            irr::video::S3DVertex *vertices = (irr::video::S3DVertex*)buffer->getVertices();
            for(unsigned int j = 0; j<getVertexCount(); ++j)
                vertices[j].Color = irr::video::SColor(255,0,128,128);
        break;
        case irr::video::EVT_TANGENTS:
            irr::video::S3DVertexTangents *vertices = (irr::video::S3DVertexTangents*)buffer->getVertices();
            for(unsigned int j = 0; j<getVertexCount(); ++j)
                vertices[j].Color = irr::video::SColor(255,0,128,128);
        break;
        default:
            irr::video::S3DVertex2TCoords *vertices = (irr::video::S3DVertex2TCoords*)buffer->getVertices();
            for(unsigned int j = 0; j<getVertexCount(); ++j)
                vertices[j].Color = irr::video::SColor(255,0,128,128);
        break;
    }
}



quelque chose dans le style wink

ps: un mesh, un node

Hors ligne


#16 

03-04-2013 18:53:37

Joeyy
Membre
Date d'inscription: 01-04-2013
Messages: 13

Merci beaucoup! smile
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 wink

Dernière modification par Joeyy (03-04-2013 18:56:59)

Hors ligne


#17 

03-04-2013 20:40:57

Copland
Modérateur
Lieu: ZarbiLand
Date d'inscription: 22-09-2006
Messages: 657
Site web

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 smile.


Config : I5 2400, ATI HD6870 1Go DDR5, 4Go DDR3.
Single Boot : Windows Seven.

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
Analysé par
872 membres
1422 sujets
11104 messages
Dernier membre inscrit: Glider
19 invités en ligne
Aucun membre connecté
RSS Feed