#25 

17-10-2009 15:07:38

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

Je peux te fournir un cube en UV 1.0 format 3DS si tu veux.


Force et sagesse...

Hors ligne


#26 

17-10-2009 15:25:03

nico
Webmaster
Date d'inscription: 07-08-2009
Messages: 563
Corrections: 9

oui volontier, je ne sais pas ce que veut dire uv 1.0, mais j'espere que ça va résoudre mon problème wink merci tmyke.

Hors ligne


#27 

17-10-2009 17:08:12

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

J'ai mis une archive (cube.zip) sur le srveur, dans le repertoire  files.

Tu as deux cubes, d'une taille de 1, le premier à un UVMap de 1 (en d'autre termes la texture se répète une fois sur chaque face), et le second un UVMap de 2 (dans ce cas la texture se répète 4 fois par face).


Force et sagesse...

Hors ligne


#28 

17-10-2009 21:18:09

nico
Webmaster
Date d'inscription: 07-08-2009
Messages: 563
Corrections: 9

Merci, c'est cool, malheureusement j'ai toujours le même problème sad lorsque je change le texturemapping sur un cube, cela agit sur tous les autres cubes chargés à partir du fichier cube1.3ds

Hors ligne


#29 

18-10-2009 09:56:50

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

Comment multiplie tu tes cube sur ta scene, tu passe par un mesdh->clone(), ou tu passe à chaque fois par un Load ?


Force et sagesse...

Hors ligne


#30 

18-10-2009 15:00:55

nico
Webmaster
Date d'inscription: 07-08-2009
Messages: 563
Corrections: 9

bein je crée des ImeshSceneNode à partir du même modèle:

Code c++ :



IAnimatedMesh* modele=  directeurDeScene->getMesh("objets/cube2.3ds");

ImeshSceneNode* cube1 =directeurDeScene->addMeshSceneNode( modele);
ImeshSceneNode* cube2 =directeurDeScene->addMeshSceneNode( modele);

//ensuite un peu plus loin.....

directeurDeScene->getMeshManipulator()->makePlanarTextureMapping(cube2->getMesh(),0.5f);// cela agit sur tout les cubes


Voilà, je pense qu'il doit y avoir des alternatives, là j'ai fait au plus simple.
merci pour ton aide.

Hors ligne


#31 

18-10-2009 17:13:10

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

En fait, pour éviter ce genre de soucis je passerais par un clonage, avec clonage du IMesh. Cela devrait assigner à chacun de tes
cube son propre MeshBuffer....


Force et sagesse...

Hors ligne


#32 

18-10-2009 21:00:51

nico
Webmaster
Date d'inscription: 07-08-2009
Messages: 563
Corrections: 9

bein j'ai peur que ça gaspille des ressources, non ?
ne pourrait-on pas déclarer des coordonnée de textures pour chaque cube sans toucher au reste ?

Hors ligne


#33 

18-10-2009 21:32:15

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

Ben niveau ressource, tu as raison, même si un cube ne représente pas non plus d'énorme quantité de données.

Pour ce qui est des coordonnées de texture, elles sont liées au meshbuffer, donc si tu les change, cela se répercutera sur
tous les autres cube. A moins que quelqu'un ai une combine pour contourner ce problème...


Force et sagesse...

Hors ligne


#34 

18-10-2009 21:53:50

nico
Webmaster
Date d'inscription: 07-08-2009
Messages: 563
Corrections: 9

ok merci, bon il me reste plus qu'a trouver une combine wink

Hors ligne


#35 

19-10-2009 16:36:22

nico
Webmaster
Date d'inscription: 07-08-2009
Messages: 563
Corrections: 9

Salut tmyke, j'ai suivi ta procédure et non seulement ça résoud mon problème, mais en plus il est possible que je ne gaspille pas de ressources puisques il y a plusieurs façons de copier un IMesh.
cependant je ne comprend pas tout à fait ce qui se passe mais tu pourra sans doute m'éclairer.
voici ce que je trouvé dans la classe IMeshManipulator :

Code c++ :


virtual IMesh *  createMeshUniquePrimitives (IMesh *mesh) const =0
//  Creates a copy of a mesh with all vertices unwelded.

virtual IMesh *  createMeshWelded (IMesh *mesh, f32 tolerance=core::ROUNDING_ERROR_32) const =0
//  Creates a copy of a mesh with vertices welded.

virtual IMesh *  createMeshWith2TCoords (IMesh *mesh) const =0
//  Creates a copy of the mesh, which will only consist of S3DVertex2TCoord vertices.

virtual IMesh *  createMeshWithTangents (IMesh *mesh, bool recalculateNormals=false, bool smooth=false, bool angleWeighted=false) const =0
//  Creates a copy of the mesh, which will only consist of S3DVertexTangents vertices. 

Voilà j'ai choisi au pif createMeshWith2TCoords, cependant je ne comprend pas ce qui se passe en mémoire quand je fait
IMesh* cube1= directeurDeScene->getMeshManipulator()->createMeshWith2TCoords(modele->getMesh(0));
est-ce que il y toujours quelques pointeurs vers le modele ? ou alors ça alloue un nouvel espace pour stocker toutes les propopriété du nouvel IMesh ?
enfin en tout cas merci, ça faisait un moment que je bloquais quand même yikes

Aussinon pour en revenir à mon problème de départ pour faire répéter la texture au lieu qu'elle s'etire lors d'un scale, j'ai modifié encore une fois au pif wink la fonction makeplanartexturemapping
pour qu'elle prenne en paramètre le scale de mes mesh. mais j'ai un doute.

Code c++ :


void TextureMapping(scene::IMesh* mesh,int x,int y,int z, f32 resolution=0.01f)
{
    if (!mesh)
        return;

    const u32 bcount = mesh->getMeshBufferCount();

    for ( u32 b=0; b<bcount; ++b)
    {
        IMeshBuffer* buffer = mesh->getMeshBuffer(b);
        u32 idxcnt = buffer->getIndexCount();
        u16* idx = buffer->getIndices();

        for (u32 i=0; i<idxcnt; i+=3)
        {
            core::plane3df p(buffer->getPosition(idx[i+0]), buffer->getPosition(idx[i+1]), buffer->getPosition(idx[i+2]));
            p.Normal.X = fabsf(p.Normal.X)*x;
            p.Normal.Y = fabsf(p.Normal.Y)*y;
            p.Normal.Z = fabsf(p.Normal.Z)*z;

            // calculate planar mapping worldspace coordinates

            if (p.Normal.X > p.Normal.Y && p.Normal.X > p.Normal.Z)
            {
                for (u32 o=0; o!=3; ++o)
                {
                    buffer->getTCoords(idx[i+o]).X = buffer->getPosition(idx[i+o]).Y * resolution*y;
                    buffer->getTCoords(idx[i+o]).Y = buffer->getPosition(idx[i+o]).Z * resolution*z;
                }
            }
            else if (p.Normal.Y > p.Normal.X && p.Normal.Y > p.Normal.Z)
            {
                for (u32 o=0; o!=3; ++o)
                {
                    buffer->getTCoords(idx[i+o]).X = buffer->getPosition(idx[i+o]).X * resolution*x;
                    buffer->getTCoords(idx[i+o]).Y = buffer->getPosition(idx[i+o]).Z * resolution*z;
                }
            }
            else if (p.Normal.Z > p.Normal.X && p.Normal.Z > p.Normal.Y)
            {
                for (u32 o=0; o!=3; ++o)
                {

                    buffer->getTCoords(idx[i+o]).X = buffer->getPosition(idx[i+o]).X * resolution*x;
                    buffer->getTCoords(idx[i+o]).Y = buffer->getPosition(idx[i+o]).Y * resolution*y;
                }
            }

    }}

}

Voilà, c'est tellement couillon que je me dit qu'il doit y avoir une raison de cette absence de fonctionnalité, et donc j'ai peur de faire des bêtises. qu'en penses-tu ?

Hors ligne


#36 

19-10-2009 20:38:37

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

Il existe sous Irrlicht 3 types des vertex différents. Pour résumer tu as les meshbuffer constitués
de vertices simples (1 coordonnée de texture), de vertices à double coordonnées de textures et les
vertices avec les information de tangente et binormales.

La doc décrit cela mieu que moins wink

Dans ton cas, un createMeshWelded() devrait suffire.

est-ce que il y toujours quelques pointeurs vers le modele ? ou alors ça alloue un nouvel espace pour stocker toutes les propopriété du nouvel IMesh ?


deuxième solution...

Aussinon pour en revenir à mon problème de départ pour faire répéter la texture au lieu qu'elle s'etire lors d'un scale, j'ai modifié encore une fois au pif wink la fonction makeplanartexturemapping
pour qu'elle prenne en paramètre le scale de mes mesh. mais j'ai un doute.


Je dirais que cela doit le faire, car en fait tu te contente de moduler la donnée 'resolution' en fonction des valeurs des axes
qui tu fournis.


Force et sagesse...

Hors ligne


#37 

19-10-2009 20:58:48

nico
Webmaster
Date d'inscription: 07-08-2009
Messages: 563
Corrections: 9

merci pour les explications wink en effet welded fait l'affaire, je vais donc me basé sur ça. cool

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
882 membres
1429 sujets
11119 messages
Dernier membre inscrit: LiseBuisson96
70 invités en ligne
Aucun membre connecté
RSS Feed