[Java3d] Architecture d'une application 3D avec Swing / Java3d

Architecture d'une application 3D avec Swing / Java3d [Java3d] - Java - Programmation

Marsh Posté le 21-04-2009 à 00:21:59    

Bonjour,
 
Je développe une application avec java3d et swing. Je me pose cependant encore quelques questions sur l'architecture à adopter. Mon application doit permettre à l'utilisateur de visualiser des points, courbes (ensemble de points), cylindres dans un espace 3d muni d'un repère. De plus l'utilisateur doit pouvoir "naviguer" dans la scène. Il peut plus précisément agir sur l'ensemble des objets (que j'appellerai OBJS) en même temps. Il a par conséquent à sa disposition un menu qui lui permet :

  • Fonctionne ; en cours ; a faire/ne fonctionne pas
  • De faire tourner OBJS suivant l'axe Y ; Avec [JSpinner, clavier]
  • De faire tourner OBJS suivant l'axe X ; Avec [ JSpinner, clavier]
  • De faire une rotation autour d'un point : [Souris clique gauche]
  • De zoomer sur OBJS ; Avec [Souris(molette), JSpinner, clavier]
  • De déplacer OBJS suivant X, Y ; Avec [Souris clique droit, 5 JButton (pour +X, -X, +Y, -Y, raz), clavier]


L'ensemble des objets est composé de :

  • Un repère avec pour {X,Y,Z} : un Cylindre + 1 Cone + 1 Label et une sphère pour {0.0.0} ;
  • Des ensembles de points à tracer (Qui pourront être ou non affichés) ;
  • Des ensembles de courbes à tracer (Qui pourront être ou non affichés) ;
  • Un cylindre.


J'ai commencé mon application ainsi (j'ai mis l'essentiel) :

  • viewer.java : Ma classe principale qui lance l'applet/programme.
  • viewerConstants.java : Interface qui ne contient que mes déclarations.
  • JPpanel3D.java : Class dérivée de JPanel qui contient mon Canva3D.
  • JPanelControl.java : Class dérivé de JPanel qui contient tout mes boutons.
  • ButtonListener.java : Class qui implémente ActionListener et qui traite les actions sur les boitons.
  • DrawPoints.java : Class dérivée de Shape3D qui renvoie l'ensemble des points.


Du points de vue Java3D, c'est bordélique. En effet pour le moment, je n'ai qu'un transformeGroup avec mes MouseListener et c'est tout...
Voici l'architecture que j'ai pour le moment :
http://img10.imageshack.us/img10/7238/startyrb.png
 
C'est assez vide comme vous pouvez le constater. En effet, je ne sais pas comment structurer mon programme pour la suite sachant que :

  • La rotation suivant Y pour se faire de trois manières différentes(souris, clavier, JSpinner) et que je dois toujours avoir la valeur de l'angle dans mon JSpinner ; De même pour l'axe X;
  • Le zoom peut également se faire de 3 manières et je dois aussi récupérer la valeur dans un JSpinner.

Quand j'aurai implémenté ces comportements, j'aurai déjà franchis un bonne étape.
Je dois cependant prendre en compte les évolutions suivantes

  • Charger des données à la volé (entré par l'utilisateur) et qu'elle héritent des transforms;
  • Sûrement d'autres choses...


Je ne vous demande pas de m'écrire le programme bien-sûr ! Je souhaite avant-tout des conseils sur l'architecture à adopter.

  • Si par exemple je dois utiliser pleins des transformes (ex : 3 pour rotation X (souris, clavier, bouton), etc...) ;
  • Comment gérer l'actualisation des JSpinner (ex : le clavier augmente/diminue le JSpinner, puis c'est la valeur du JSpinner qui modifie le transform) ;
  • Je peux avec un pointArray faire un "objet" composé de plusieurs points. Puis-je faire de-même pour mon repère ? C'est à dire créer une sort de super objet qui regroupe mes cylindre, cones, label ?  


Je suis ouvert à toutes remarques, idées, critiques. Merci
 
Références :


Enfin, voici mon interface graphique pour le moment :
http://img209.imageshack.us/img209/4657/interface.png

Reply

Marsh Posté le 21-04-2009 à 00:21:59   

Reply

Marsh Posté le 23-04-2009 à 11:47:53    

Je constate que java3d déchaîne les foules !  :sweat:  
 
J'ai avancé un peu dans mon application et j'ai fais un jolie dessin qui résume bien mes questions :
http://img141.imageshack.us/img141/7456/22april.th.png
 
De même, j'ai fais un diagramme de classe :  
http://img172.imageshack.us/img172/2693/uml22avrilpetit.th.png
 
Les questions précédentes restes toujours valables avec un peu plus de précision quant au repère :

  • Il faut que je puisse récupérer/fixer les valeurs X,Y,Z,rot{X,Y,Z} des mes objets dans le repère absolu à partir de mon interface graphique. (J'arrive pour le moment à récupérer la position X,Y de ma souris par rapport à la taille de mon JPanel3D)


Je suis preneur de toutes commentaires. Merci

Reply

Marsh Posté le 23-04-2009 à 16:23:54    

drapal, je peut pas t'aider, mais java3d m'interesse :)

Reply

Marsh Posté le 27-04-2009 à 07:30:52    

Salut,
Beau boulot !!! Je commence à peu près le même travail, donc j'ai effectué les mêmes recherches :)
Mon but est de creer une application qui charge un fichier texte avec des points XYZ et de pouvoir les visualiser en 3D. Rien de bien ambitieux pour le moment, mais c'est vrai que quand on commence à se pencher sur le sujet c'est bcp plus vaste qu'il n'y parait :)
Pour la rotation d'une vue 3D à partir de la souris (plan), j'imagine que les axes qui tournent sont ceux qui suivent la projection de la direction de la souris perpendiculaire aux axes  :pt1cable: . (oui c plus facile à expliquer avec un schema ...)
Bonne continuation, ça à l'air d'avancer assez vite !
   

Message cité 1 fois
Message édité par Apertone le 27-04-2009 à 07:32:49
Reply

Marsh Posté le 27-04-2009 à 13:26:11    

Apertone a écrit :

Salut,  
Beau boulot !!! Je commence à peu près le même travail, donc j'ai effectué les mêmes recherches :)  
Mon but est de creer une application qui charge un fichier texte avec des points XYZ et de pouvoir les visualiser en 3D. Rien de bien ambitieux pour le moment, mais c'est vrai que quand on commence à se pencher sur le sujet c'est bcp plus vaste qu'il n'y parait :)
Pour la rotation d'une vue 3D à partir de la souris (plan), j'imagine que les axes qui tournent sont ceux qui suivent la projection de la direction de la souris perpendiculaire aux axes  :pt1cable: . (oui c plus facile à expliquer avec un schema ...)  
Bonne continuation, ça à l'air d'avancer assez vite !
   


 
Salut,
J'ai surtout repris pas mal de bouts de codes qui traînaient...  
 
Pour la rotation à la souris, c'est à partir d'un point dans mon application. Après je veux aussi le faire autour d'un axe (de deux axes mêmes, Y et X.) Mais j'avoue qu'il n'y a rien de mieux qu'un dessin !  
 
J'ai avancé un peu :

  • Ajout de KeyListener sur tout les boutons pour contrôler aussi au clavier (envoie les événements aux jbuttons/jspinner mais je garde le focus uniquement au démarrage de mon applet)

EDIT : et hop dans l'applet :

Code :
  1. this.addFocusListener(
  2.            new FocusListener() {
  3.             public void focusGained(FocusEvent e) {
  4.             }
  5.             public void focusLost(FocusEvent e) {
  6.                 requestFocus();
  7.             }
  8.         });


  • Ajout à la volé d'un Branch Group  à partir d'un fichier qu'on upload ( plus de 70 000 points sans problèmes)  


Là où je bloque :

  • Modifier la vue au chargement
  • Caler les coordonnées de mes données chargés sur le BranchGroup déjà présent (mes axes)
  • Bouger mes objets avec mes Buttons


Message édité par forumhardware le 27-04-2009 à 13:56:59
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed