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 :
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 :