Java3D : 2 shape3D dans un meme TG d'apparence differente

assuryan Messages postés 7 Date d'inscription jeudi 27 mai 2004 Statut Membre Dernière intervention 4 juin 2008 - 24 sept. 2005 à 23:13
assuryan Messages postés 7 Date d'inscription jeudi 27 mai 2004 Statut Membre Dernière intervention 4 juin 2008 - 27 sept. 2005 à 15:10
Bonjour,



voila mon probleme :

grace a un loadeur, je recupere les vertex d'un fichier 3DS.



pour toutes les scenes

Shape3D fleur = null;

Shape3D tige = null;

pour tous les meshes

//triangle array qui recupere un polygone du modele;

triangle = new TriangleArray(3, TriangleArray.COORDINATES);

si le materiaux dessus est une fleur

si la shape fleur est nulle


fleur = new Shape(triangle)

sinon


fleur.addGeometry((new
Shape3D(triangle)).getGeometry());

si le materiaux dessus est une tige

idem que pour la fleur

fin si

fin pour

Appearance appFlower = createApp2("LINE", "Flower");

Appearance appTige = createApp2("LINE", "Tige");

si fleurs != null

fleurs.setAppearance(appFlower);

TG.addChild(fleurs);

fin si

si tiges != null


tiges.setAppearance(appTige);


TG.addChild(tiges);

fin si

fin pour

objTrans.addChild(TG); //objTrans etant mon TG de ma scene.



Mon appaerance :

public Appearance createApp2(String str, String str2)

{

Appearance app = new Appearance();



Color3f objColor;

if (str2.equals("Flower"))

objColor = fleur;

else

objColor = tige; // 2 couleurs differentes

// Bla bla sur le mode FILL ou LINE

return app;

}



Voila, et ça ne marche pas quand je met des appearance different.

Si je met le meme :

fleurs.setAppearance(appFlower);

tige.setAppearance(appFlower);

ça marche avec la meme couleur.



Si quelqu'un pouvait m'aider tout en me pardonnant pour la coding style.



Merci d'avance.

4 réponses

dmaillet Messages postés 500 Date d'inscription mercredi 20 août 2003 Statut Membre Dernière intervention 11 juillet 2007
26 sept. 2005 à 08:50
tu dois avaoir ta couleur nulle, ou qqchose comme ca, car c'est sur tu peux mettre 2 apparences differentes!

Verifies si"tige" est non nulle, et si les 2 apparences en sorties sont non nulles...
0
assuryan Messages postés 7 Date d'inscription jeudi 27 mai 2004 Statut Membre Dernière intervention 4 juin 2008
27 sept. 2005 à 14:29
J'ai bien verifié qu'aucune de mes shape3D n'était nulle, ainsi que mes apparences et couleurs.

Je vais mettre le code de ma méthode car franchement, je ne vois rien,
je comprends pas. Si vous voyez quelque chose de douteux, faites m'en
part.

C'est donc un chargeur d'objet 3DS. Au debut, je changeais juste la
couleur du triangleArray que j'ajoutais a une Shape3D commune. Mais
j'aimerai séparer en 2 Shape3D auxquelle je pourraus mettre 2 apparence
diiferentes.

Voila le code (encore désolé, je ne sais pas si on peu, dans ce forum, faire appartaitre avec une coloration Java...)



public Loadeur_flowers(float X, float Y, float Z, TransformGroup objTrans)

{

Scene3ds scene = null;

Color3f color = tige;

x = X;

y = Y;

z = Z;



String file3 = "Modeles\\flowers.3DS";

try

{

scene = new Scene3ds(new FileInputStream(file3));

int totalFaces = 0;

for (int i = 0; i < scene.meshes(); i++)

{

Mesh3ds lvMesh = scene.mesh(i);

totalFaces += lvMesh.faces();

}



}

catch (Exception e)

{

System.out.println("Error : " + e);

e.printStackTrace();

}



Transform3D trans = new Transform3D();

trans.set(new Vector3d(X, Y, Z));



Transform3D rot = new Transform3D();

rot.rotX(Math.PI / 2);

trans.mul(rot);



TG = new TransformGroup(trans);

//TG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);



Appearance appFlower = createApp2("LINE", "Flower");

Appearance appTige = createApp2("LINE", "Tige");

System.out.println("Apparence1 :
" + appFlower); // affiche Apparence1 :
javax.media.j3d.Appearance@979f67

System.out.println("Apparence2 :
" + appTige); // affiche Apparence2 :
javax.media.j3d.Appearance@62610b



for (int i = 0; i < scene.meshes(); i++)

{

int w = 0;

Mesh3ds lvMesh = scene.mesh(i);



for (int j = 0; j < lvMesh.faces(); j++)

{

Face3ds lvFace = lvMesh.face(j);

Vertex3ds v0 = lvMesh.vertex(lvFace.P0);

Vertex3ds v1 = lvMesh.vertex(lvFace.P1);

Vertex3ds v2 = lvMesh.vertex(lvFace.P2);



TriangleArray triangle;

triangle = new TriangleArray(3,


TriangleArray.COORDINATES
/*|




TriangleArray.COLOR_3*/);

if (lvMesh.faceMats() > 0)

{


// Get colour of first
material.


Material3ds lvMat =
scene.material(lvMesh.faceMat(0).matIndex());




triangle.setCoordinate(0, new
Point3f(v0.X, v0.Y, v0.Z));


triangle.setCoordinate(1, new
Point3f(v1.X, v1.Y, v1.Z));


triangle.setCoordinate(2, new
Point3f(v2.X, v2.Y, v2.Z));


if
(lvMat.name().compareTo("Fleur") == 0)


if (fleurs ==
null)



fleurs = new Shape3D(triangle);

else



fleurs.addGeometry((new
Shape3D(triangle)).getGeometry());


else if
(lvMat.name().compareTo("Tige") == 0)


if (tiges ==
null)



tiges = new Shape3D(triangle);

else



tiges.addGeometry((new
Shape3D(triangle)).getGeometry());



}

}



}



System.out.println("ShapeFleur " + fleurs); // affiche ShapeFleur
javax.media.j3d.Shape3D@d12eea

System.out.println("ShapeTiges " + tiges); // affiche ShapeTiges
javax.media.j3d.Shape3D@15f157b

if (fleurs != null)

{

fleurs.setAppearance(appFlower);

TG.addChild(fleurs);

}

if (tiges != null)

{


tiges.setAppearance(appTige);


TG.addChild(tiges);

}





objTrans.addChild(TG);

}





Voila, et quand je compile ceci, plus rien ne s'affiche dans mon API et
je ne peux plus fermer la fenetre. Il faut que j'interrompt l'execution.

Par contre, comme deja dit, si lors de l'affectation de l'apparence aux
Shape3D "tiges" et "fleurs" je mets la meme apparence (l'une ou
l'autre) comme ceci :

fleurs.setAppearance(appFlower);

tiges.setAppearance(appFlower);

ou bien

fleurs.setAppearance(appTige);


tiges.setAppearance(appTige);

Tout fonctionne (bien sur, ma fleurs est de couleur uniforme)



Voila, si quelqu'un voit quelque chose, qu'il me fasse signe. J'avoue
que je perds espoir et ne comprends pas pourquoi ça ne marche pas.



Merci d'avance de votre aide.
0
dmaillet Messages postés 500 Date d'inscription mercredi 20 août 2003 Statut Membre Dernière intervention 11 juillet 2007
27 sept. 2005 à 14:47
Qu'entends tu par

"Voila, et quand je compile ceci, plus rien ne s'affiche dans mon API et
je ne peux plus fermer la fenetre. Il faut que j'interrompt l'execution."

Tu as une erreur de compile?

Qt tu dis erreur si 2 apparences, quelle est cette erreur exactement?

Ton code a premiere vue est bon, le souci vient d'ailleurs...
0
assuryan Messages postés 7 Date d'inscription jeudi 27 mai 2004 Statut Membre Dernière intervention 4 juin 2008
27 sept. 2005 à 15:10
Hé bien je lance l'application mais plus rien ne s'affiche alors que
normalement, un monde 3D devrait y etre, des elements tel que des
abeilles, fourmis...etc (projet d'intelligence artificielle sur les
sociétés d'insectes...).

Donc je n'ai aucune erreur de compilation, la fenetre bug tout
simplement : impossible de la fermer, pas de rafraichissement si je met
une fenetre par dessus et que je la re-affiche en premier plan...Etc.
La dalle est noire.



Pour remonter plus haut....voici mon code avec le TransformGroup, car a part de lui, je vois pas d'ou ça pourrai venir.

J'ai donc mon create scene :



BranchGroup createScene(SimpleUniverse u)

{

objRoot = new BranchGroup();



objTrans = new TransformGroup();

objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);

objTrans.setCapability( TransformGroup.ALLOW_TRANSFORM_READ );

objTrans.setCapability(TransformGroup.ALLOW_CHILDREN_EXTEND);

objTrans.setCapability(TransformGroup.ALLOW_BOUNDS_WRITE);

objTrans.setCapability(TransformGroup.ENABLE_PICK_REPORTING);

objRoot.addChild(objTrans);



// population d'insectes...etc

pop = new Population(this);



// C'est ici qu'est passé le TransformGroup pour la construction du monde en 3D.

// et que sera appellé le Loadeur 3DS

world = new LoadWorld(objTrans);



trans = new Transform3D();

trans.setRotation(new AxisAngle4d(-Math.PI/4, 0.0, 0.0, Math.PI/4)) ;

trans.setTranslation(new Vector3f(0f, 0f, -world.getSizeZ() * 2));

objTrans.setTransform(trans);



BoundingSphere bounds;

bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0),500.0);



// Set up the background

Color3f bgColor = new Color3f(0f, 0f, 0f);

Background bg = new Background(bgColor);

bg.setApplicationBounds(bounds);

objRoot.addChild(bg);



MouseRotate behavior = new MouseRotate(objTrans);

objTrans.addChild(behavior);



MouseBehavior translate = new MouseTranslate(objTrans);

translate.setSchedulingBounds(bounds);

objTrans.addChild(translate);



behavior.setSchedulingBounds(bounds);

MouseZoom behavior2 = new MouseZoom(objTrans);

objTrans.addChild(behavior2);

behavior2.setSchedulingBounds(bounds);



keys = new KeyInputHandler(this, pop);

objRoot.addChild(keys);



objRoot.compile();

return objRoot;

}





La classe LoadWorld :

public LoadWorld(TransformGroup ObjTrans)

{



// creation du monde 3D...

blabla bla... je passe les details et nombreuse lignes de code.



// j'appelle une classe qui va s'occuper de construire toutes les fleurs

// dans le "this", je peux avoir acces a ce TransformGroup objTrans

flowers = new CreateFlowers(this);

}



Je pense que le plus important est la methode createScene. C'est pour
cela que je ne detail pas la suite. Tout ce que je fais, c'est que
toutes mes Shape3D, je les mets dans ce "objTrans". Peut etre faut-il
ajouter une Capability ou autre.



Pour en revenir a mon "erreur", je pense que ça vient d'une
"incomprehension" de la part de Java3D qui ne sait plus ce qu'il doit
faire de ses Noeuds. Dit comme ça, ça fait un peu naîf, mais c'est
l'impression que ça me donne. Seulement, ce qui me derange c'est que
avec les memes Apparence, tout "fonctionne", 2 differentes, plus rien
ne marche.

Si tu a une suggestion..merci d'avance et merci de ton aide.
0
Rejoignez-nous