#1 

17-10-2009 13:07:38

tmyke
Administrateurs
Avatar de tmyke
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


#2 

17-10-2009 13:25:03

nico
Administrateurs
Avatar de nico
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 wink merci tmyke.


Hors ligne


#3 

17-10-2009 15:08:12

tmyke
Administrateurs
Avatar de tmyke
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


#4 

17-10-2009 19:18:09

nico
Administrateurs
Avatar de nico
Date d'inscription:
Messages: 563
IP: 82.232.128.163
Courriel

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


#5 

18-10-2009 07:56:50

tmyke
Administrateurs
Avatar de tmyke
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


#6 

18-10-2009 13:00:55

nico
Administrateurs
Avatar de nico
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


#7 

18-10-2009 15:13:10

tmyke
Administrateurs
Avatar de tmyke
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


#8 

18-10-2009 19:00:51

nico
Administrateurs
Avatar de nico
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


#9 

18-10-2009 19:32:15

tmyke
Administrateurs
Avatar de tmyke
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


#10 

18-10-2009 19:53:50

nico
Administrateurs
Avatar de nico
Date d'inscription:
Messages: 563
IP: 82.232.128.163
Courriel

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


Hors ligne


#11 

19-10-2009 14:36:22

nico
Administrateurs
Avatar de nico
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.  

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


#12 

19-10-2009 18:38:37

tmyke
Administrateurs
Avatar de tmyke
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 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


#13 

19-10-2009 18:58:48

nico
Administrateurs
Avatar de nico
Date d'inscription:
Messages: 563
IP: 82.232.128.163
Courriel

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é
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
139 invités en ligne
membre en ligne: -
RSS Feed