bonjour
j'ai un onglet qui est dans une classe OngletGraph qui extend JPanel.
Cette onglet est lui meme diviséé en 3 panel. Comment integrer une figure 3D (par exemple un cube 3D qui tourne) à un de ces Panels.
merci
bonjour
j'ai un onglet qui est dans une classe OngletGraph qui extend JPanel.
Cette onglet est lui meme diviséé en 3 panel. Comment integrer une figure 3D (par exemple un cube 3D qui tourne) à un de ces Panels.
merci
tu veux intégrer quoi comme 3D
- J3D
- coder toi meme le moteur : Graphics.drawLine suffirat
- 3DS Max
- un gif
- une succession d'image...
Les post du type commençant par "je veux" ( sous entendu "FAITES le boulot à ma place !" , et ne faisant qu'une ligne voire deux alors que le sujet mériterait des dizaines de milliers de pages de discussion commencent à me saouler...
Fais un effort mince !
eh calme tes chevaux pepère, si ca te soule, passe ton chemin.
"je veux" tu veux que je dise koi... " je suis en train ..." et en plus où tu as vu "je veux" dans mon post???? Moi c les remarque comme les tiennes qui me soule.
Bref pour ceux que ca interesse, je suis en train d'integrer un dessin 3D qui tournera selon un certain angle en fonction des données recu en temps réelle. C'est pour cela qui me faut integrer ce dessin dans ma frame, car pour l'instant ca ouvre une autre fenetre.
[mode coup de geule OFF]
Je maintient le fait que ton post manque de précision.
Comment tu le fais ton cube ? tu traces les lignes directement avec Graphics.drawLine(...) en prenant en compte les coordonnées du cube ainsi que la position/direction de l'observateur et du cube ?
Tu utilises de l'openGL ?
JOGL ?
LWJGL ?
J3D ?
LG3D ?
Xith3D ?
...
A moins que ton problème ne concerne pas la 3D elle-même mais la gestion des layouts dans tes panels dans tel cas, je peux te répondre que si tu veux séparer un panel en 3, tu peux utiliser un BorderLayout pour une taille adaptée à chaque Panel, ou bien un GridLayout.
Visiblement, tout ce qui concerne le dessin du cube est déjà fait, puisqu'il est déjà visible dans une autre fenêtre.
Donc ça serait au niveau du layout, non ? Malgré les formes, iohack a dit juste. Cependant, il faut que cette autre fenêtre vienne d'un code java dont tu as les sources.
desloé de repondre aussi tard,
voici le code principale
et voici le code du cube3D
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101 import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.media.j3d.Alpha; import javax.media.j3d.BoundingSphere; import javax.media.j3d.BranchGroup; import javax.media.j3d.RotationInterpolator; import javax.media.j3d.Transform3D; import javax.media.j3d.TransformGroup; import javax.swing.JButton; import javax.swing.JDesktopPane; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.SpringLayout; import javax.vecmath.Point3d; import javax.vecmath.Vector3d; import com.sun.j3d.utils.geometry.ColorCube; import com.sun.j3d.utils.universe.SimpleUniverse; public class IHM3 extends JFrame{ // le constructeur public IHM3 () { //Creation de la frame et des panels JFrame frame = new JFrame("essai1"); //setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel pane; JPanel titre; Cube3 cub = new Cube3(); pane= new JPanel(new BorderLayout()); titre = new JPanel(new FlowLayout()); Color c = new Color(90,90,200); titre.setBackground(c); /***********************************************/ JButton bouton1 = new JButton("lancer"); titre.add(bouton1); bouton1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { if( JOptionPane.showConfirmDialog(null,"Voulez-vous lancer la simultion ?","Confirmation",JOptionPane.OK_CANCEL_OPTION)==JOptionPane.OK_OPTION ) { Clique.bouton1_clic(arg0); } } } ); /***************************************************/ JButton bouton2 = new JButton("arreter"); titre.add(bouton2); bouton2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { if( JOptionPane.showConfirmDialog(null,"Voulez-vous arrêter la simultion ?","Confirmation",JOptionPane.OK_CANCEL_OPTION)==JOptionPane.OK_OPTION ) { Clique.bouton2_clic(arg0); } } } ); pane.add(titre,BorderLayout.NORTH); pane.add(cub,BorderLayout.SOUTH); //pane.add(cu,BorderLayout.SOUTH); frame.getContentPane().add(pane,BorderLayout.CENTER); frame.pack(); frame.setVisible(true); } public static void main(String[] args) { IHM3 frame = new IHM3(); } }
voili voilou
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109 //Cube avec rotation suivant les trois axes import java.awt.Component; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JPanel; import javax.vecmath.*; import javax.media.j3d.*; import com.sun.j3d.utils.geometry.ColorCube; import com.sun.j3d.utils.universe.SimpleUniverse; public class Cube3 extends JPanel{ private static final double DEG_TO_RAD = 0.017453292; public static void Cube3(){ //super("Première IHM"); //Creation Univers utilise par defaut un viewer existant SimpleUniverse univers = new SimpleUniverse(); //Canvas3D canvas3D = new Canvas3D(SimpleUniverse.getPreferredConfiguration()); //SimpleUniverse univers = new SimpleUniverse(canvas3D); //Definition systeme de coordonnees et point de vue univers.getViewingPlatform().setNominalViewingTransform(); //Creation de la scene 3d BranchGroup scene = createSceneGraph(); univers.addBranchGraph(scene); //JPanel component = new JPanel(); //component.ad } public static BranchGroup createSceneGraph(){ //creation de la branche BranchGroup objRoot=new BranchGroup(); //creation du cube ColorCube cube = new ColorCube(0.3); // ----------- PREMIERE TRANSFORMATION --------- //on cree le groupe de transfomation pour rotation dynamique TransformGroup objrotate1= new TransformGroup(); //on autorise la transformationde l'objet rotation dynamique objrotate1.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); //on defini l'animation de l'objet : Alpha rotAlpha = new Alpha(-1,4000); //Rotation RotationInterpolator rotInt = new RotationInterpolator(rotAlpha,objrotate1); BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0),2.0); rotInt.setSchedulingBounds(bounds); //------------ FIN PREMIERE TRANSFORMATON ----------- //--------- DEUXIEME TRANSFORMATION -----------------// //On cree la 1er transformation Transform3D rotateX = new Transform3D(); rotateX.rotX(30.0*DEG_TO_RAD); //on cree la 2eme transformation Transform3D rotateY = new Transform3D(); rotateY.rotY(30.0*DEG_TO_RAD); //on associe les deux axes de rotations rotateX.mul(rotateY); //on cree la 2eme transformation Transform3D rotateZ = new Transform3D(); rotateZ.rotZ(20.0*DEG_TO_RAD); //on associe les deux axes de rotations rotateX.mul(rotateZ); //Translation Vector3d vector = new Vector3d(0.6,0.0,0.0); rotateX.setTranslation(vector); //on cree le groupe de transfomation pour rotation statique TransformGroup objrotate2 = new TransformGroup(rotateX); //------------ FIN DEUXIEME TRANSFORMATON ----------- //---------- CREATION DE LA BRANCHE ------------- objrotate2.addChild(cube); objrotate1.addChild(rotInt); objrotate1.addChild(objrotate2); objRoot.addChild(objrotate1); return(objRoot); } public static void ferme(){ SimpleUniverse univers = new SimpleUniverse(); //univers.addBranchGraph(scene); univers.cleanup(); } }
Bon, apparemment le cube est un composant, donc c'est très simple : il suffit d'appeler :monPanel est le JPanel qui fait partie de ta classe OngletGraph, auquel il faut intégrer le cube. Tu pourrais aussi bien l'ajouter directement dans ton OngletGraph, sans passer par un JPanel.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Cube3 cube = new Cube3(); monPanel = new JPanel(new BorderLayout()); monPanel.add(cube, BorderLayout.CENTER);
merci de ta reponse, mais c'est ce que je fais déjà dans la classe IHM3, je defini le composant cube que j'integre à mon panel. mais ca crée quand meme une autre fenetre.
a
On peut voir le code des méthodes :
- Clique.bouton1_clic
- Clique.bouton2_clic
S'il te plaît ?
Il n'y a que là que la 2e JFrame peut être appelée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 import java.awt.event.ActionEvent; public class Clique { public static void bouton2_clic(ActionEvent arg0) { System.out.println("fin anime"); Cube3.ferme(); } public static void bouton1_clic(ActionEvent arg0) { System.out.println("debut anime"); Cube3.Cube3(); } }![]()
Bon, ton code a l'air un peu gros, alors on va essayer autrement :
- à quel moment la fenêtre apparaît-elle ? Quand tu cliques sur le bouton "lancer" ?
- essaie de renommer la méthodeen constructeur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part public static void Cube3()Et de commenter l'appel dans la fonction bouton2_clic.
Code : Sélectionner tout - Visualiser dans une fenêtre à part public Cube3()
Est-ce que la fenêtre apparaît à un autre moment ?
oui mais dans bouton1_clic, il ne veut plus de
et si je commente cette fonction et que je lance l'appli, un message d'erreur tourne en boucle dans l'appli:
Code : Sélectionner tout - Visualiser dans une fenêtre à part Cube3.Cube3();
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 wglCreateContext Failed: Le format pixel n'est pas valide.
en fait ceux-ci n'était kun entrainement pour mon projet.
Mon but finale est de créé un cercle avec une droite passant par son centre, le but étant que cette droite s'incline plus ou moin celon les données lui arrivant, ca ressemble exactement au rouli d'un avion ou bien à l'inclinaison d'un bateau.
et la je bug
Ben là je vois plus trop quoi te dire ... épluche ton code et regarde si tu ouvres pas une JFrame à un moment (setVisible(true)).
sinon tu trouves judicieu de faire ma mon cercle et la droite avec java3D??? parce qu'il doit lire les données arrivant pour faire une mise a jour pour incliner la droite
Hélas je ne connais pas Java3D. En tout cas, si c'est juste un cercle et une droite qui tourne, tu peux largement t'en sortir avec l'API standard, et je pense que ça sera plus simple.
Fais des recherches sur la méthode paintComponent(Graphics g)
Partager