#0 

15-03-2010 21:51:31

narugohan
Abonné
Date d'inscription: 24-03-2009
Messages: 113

Bonjour à tous( ou plutôt bonsoir ),
Je suis entrain d'essayé de faire des scales sur des bones en m'entrainant sur le ninja d'irrlicht. Lui faire un scale complet, sa j'y arrive, mais par contre, se que j'ai voulu faire, c'était fais un scale à bone.
J'ai crée un nœud au joint 17( c'est le bone de la mains. j'ai essayer ensuite de lui faire un scale de 2 partout, et ensuite un scale de 10 partout, mais rien n'a changé, donc je voudrai savoir si c'est possible de faire des scale sur des bones ???

mon code pour que vous voyez au cas il y ai une erreur

Code:

#include <cstdlib>
#include <iostream>
#include <irr/irrlicht.h>

using namespace std;

using namespace irr;

using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;

int main(void)
{
    irr::IrrlichtDevice* device = irr::createDevice( irr::video::EDT_OPENGL, irr::core::dimension2d<irr::u32>(640,480), 32);
    irr::video::IVideoDriver* driver = device->getVideoDriver ();
    irr::scene::ISceneManager *sceneManager = device->getSceneManager ();
 

    
    irr::scene::IAnimatedMeshSceneNode* ninja = sceneManager->addAnimatedMeshSceneNode(sceneManager->getMesh("ninja.b3d"));// creation du noeud
    ninja->setMaterialTexture(0, driver->getTexture("nskinbl.jpg"));
    ninja->setMaterialFlag(EMF_LIGHTING, false);
    ninja->setFrameLoop(1,1);
    
    irr::scene::IAnimatedMeshSceneNode* ninja2 = sceneManager->addAnimatedMeshSceneNode(sceneManager->getMesh("ninja.b3d"));// creation du noeud
    ninja2->setMaterialTexture(0, driver->getTexture("nskinrd.jpg"));
    ninja2->setFrameLoop(1,1);
    ninja2->setPosition( vector3df(10,0,0) );
    ninja2->setMaterialFlag(EMF_LIGHTING, false);
    
    ISceneNode* main = ninja2->getXJointNode("Joint17");
    main->setScale( vector3df(10,10,10) );
 
    ninja->setMaterialFlag(irr::video::EMF_BACK_FACE_CULLING, false);
    ninja2->setMaterialFlag(irr::video::EMF_BACK_FACE_CULLING, false);
    
    irr::scene::ICameraSceneNode *cam = sceneManager->addCameraSceneNodeFPS(0,100.0f,0.01f);
 
    while(device->run ())                                             // boucle de rendu
    {
      driver->beginScene(true, true, irr::video::SColor (0,120,120,120));
      sceneManager->drawAll ();
      
      driver->endScene ();
    }
    device->drop ();
    return 0;
}

je vous remercie d'avance pour vos réponse

Hors ligne


#1 

15-03-2010 23:23:30

nabouill
Abonné
Date d'inscription: 17-09-2009
Messages: 242
Corrections: 1

Je ne suis pas une bête en modèle 3D mais il me semble que un joint n'est enfaite que une articulation, un point qui relie 2 os du squellette, mais il n'est pas visible, donc tu peut bien essayer de le grossir tant que tu veut ça ne changera rien du tout.
En espérant que je ne tes pas dit une connerie. Si quelqu'un peut préciser, bien a lui


mes sites: www.manga-vf.fr et www.series-vf.fr

Hors ligne


#2 

15-03-2010 23:34:57

jonath313
Abonné
Date d'inscription: 28-12-2009
Messages: 240

parfaitement nabouill c'est exactement çà, sachant qu'un joint est un point donc aucune coordonnée en X Y  Z sa dimention de sera jamis changé. cependant un simple scale du modéle 3d lui même met les bones ainsi que le maillage automatiquement à la même échelle après si tu veu modifier les dimention d'un bone tu risque d'avoir un gros souci car il sortira de son enveloppe initiale et ducoup le maillage ne suivra pas correctement  mais je ne pense pas que cela est réalisable je ne sais pas.

Hors ligne


#3 

16-03-2010 07:43:45

narugohan
Abonné
Date d'inscription: 24-03-2009
Messages: 113

bah, se que je voudrai sa serai de pouvoir scale juste une partie du corps du ninja, car j'essaye de faire un éditeur de personnage, et donc il faudrait que le joueur puisse modifié un peux les partie du corps si possible. Quelqu'un a une idée comment faire ???
J'ai aussi une deuxieme question. Est t'il possible d'affiché une deuxieme texture sur lui ??? je m'explique. Pour tester, j'ai retravaillé l'image sous photoshop en ajoutant des lunettes au niveau de c'est yeux( c'est tout bête me direz-vous ), j'ai enlevé toute l'image sauf les lunettes, donc il reste plus que les lunettes, le tour ensuite est transparent, et se que je voudrai sa serai de pouvoir mettre la premier texture, celle de l'habit, et ensuite lui mettre une deuxieme texture, celle des lunettes par dessus en transparence pour que je puisse lui mette en gros des accessoires, sans etre obligé de rajouté des mesh, vous m'avez compris ???

je vous remercie d'avance pour vos réponse


ps : merci pour votre rapidité de réponse

Dernière modification par narugohan (16-03-2010 10:50:50)

Hors ligne


#4 

16-03-2010 15:05:29

Ilovechocolat
Abonné
Date d'inscription: 07-10-2009
Messages: 125

Pour les textures :

Code c++ :

node->setMaterialTexture(0, driver->getTexture("../../media/stones.jpg"));
node->setMaterialTexture(1, driver->getTexture("../../media/water.jpg"));



Pour ton histoire de scale, il faudrait le faire sur la partie du bras affecté par le joint, je vais aller faire un tour sur la doc pour voir ce que je peut faire .

[EDIT] J'ai rien trouvé, mais on pourrait suposer que tout les éléments que le bones contient sont déclaré comme enfants de ce même node, par contre j'ai du mal a vérifier car la méthode getChildren revoie un irr::core::list<T> et j'ai jamais réussit a manipuler cette class .

Dernière modification par Ilovechocolat (16-03-2010 15:37:17)

Hors ligne


#5 

16-03-2010 18:49:44

narugohan
Abonné
Date d'inscription: 24-03-2009
Messages: 113

alors pour les textures j'avais déjà essayer, donc j'ai réessayer et... rien -_-, sa m'affiche tjrs la texture qui est avec le chiffre 0. Je comprend pas, et j'aimerai bien savoir car sa me sera d'une grande utilité pour rajouté de la pilosité ou des tatouage par exemple :p

Hors ligne


#6 

16-03-2010 22:01:15

Ilovechocolat
Abonné
Date d'inscription: 07-10-2009
Messages: 125

essais d'ajouter ce material a ton node :

Code c++ :

node->setMaterialType(video::EMT_REFLECTION_2_LAYER);


Sinon je te proposerais bien la modification pixel par pixel mais c'est un peut extrême pour un truc si simple, je vais te faire une chtite fonction bien pratique (mais qui risque de faire mal au CPU), disons que je devrais avoir fini demain soir au plus tard (si j'ai vraiment pas le temps).

Dernière modification par Ilovechocolat (16-03-2010 22:04:01)

Hors ligne


#7 

16-03-2010 22:50:19

narugohan
Abonné
Date d'inscription: 24-03-2009
Messages: 113

alors je vois les deux texture par contre... la deuxieme est assez drole mdr, elle est réfléchie a moitié, donc en gros elle la texture et mal appliqué mdr, mais au moins je voi les deux texture mdr

Hors ligne


#8 

17-03-2010 00:37:45

jonath313
Abonné
Date d'inscription: 28-12-2009
Messages: 240

et bin si le model 3d est skinné pour une texture en particulier apré c'est a toi de pinaillé pour en poser une deusiéme a l'aveuglette ou sinon çà se fait avec des shaders non ? j'y connait pas grand chose mais bon courage a toi car le mieu serait d'avoir un graphiste qui sait texturer avec toi histoire de jouer sur le changement de la texture complete plutôt que rajouter un élément par dessus celle qui est déjà. Du style prendre le skin garder loriginal , si tu clique sur ajouter lunettes tu applique l'autre texture qui est la même avec les lunettes à la place de celle par defaut. Aprés si tu veu changer plin d'éléments il faudra créer plin de textures faisant intervenir tout les cas possibles, c'est simple à coder mais long --> utilisation d'un petit switch mais niveau graphisme çà te demande pas grand chose, juste une petite retouche d'image skin via photoshop ou paint pour les naze en graphisme mais il faut tout de même être précis car un skin c'est plins de coordonnées de textures donc si tu dépasse rien que d'un pixel tu fait des lunnettes trop large et hop tu retrouve le coté de ta monture dériére la tête ou sur les oreil.

Après libre a toi de tester différentes technique, si tu peut faire un truc en limitant le maximum de code je pense que c'est mieu... à voir

...mais quand on peut pas faire comme çà on peut surement faire autrement.

Hors ligne


#9 

17-03-2010 13:02:13

narugohan
Abonné
Date d'inscription: 24-03-2009
Messages: 113

nn mais voilà le problème c'est la galère, si je fais plusieurs couleur de peau, ensuite des accessoires( montres lunette etc ), pilosité, tatouage, etc...
Je veux pas dire, mais j'aurai pas finit mdr, et en principe c'est possible d'après se que j'ai vu

Hors ligne


#10 

17-03-2010 13:18:00

Ilovechocolat
Abonné
Date d'inscription: 07-10-2009
Messages: 125

Voila j'ai fini, voici la code d'une fonction qui superpose deux images, l'image doit avoir un canal alpha a 100% pour que ce soit pris en compte :

Code c++ :

irr::video::ITexture* superposerImageSurTexture(irr::video::IVideoDriver* driver, irr::video::ITexture* texture, char* image)
{
    irr::video::IImage* imageConteneur = driver->createImage(texture, irr::core::position2d<irr::s32>(0,0), texture->getSize());
    irr::video::ITexture* texture2 = driver->getTexture(image);
    irr::video::IImage* imageContenueSup = driver->createImage(texture2, irr::core::position2d<irr::s32>(0,0), texture->getSize());
    for(int x = 0; x < texture->getSize().Width; x++)
    {
        for(int y = 0; y < texture->getSize().Height; y++)
        {
            irr::video::SColor pixel1 = imageConteneur->getPixel(x, y);
            irr::video::SColor pixel2 = imageContenueSup->getPixel(x, y);
            if(pixel2.getAlpha() != 0)
                imageConteneur->setPixel(x, y, imageContenueSup->getPixel(x, y));
        }
    }
    return driver->addTexture("../../media/stones.jpg", imageConteneur);
}



Utilise le comme ça :
       

Code c++ :

irr::video::ITexture* texture = driver->getTexture("../../media/stones.jpg");
        node->setMaterialTexture(0, superposerImageSurTexture(driver, texture, "../../media/water.jpg"));

Dernière modification par Ilovechocolat (17-03-2010 13:18:50)

Hors ligne


#11 

17-03-2010 14:47:57

narugohan
Abonné
Date d'inscription: 24-03-2009
Messages: 113

bon eh bah merci ILovechocolat, tu es vraiment un chef, sa m'aide enormement cette méthode, enfin mais lunette sont sur le perso lol, c'est vrai que c'est pas une mauvaise idée se que tu fais, mais j'aurai pensé que le moteur pouvais comme superposé des textures, mais bon apperement... nn mdr
Encore un grand merci a toi, c'est vraiment une bonne communeauté ici.

PS : ILovechocolat, je me permet de te demandé si tu es d'accord que je modifie ta fonction un peu, car pour le momant elle ne prend que 2 texture, je v'est la modifié pour qu'elle puisse prendre plusieurs texture, sa ne te dérange pas ?( on sais jamais :p )

EDIT : bon j'ai modifié le code tout à l'heure, donc je le met en ligne si sa peut aider certaine personne :

La fonction :

Code c++ :


irr::video::ITexture* textureSuperpose(irr::video::IVideoDriver* driver, int nbxTexture, char* image[])
{   
    irr::video::ITexture* texture[nbxTexture];
    irr::video::IImage* imageContenueSup[nbxTexture-1];
   
    for( int i=0; i<nbxTexture; i++)
         texture[i] = driver->getTexture(image[i]);
   
    irr::video::IImage* imageConteneur = driver->createImage(texture[0], irr::core::position2d<irr::s32>(0,0), texture[0]->getSize());

    for( int i=0; i<nbxTexture-1; i++)
         imageContenueSup[i] = driver->createImage(texture[i+1], irr::core::position2d<irr::s32>(0,0), texture[0]->getSize());

    for(int x = 0; x < texture[0]->getSize().Width; x++)
    {
        for(int y = 0; y < texture[0]->getSize().Height; y++)
        {
            irr::video::SColor pixel = imageConteneur->getPixel(x, y);
            irr::video::SColor pixelCont[nbxTexture-1];
           
            for( int i=0; i<nbxTexture-1; i++)
            {
                 pixelCont[i] = imageContenueSup[i]->getPixel(x, y);
                 if( pixelCont[i].getAlpha() != 0 )
                     imageConteneur->setPixel(x, y, imageContenueSup[i]->getPixel(x, y));
            }
           
        }
    }
    return driver->addTexture("../../media/stones.jpg", imageConteneur);
}



Utilisation de la fonction :

Code c++ :


char* cheminTexture[2];
      cheminTexture[0] = "../../media/stones.jpg";
      cheminTexture[1] = "../../media/water.jpg";
      cheminTexture[2] = "__3D_view_texture__";
node->setMaterialTexture(0, textureSuperpose( driver, 3, cheminTexture));



Voilà, en espérent que sa aidera certaine personne ;p

Dernière modification par narugohan (17-03-2010 18:47:46)

Hors ligne


#12 

17-03-2010 19:19:05

Ilovechocolat
Abonné
Date d'inscription: 07-10-2009
Messages: 125

Bien sur que cela ne me dérange pas que tu modifie / réécrive ma fonction (a la limite je suis même plutôt pour comme ça tu la comprend), je l'ai faites pour t'aider donc fais en ce que tu veut .

Tu pouvais aussi utiliser ma fonction a la chaine, ça marche aussi .
Tu peut par exemple faire un truc du genre :

Code c++ :


//ma fonction qui n'a toujours pas bougé
irr::video::ITexture* superposerImageSurTexture(irr::video::IVideoDriver* driver, irr::video::ITexture* texture, char* image)
{
    irr::video::IImage* imageConteneur = driver->createImage(texture, irr::core::position2d<irr::s32>(0,0), texture->getSize());
    irr::video::ITexture* texture2 = driver->getTexture(image);
    irr::video::IImage* imageContenueSup = driver->createImage(texture2, irr::core::position2d<irr::s32>(0,0), texture->getSize());
    for(int x = 0; x < texture->getSize().Width; x++)
    {
        for(int y = 0; y < texture->getSize().Height; y++)
        {
            irr::video::SColor pixel1 = imageConteneur->getPixel(x, y);
            irr::video::SColor pixel2 = imageContenueSup->getPixel(x, y);
            if(pixel2.getAlpha() != 0)
                imageConteneur->setPixel(x, y, imageContenueSup->getPixel(x, y));
        }
    }
    return driver->addTexture("../../media/stones.jpg", imageConteneur);
}

//Ta fonction que je créé a partir de la mienne
irr::video::ITexture* textureSuperpose(irr::video::IVideoDriver* driver, int nbxTexture, char* image[])
{
    irr::video::ITexture* texture = driver->getTexture(image[0]);
    for(int i = 1; i < nbxTexture; i++)
    {
        texture = superposerImageSurTexture(driver, texture, image[i]);
    }
    return texture;
}

Dernière modification par Ilovechocolat (17-03-2010 19:29:46)

Hors ligne


#13 

17-03-2010 23:10:11

narugohan
Abonné
Date d'inscription: 24-03-2009
Messages: 113

Oui aussi, c'est vrai que j'y avais pas penser, mais c'est pareil^^ bien joué
Bon bah, tous se qui veulent faire une superposition de texture, allais-y vous avez le choix, voilà 2 fonction qui font exactement la même chose lol, a vous de choisir xD

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
881 membres
1427 sujets
11117 messages
Dernier membre inscrit: Bidule
18 invités en ligne
Aucun membre connecté
RSS Feed