OVH Cloud OVH Cloud

[Java3D] Chevauchement d'objets

15 réponses
Avatar
Cedric.Olmanst
Bonjour,

je suppose que ce probl=E8me est connu, mais je n'ai trouv=E9 aucun sujet
qui en parle ici. En fait, je dessine plusieurs formes (des Box pour
faire un graphique). Le probl=E8me que je rencontre est que certaines de
celles qui doivent =EAtre derri=E8res sont affich=E9es devant, ce qui fait
un rendu tr=E8s bizarre et compl=E8tement surr=E9aliste.

A chaque lancement de mon application, c'est d'autres formes qui sont
concern=E9es. On dirait que Java3D fait le rendu des =E9l=E9ments dans un
ordre al=E9atoire, et pas dans l'ordre dans lequel j'ai mis mes
instructions. Mais le probl=E8me peut venir d'ailleurs, vous le savez
certainement mieux que moi.

Est-ce que vous avez d=E9j=E0 rencontr=E9 =E7a ? Savez-vous comment
r=E9soudre ce probl=E8me ?

Merci d'avance pour vos r=E9ponses.

10 réponses

1 2
Avatar
Ploc
wrote:
Bonjour,

je suppose que ce problème est connu, mais je n'ai trouvé aucun sujet
qui en parle ici. En fait, je dessine plusieurs formes (des Box pour
faire un graphique). Le problème que je rencontre est que certaines de
celles qui doivent être derrières sont affichées devant, ce qui fait
un rendu très bizarre et complètement surréaliste.

A chaque lancement de mon application, c'est d'autres formes qui sont
concernées. On dirait que Java3D fait le rendu des éléments dans un
ordre aléatoire, et pas dans l'ordre dans lequel j'ai mis mes
instructions. Mais le problème peut venir d'ailleurs, vous le savez
certainement mieux que moi.

Est-ce que vous avez déjà rencontré ça ? Savez-vous comment
résoudre ce problème ?

Merci d'avance pour vos réponses.



Probablement un probleme de culling: il y'a des optimisations qui font
que seules la partie visible des polygones (le "devant") est tracee. Ca
peut etre modifie en changeant
- le "devant" du polygone (on est "devant" si les points entres sont
dans le sens inverse des aiguilles d'une montre).
- ou le parametre de culling (voir CULLING_NONE dans la doc).

Avatar
Ploc
Ploc wrote:

- ou le parametre de culling (voir CULLING_NONE dans la doc).


oups! C'est pas CULLING_NONE, mais CULL_NONE (classe PolygonAttributes).

Avatar
Cedric.Olmanst
Ploc wrote:
- ou le parametre de culling (voir CULLING_NONE dans la doc).


oups! C'est pas CULLING_NONE, mais CULL_NONE (classe PolygonAttributes).


Hmmmm le problème ne vient pas de là, je pense. Déjà parce qu'à
chaque lancement, ce sont d'autres parties qui sont concernées, alors
que l'ordre dans lequel sont définis les sommets et toujours le même.
En fait, je ne définis pas de sommets, puisque j'utilise la primitive
Box. C'est pour faire les barres d'un histogramme en 3D... des barres
ont un "z" différent, et pourtant certaines Box qui sont sensées
être derrière apparaissent à l'avant et masquent en partie une autre
qui est sensée être devant. C'est vraiment bizarre.

Merci quand même pour la réponse (et pour l'autre réponse
également).

P.S.: C'est pour mon stage de fin d'étude en entreprise :)


Avatar
Ploc
wrote:
Ploc wrote:
- ou le parametre de culling (voir CULLING_NONE dans la doc).


oups! C'est pas CULLING_NONE, mais CULL_NONE (classe PolygonAttributes).


Hmmmm le problème ne vient pas de là, je pense. Déjà parce qu'à
chaque lancement, ce sont d'autres parties qui sont concernées, alors
que l'ordre dans lequel sont définis les sommets et toujours le même.
En fait, je ne définis pas de sommets, puisque j'utilise la primitive
Box. C'est pour faire les barres d'un histogramme en 3D... des barres
ont un "z" différent, et pourtant certaines Box qui sont sensées
être derrière apparaissent à l'avant et masquent en partie une autre
qui est sensée être devant. C'est vraiment bizarre.


Le z, c'est l'axe vertical, hein?
Sinon, il n'y a pas assez d'elements (voire un bout de code posant
probleme) pour donner une reponse plus avisee.
Bon courage.



Avatar
Ploc
Ah oui, je precise que java3d a un comportement relativement coherent
d'un lancement a l'autre.
Apres, il peut y'avoir des problemes avec la bibliotheque sous jacente
(opengl ou directx). Si c'est sous windows, ca peut etre une bonne
d'essayer l'autre.
Cela dit, il ne faut pas se faire d'illusion, ce que tu fais (sauf
erreur de ma part) fait appel a des parties tres utilisees de java3d et
donc un bug de cette nature a de forte chance d'avoir ete deja corrige.
Avatar
Cedric.Olmanst
Je suis clairement d'accord, un bug pareil ne serait pas resté bien
longtemps, surtout avec Sun et Silicon Grahics qui travaillent dessus.

J'ai trouvé un paragraphe intérressant dans le tutorial de Sun, page
9 sur 40 (numérotée 1-3), dans le pdf j3d_tutorial_ch1.pdf.

"Consequently, the visual attributes of each visual object depend only
on its scene graph path. The Java 3D renderer takes advantage of this
fact and renders the leaves in the order it determines to be most
efficient. The Java 3D programmer normally does not have control over
the rendering order of objects²."

Et la note en bas de page :

"²The only control a Java 3D programmer has over the rendering order
is with the OrderedGroup class node. This class is not covered in this
tutorial. See The Java 3D API Specification for details."

Je pense donc que c'est dans cette direction que je dois aller. Qu'en
penses-tu ? Si j'attache mes barres translattées dans un OrderedGroup,
ça devrait aller mieux non ?

Quoiqu'il en soit, je vais tenter le coup ce week-end, et je te dirais
si ça fonctionne mieux maintenant.

En tout cas, merci d'avoir essayé.
Avatar
Cedric.Olmanst
L'axe z, c'est celui qui, dans le repère canonique non modifié,
pointe vers l'utilisateur. L'axe vertical dirigé vers le haut, c'est
la y.

En fait, tu as fait de la 2D comme tout le monde lors de tes études,
où tu avais les axes x (abscisse) et y (ordonnée). Et bien en 3D, ces
deux axes restent là, à la même place. On ajoute juste un 3ème axe,
z, dirigé vers l'utilisateur.

Voilà...
Avatar
Ploc
wrote:
L'axe z, c'est celui qui, dans le repère canonique non modifié,
pointe vers l'utilisateur. L'axe vertical dirigé vers le haut, c'est
la y.

En fait, tu as fait de la 2D comme tout le monde lors de tes études,
où tu avais les axes x (abscisse) et y (ordonnée). Et bien en 3D, ces
deux axes restent là, à la même place. On ajoute juste un 3ème axe,
z, dirigé vers l'utilisateur.


Merci, je ne demandais pas un cours de 3D, je me debrouille un peu avec.
En fait, avec le recul, la position de l'axe n'a pas grande importance.
Cela dit juste mon avis, il me semble qu'il vaut mieux considerer un
repere comme etant absolu avec des conventions habituelles en 3D: z
represente les verticales.
Apres, ce n'est qu'une question de position d'oeil et de transformations.

Avatar
Ploc
wrote:
Je suis clairement d'accord, un bug pareil ne serait pas resté bien
longtemps, surtout avec Sun et Silicon Grahics qui travaillent dessus.

J'ai trouvé un paragraphe intérressant dans le tutorial de Sun, page
9 sur 40 (numérotée 1-3), dans le pdf j3d_tutorial_ch1.pdf.

"Consequently, the visual attributes of each visual object depend only
on its scene graph path. The Java 3D renderer takes advantage of this
fact and renders the leaves in the order it determines to be most
efficient. The Java 3D programmer normally does not have control over
the rendering order of objects²."

Et la note en bas de page :

"²The only control a Java 3D programmer has over the rendering order
is with the OrderedGroup class node. This class is not covered in this
tutorial. See The Java 3D API Specification for details."

Je pense donc que c'est dans cette direction que je dois aller. Qu'en
penses-tu ? Si j'attache mes barres translattées dans un OrderedGroup,
ça devrait aller mieux non ?


Je ne crois pas que le probleme vienne de la.
Si le scenegraph est exactement le meme, les objets les plus proches de
l'oeil cacheront ceux se trouvant derriere. Et ce quelques soient les
optimisations et l'ordre de trace utilise pas java3D. C'est un principe
fondamental des moteurs 3D et depuis 5 ans maintenant, que je n'ai
jamais vu transgresse dans java3D.


Quoiqu'il en soit, je vais tenter le coup ce week-end, et je te dirais
si ça fonctionne mieux maintenant.

En tout cas, merci d'avoir essayé.



De rien, mais ne remplace un bout de code posant probleme.

Avatar
Cedric.Olmanst
Ouais, c'est clair que ça devrait être le cas, puisque le DepthBuffer
est activé (valeur par défaut) donc y a aucune raison que ça ne
marche pas... t'as raison. Je vais poster mon code ce soir, tu verras
peut-être directement ce qui ne va pas :)

C'est quand même une galère, de commencer en Java3D, j'ai du mal :)
Ca fait quelques jours que j'ai commencé à lire le tuto, et je
galère pas mal, mais bon je fais des progrès petit à petit quand
même, ça devrait aller d'ici peu de temps (j'espère).
1 2