Pages: 1 2
- Accueil forums
- » Textures/Images
- » texture qui se deforme lors d'un scale du mesh.
17-10-2009 13:07:38
- tmyke
- Administrateurs

- Date d'inscription:
- Messages: 1025
- IP: 92.130.13.81
- Courriel
Je peux te fournir un cube en UV 1.0 format 3DS si tu veux.
Force et sagesse...
Hors ligne
17-10-2009 13:25:03
- nico
- Administrateurs

- Date d'inscription:
- Messages: 563
- IP: 82.232.128.163
- Courriel
oui volontier, je ne sais pas ce que veut dire uv 1.0, mais j'espere que ça va résoudre mon problème
merci tmyke.
Hors ligne
17-10-2009 15:08:12
- tmyke
- Administrateurs

- Date d'inscription:
- Messages: 1025
- IP: 92.130.13.81
- Courriel
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
17-10-2009 19:18:09
- nico
- Administrateurs

- Date d'inscription:
- Messages: 563
- IP: 82.232.128.163
- Courriel
Merci, c'est cool, malheureusement j'ai toujours le même problème
lorsque je change le texturemapping sur un cube, cela agit sur tous les autres cubes chargés à partir du fichier cube1.3ds
Hors ligne
18-10-2009 07:56:50
- tmyke
- Administrateurs

- Date d'inscription:
- Messages: 1025
- IP: 81.51.158.240
- Courriel
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
18-10-2009 13:00:55
- nico
- Administrateurs

- Date d'inscription:
- Messages: 563
- IP: 82.232.128.163
- Courriel
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
18-10-2009 15:13:10
- tmyke
- Administrateurs

- Date d'inscription:
- Messages: 1025
- IP: 81.51.158.240
- Courriel
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
18-10-2009 19:00:51
- nico
- Administrateurs

- Date d'inscription:
- Messages: 563
- IP: 82.232.128.163
- Courriel
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
18-10-2009 19:32:15
- tmyke
- Administrateurs

- Date d'inscription:
- Messages: 1025
- IP: 81.51.158.240
- Courriel
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
18-10-2009 19:53:50
- nico
- Administrateurs

- Date d'inscription:
- Messages: 563
- IP: 82.232.128.163
- Courriel
ok merci, bon il me reste plus qu'a trouver une combine ![]()
Hors ligne
19-10-2009 14:36:22
- nico
- Administrateurs

- Date d'inscription:
- Messages: 563
- IP: 82.232.128.163
- Courriel
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.
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
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
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;
}
}
}}
}
Hors ligne
19-10-2009 18:38:37
- tmyke
- Administrateurs

- Date d'inscription:
- Messages: 1025
- IP: 90.56.20.185
- Courriel
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 ![]()
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
19-10-2009 18:58:48
- nico
- Administrateurs

- Date d'inscription:
- Messages: 563
- IP: 82.232.128.163
- Courriel
merci pour les explications
en effet welded fait l'affaire, je vais donc me basé sur ça. ![]()
Hors ligne



