IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

3D Java Discussion :

[Java3D] Clic sur un objet visuel (MouseListener ou autre) [Sources]


Sujet :

3D Java

  1. #1
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Par défaut [Java3D] Clic sur un objet visuel (MouseListener ou autre)
    Bonjour,

    J'ai un programme Java3D qui m'affiche des objets de type A.
    Chacun de ces objets possède une caméra (une position de la caméra) qui lui est propre que je peux récupérer grâce à la fonction getCamera() appliquée à mon objet de type A.

    Ce que j'aimerais, c'est que lorsque je clique sur un objet de type A dans ma fenêtre de visualisation 3D, c'est récupérer cet objet de type A afin de lui appliquer ma fonction getCamera().

    Il me faudrait donc un fonctionnement similaire déjà au MouseListener pour détecter le clic sur l'objet. j'ai regardé un peu du coté de MouseBehavior mais je n'arrive pas à récupérer mon objet (cependant, j'arrive à le faire bouger, ce que je ne souhaite pas :p).

    Voila, si vous savez comment faire, je suis preneur, je pense que j'ai du passer à coté de quelque chose ^^

    Merci

  2. #2
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 18
    Par défaut Solution.


    Bonjour.

    Je possède la solution à votre problème.
    Je l'utilise régulièrement, et elle fonctionne parfaitement.

    La fonction retourne le nom de l'objet cliqué directement.

    Amicalement.

  3. #3
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Par défaut
    Bonjour,

    Quelle est cette solution ?

    Ce n'est pas le nom de l'objet que je souhaite mais l'objet en lui même (mon instance).

    Merci

  4. #4
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 18
    Par défaut Solution.
    Bonjour.

    Par le biais de cette méthode, il est possible de récupérer directement le 'UserData' de l'objet cliqué.

    Tout d'abord, lors de la création de l'objet, il faut lui affecter un nom, comme suit (exemple), où 's' est une sphère ici:

    s.setUserdata("objet 1");

    La méthode utilisée lors d'un clic fait ensuite appel à la fonction 'getuserData' du noeud cliqué.

    J'espère m'être fait bien comprendre.

    Amicalement.

    Voici la méthode complète à utiliser:
    ----------------------------------------

    Classe écoutant les clics de souris, et retournant le nom de l'objet cliqué.

    Tous les objets doivent se trouver dans des TransformGroup.
    Ces TransformGroup doivent être initialisés comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     TransformGroup TG = new TransformGroup();
      initialiser (TG,true);
    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
     
     
      // A inclure dans la classe principale.
      public TransformGroup initialiser (TransformGroup TG, boolean picquable)
       {
       TG.setCapability(TransformGroup.ALLOW_CHILDREN_READ);
       TG.setCapability(TransformGroup.ALLOW_CHILDREN_WRITE);
       TG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
       TG.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
       TG.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
     
    TG.setPickable(picquable);
     
       return TG;
       }
    Nommer chaque noeud comme suit: noeud.setUserData(''nom'');

    Classe ' PickMouseBehavior.java'
    ------------------------------------
    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
    110
    111
    112
    113
     
    import java.awt.Point;
    import java.awt.event.MouseEvent;
    import java.util.Enumeration;
    import javax.media.j3d.*;
     
    import java.io.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
    import javax.media.j3d.*;
    import javax.vecmath.*;
    import java.math.*;
    import com.sun.j3d.utils.picking.*;
    import javax.swing.*;
     
    public abstract class PickMouseBehavior extends Behavior
    {
     
        protected PickCanvas pickCanvas;
        protected WakeupCriterion conditions[];
        protected WakeupOr wakeupCondition;
        protected boolean buttonPress;
        protected TransformGroup currGrp;
        protected static final boolean debug = false;
        protected MouseEvent mevent;
     
        public PickMouseBehavior(Canvas3D canvas3d, BranchGroup branchgroup, Bounds bounds)
        {
            buttonPress = false;
            currGrp = new TransformGroup();
            currGrp.setCapability(18);
            currGrp.setCapability(17);
            branchgroup.addChild(currGrp);
            pickCanvas = new PickCanvas(canvas3d, branchgroup);
        }
     
        public void setMode(int i)
        {
            pickCanvas.setMode(i);
        }
     
        public int getMode()
        {
            return pickCanvas.getMode();
        }
     
        public void setTolerance(float f)
        {
            pickCanvas.setTolerance(f);
        }
     
        public float getTolerance()
        {
            return pickCanvas.getTolerance();
        }
     
        public void initialize()
        {
            conditions = new WakeupCriterion[2];
            conditions[0] = new WakeupOnAWTEvent(503);
            conditions[1] = new WakeupOnAWTEvent(501);
            wakeupCondition = new WakeupOr(conditions);
            wakeupOn(wakeupCondition);
        }
     
        private void processMouseEvent(MouseEvent mouseevent)
        {
            buttonPress = false;
            if((mouseevent.getID() == 501) | (mouseevent.getID() == 500))
            {
                buttonPress = true;
                return;
            } else
            {
                if(mouseevent.getID() != 503);
                return;
            }
        }
     
        public void processStimulus(Enumeration enumeration)
        {
            java.awt.AWTEvent aawtevent[] = null;
            int i = 0;
            int j = 0;
            do
            {
                if(!enumeration.hasMoreElements())
                {
                    break;
                }
                WakeupCriterion wakeupcriterion = (WakeupCriterion)enumeration.nextElement();
                if(wakeupcriterion instanceof WakeupOnAWTEvent)
                {
                    aawtevent = ((WakeupOnAWTEvent)wakeupcriterion).getAWTEvent();
                }
            } while(true);
            if(aawtevent[0] instanceof MouseEvent)
            {
                mevent = (MouseEvent)aawtevent[0];
                processMouseEvent((MouseEvent)aawtevent[0]);
                i = mevent.getPoint().x;
                j = mevent.getPoint().y;
            }
            if(buttonPress)
            {
                updateScene(i, j);
            }
            wakeupOn(wakeupCondition);
        }
     
        public abstract void updateScene(int i, int j);
    }
    Classe 'CustomPickTranslateBehavior.java'
    ----------------------------------------------
    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
    110
    111
     
    // Créé une seule fois pour l'ensemble de la scène.
     
    import javax.media.j3d.*;
    import com.sun.j3d.utils.picking.behaviors.*;
    import com.sun.j3d.utils.picking.*;
    import com.sun.j3d.utils.behaviors.mouse.*;
    import javax.vecmath.*;
     
    /**
     * A mouse behavior that allows user to pick and translate scene graph objects.
     * Common usage: 1. Create your scene graph. 2. Create this behavior with
     * the root and canvas. See PickRotateBehavior for more details.
     */
     
    public class CustomPickTranslateBehavior extends PickMouseBehavior implements MouseBehaviorCallback {
      private CustomMouseTranslate translate;
      private PickingCallback callback = null;
      private TransformGroup currentTG;
     
      /**
       * Creates a pick/translate behavior that waits for user mouse events for
       * the scene graph.
       * @param root   Root of your scene graph.
       * @param canvas Java 3D drawing canvas.
       * @param bounds Bounds of your scene.
       **/
     
      public CustomPickTranslateBehavior(BranchGroup root, Canvas3D canvas, Bounds bounds){
        super(canvas, root, bounds);
        translate = new CustomMouseTranslate(MouseBehavior.MANUAL_WAKEUP);
     
        // 'currGrp' est un 'TransformGroup' défini dans 'PickMouseBehavior'.
        translate.setTransformGroup(currGrp);
     
        translate.setFactor(0.008);
        currGrp.addChild(translate);
        translate.setSchedulingBounds(bounds);
        this.setSchedulingBounds(bounds);
      }
     
      /**
       * Update the scene to manipulate any nodes. This is not meant to be
       * called by users. Behavior automatically calls this. You can call
       * this only if you know what you are doing.
       *
       * @param xpos Current mouse X pos.
       * @param ypos Current mouse Y pos.
       **/
      public void updateScene(int xpos, int ypos)
           {
             TransformGroup tg = null;
     
             if (!mevent.isAltDown() && !mevent.isMetaDown())
                {
                pickCanvas.setShapeLocation(xpos, ypos);
                PickResult pr = pickCanvas.pickClosest();
     
                if (pr != null)
               {
                   tg=(TransformGroup) pr.getNode(PickResult.TRANSFORM_GROUP);
     
                   if (tg == null)
                    {}
                      else
                     {
                   if (tg != null && (tg.getCapability(TransformGroup.ALLOW_TRANSFORM_READ)) && (tg.getCapability(TransformGroup.ALLOW_TRANSFORM_WRITE)))
                      {
                      // Fournit l'adresse interne de l'objet cliqué.
                      Node n=tg.getChild(0);
                      // System.out.println(tg.toString()+" "+tg.numChildren()+" "+n.toString());
                      System.out.println("Adresse interne de l'objet cliqué: "+n.toString());
                      System.out.println("Nom du noeud: "+(String) n.getUserData());
     
                  translate.setTransformGroup(tg);
                  translate.wakeup();
                  currentTG = tg;
                  //freePickResult(pr);
                  }
                 }
                   }
                    else
                   if (callback!=null) callback.transformChanged (PickingCallback.NO_PICK, null);
                }
     
      }
     
      /**
        * Callback method from MouseTranslate
        * This is used when the Picking callback is enabled
        */
      public void transformChanged (int type, Transform3D transform)
           {
             callback.transformChanged (PickingCallback.TRANSLATE, currentTG);
             }
     
      /**
        * Register the class @param callback to be called each
        * time the picked object moves
        */
      public void setupCallback (PickingCallback callback)
             {
             this.callback = callback;
     
             if (callback==null)
                translate.setupCallback (null);
                   else
                translate.setupCallback (this);
      }
     
    }
    Classe 'CustomMouseTranslate.java'
    ---------------------------------------
    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
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
     
    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
    import javax.media.j3d.*;
    import javax.vecmath.*;
    import com.sun.j3d.utils.behaviors.mouse.*;
     
    /**
     * MouseTranslate is a Java3D behavior object that lets users control the
     * translation (X, Y) of an object via a mouse drag motion with the third
     * mouse button (alt-click on PC). See MouseRotate for similar usage info.
     */
     
    public class CustomMouseTranslate extends MouseBehavior {
     
        double x_factor = .02;
        double y_factor = .02;
        Vector3d translation = new Vector3d();
     
        private MouseBehaviorCallback callback = null;
     
        /**
         * Creates a mouse translate behavior given the transform group.
         * @param transformGroup The transformGroup to operate on.
         */
        public CustomMouseTranslate(TransformGroup transformGroup) {
        super(transformGroup);
        }
     
        /**
         * Creates a default translate behavior.
         */
        public CustomMouseTranslate(){
        super(0);
        }
     
        /**
         * Creates a translate behavior.
         * Note that this behavior still needs a transform
         * group to work on (use setTransformGroup(tg)) and
         * the transform group must add this behavior.
         * @param flags
         */
        public CustomMouseTranslate(int flags)
               {
               // Cette méthode est appelée    par 'CustomPickTranslateBehavior'.
               super(flags);
               }
     
        /**
         * Creates a translate behavior that uses AWT listeners and behavior
         * posts rather than WakeupOnAWTEvent.  The behavior is added to the
         * specified Component. A null component can be passed to specify
         * the behavior should use listeners.  Components can then be added
         * to the behavior with the addListener(Component c) method.
         * @param c The Component to add the MouseListener
         * and MouseMotionListener to.
         * @since Java 3D 1.2.1
         */
        public CustomMouseTranslate(Component c) {
        super(c, 0);
        }
     
        /**
         * Creates a translate behavior that uses AWT listeners and behavior
         * posts rather than WakeupOnAWTEvent.  The behaviors is added to
         * the specified Component and works on the given TransformGroup.
         * A null component can be passed to specify the behavior should use
         * listeners.  Components can then be added to the behavior with the
         * addListener(Component c) method.
         * @param c The Component to add the MouseListener and
         * MouseMotionListener to.
         * @param transformGroup The TransformGroup to operate on.
         * @since Java 3D 1.2.1
         */
        public CustomMouseTranslate(Component c, TransformGroup transformGroup) {
        super(c, transformGroup);
        }
     
        /**
         * Creates a translate behavior that uses AWT listeners and behavior
         * posts rather than WakeupOnAWTEvent.  The behavior is added to the
         * specified Component.  A null component can be passed to specify
         * the behavior should use listeners.  Components can then be added to
         * the behavior with the addListener(Component c) method.
         * Note that this behavior still needs a transform
         * group to work on (use setTransformGroup(tg)) and the transform
         * group must add this behavior.
         * @param flags interesting flags (wakeup conditions).
         * @since Java 3D 1.2.1
         */
        public CustomMouseTranslate(Component c, int flags) {
        super(c, flags);
        }
     
        public void initialize() {
        super.initialize();
        if ((flags & INVERT_INPUT) == INVERT_INPUT) {
            invert = true;
            x_factor *= -1;
            y_factor *= -1;
        }
        }
     
        /**
         * Return the x-axis movement multipler.
         **/
        public double getXFactor() {
        return x_factor;
        }
     
        /**
         * Return the y-axis movement multipler.
         **/
        public double getYFactor() {
        return y_factor;
        }
     
        /**
         * Set the x-axis amd y-axis movement multipler with factor.
         **/
        public void setFactor( double factor) {
        x_factor = y_factor = factor;
        }
     
        /**
         * Set the x-axis amd y-axis movement multipler with xFactor and yFactor
         * respectively.
         **/
        public void setFactor( double xFactor, double yFactor) {
        x_factor = xFactor;
        y_factor = yFactor;
        }
     
        public void processStimulus (Enumeration criteria) {
        WakeupCriterion wakeup;
        AWTEvent[] events;
         MouseEvent evt;
    //     int id;
    //     int dx, dy;
     
        while (criteria.hasMoreElements()) {
            wakeup = (WakeupCriterion) criteria.nextElement();
     
            if (wakeup instanceof WakeupOnAWTEvent) {
            events = ((WakeupOnAWTEvent)wakeup).getAWTEvent();
            if (events.length > 0) {
                evt = (MouseEvent) events[events.length-1];
                doProcess(evt);
            }
            }
     
            else if (wakeup instanceof WakeupOnBehaviorPost) {
            while (true) {
                // access to the queue must be synchronized
                synchronized (mouseq) {
                if (mouseq.isEmpty()) break;
                evt = (MouseEvent)mouseq.remove(0);
                // consolodate MOUSE_DRAG events
                while ((evt.getID() == MouseEvent.MOUSE_DRAGGED) &&
                       !mouseq.isEmpty() &&
                       (((MouseEvent)mouseq.get(0)).getID() ==
                    MouseEvent.MOUSE_DRAGGED)) {
                    evt = (MouseEvent)mouseq.remove(0);
                }
                }
                doProcess(evt);
            }
            }
     
        }
         wakeupOn(mouseCriterion);
        }
     
     void doProcess(MouseEvent evt) {
        int id;
        int dx, dy;
     
        processMouseEvent(evt);
     
        if (((buttonPress)&&((flags & MANUAL_WAKEUP) == 0)) ||
            ((wakeUp)&&((flags & MANUAL_WAKEUP) != 0))){
            id = evt.getID();
            if ((id == MouseEvent.MOUSE_DRAGGED) &&
            !evt.isAltDown() && !evt.isMetaDown()) {
     
            x = evt.getX();
            y = evt.getY();
     
            dx = x - x_last;
            dy = y - y_last;
     
            if ((!reset) && ((Math.abs(dy) < 50) && (Math.abs(dx) < 50))) {
                //System.out.println("dx " + dx + " dy " + dy);
                transformGroup.getTransform(currXform);
     
                translation.x = dx*x_factor;
                translation.y = -dy*y_factor;
     
                transformX.set(translation);
     
                if (invert) {
                currXform.mul(currXform, transformX);
                } else {
                currXform.mul(transformX, currXform);
                }
     
                                       // Ligne suivante désactivée: l'objet cliqué ne sera pas déplacé.
                                       // Car on ne veut traiter que les clics de souris.
                // transformGroup.setTransform(currXform);
     
                transformChanged (currXform);
     
                if (callback!=null) callback.transformChanged (MouseBehaviorCallback.TRANSLATE, currXform );
     
            }
            else {
                reset = false;
            }
            x_last = x;
            y_last = y;
            }
            else if (id == MouseEvent.MOUSE_PRESSED) {
            x_last = evt.getX();
            y_last = evt.getY();
            }
        }
        }
     
        /**
         * Users can overload this method  which is called every time
         * the Behavior updates the transform
         *
         * Default implementation does nothing
         */
        public void transformChanged (Transform3D transform) 
               {
               // Ici on peut réaliser des actions chaque fois que la scène est modifiée.    
               // System.out.println("*");    
               }
     
        /**
         * The transformChanged method in the callback class will
         * be called every time the transform is updated
         */
        public void setupCallback( MouseBehaviorCallback callback ) {
        this.callback = callback;
        }
    }

  5. #5
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Par défaut
    Merci pour la réponse, je vais essayer

  6. #6
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Par défaut
    Merci, j'ai pu faire ce que je voulais

    Je passe mon objet A dans le setUserData.
    J'ai créé une classe SimplePickBehaviour car je n'ai pas besoin de tout ce que tu as dedans et dans la partie traitement une fois l'objet "pické", je passe ma camera.

    Si ça intéresse certains, qu'ils postent à la suite

  7. #7
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 18
    Par défaut Bonjour.


    Pour ma part, la classe simplifiée que tu as créé m'intéresse fortement.
    Peux-tu me la faire parvenir à mon adresse mail, stp ?

    noirmainpierre arobace yahoo.fr

    Merci d'avance.

  8. #8
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 38
    Par défaut
    Moi ça m'intéresse aussi!

    J'ai une fenêtre contenant des objets 3D étant un assemblage de forme de base (cube, sphère, etc..)

    Et je voudrais qu'un clic sur ces objets me permette de données les caractéristiques de l'objet, donc pas besoin de le déplacer ni rien.

    Ta fonction simplifiée serait impec dans mon cas je pense.

    Merci

    mon adresse: nicolasjul@hotmail.com

  9. #9
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Par défaut
    Et bien, ma petite classe a du succès, ça fais 5 personnes qui me la demande depuis en plus de pan99.

    Je t'envoi ça quand je rentre du boulot avec quelques explication a son fonctionnement (rien de compliqué, jusqu'à présent tout le monde a réussi à faire ce qu'il voulait avec).

  10. #10
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Par défaut
    Voici la classe comme promis :

    Code java : 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
    package modele;
     
    import javax.media.j3d.*;
     
    import com.sun.j3d.utils.geometry.Primitive;
    import com.sun.j3d.utils.picking.PickResult;
    import com.sun.j3d.utils.picking.PickTool;
    import com.sun.j3d.utils.picking.behaviors.PickMouseBehavior;
    /**
     * Cette classe implémente un comportement simple de picking.
     * Elle permet de récupérer l'objet qui a été "pické" (cliqué dans note cas)
     * en utilisant le userData de l'object.
     * @author R.Perruchon
     * @version 1.0
     * @see SimplePick
     */
    public class SimplePickBehaviour extends PickMouseBehavior {
        private Modele modele;
     
    	/**
          * @param pickRoot BranchGroup qui est la racine de l'opération de picking.
          * @param pickCanvas Canvas3D utilisé dans l'opération de picking.
          * @param pickBounds Bounds qui défini la région active pour le comportement.
          * @param modele Modele qui est notre modèle.
          */
          public SimplePickBehaviour(Canvas3D theCanvas, BranchGroup pickRoot, 
    			       Bounds pickBounds, Modele modele) {
                super(theCanvas, pickRoot, pickBounds);
                this.modele = modele;
                setSchedulingBounds(pickBounds);
                pickCanvas.setMode(PickTool.BOUNDS);
          }
    	/**
             * Vérifie si un objet a été "pické"
             * @xpos int qui stocke la position x de la souris
             * @ypos int qui stocke la position y de la souris
             */
    	public void updateScene(int xpos, int ypos) {
     
            PickResult pickResult = null;
    		Primitive pickedShape = null;
    		RegleVisuelle regvisu;
    		pickCanvas.setShapeLocation(xpos,ypos);
     
    		pickResult = pickCanvas.pickClosest();
    		if(pickResult == null){
    			System.out.println("pickres null");
    		}
    		else {
    			pickedShape = (Primitive) pickResult.getNode(PickResult.PRIMITIVE);
    			Shape3D s = (Shape3D)pickResult.getNode(PickResult.SHAPE3D);
     
    			if (pickedShape != null){
    				//System.out.println("Picked the " + pickedShape.getUserData());
    				regvisu = (RegleVisuelle) pickedShape.getUserData();
    				//System.out.println("regvisu : " + regvisu);
    				if(regvisu != null){
    					this.modele.setCameraActive(regvisu.getCamera());
    				}
    			}
    			else if(s != null){
    				System.out.println("s null");
    			}
    			else{
    				System.out.println("Picked nothing");
    			}
    		}
        }
    }

    Il faudra que vous l'adaptiez à votre cas mais je pense que ce qui vous intéresse est ici :

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        regvisu = (RegleVisuelle) pickedShape.getUserData();
        if(regvisu != null){
            this.modele.setCameraActive(regvisu.getCamera());
        }


    Qui me permettent de récupérer mon objet visuel et de zoomer dessus.

    Il ne faut pas oublier d'utiliser le setUserData afin d'avoir les infos sur l'objet à picker, par exemple pour mon cas c'étais une sphère (dans ma classe RegleVisuelle) :

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
        this.sphereHaute.setUserData(this);


    Ma methode getCamera() est la suivante (dans ma classe regleVisuelle) :

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        /**
         * methode permettant de récupérer la caméra associée à la regle
         * @return la caméra associée à l'objet graphique correspondant à la règle */
        public Camera getCamera(){
            return this.cameraRegle;
        }


    Je défini une position de caméra pour chaque objet visuel, par exemple, lorsque je créé une sphère, à la fin de la création je créé une caméra :

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        /*** INSTANCIATION D'UNE CAMERA QUI SERA ASSOCIEE A LA REGLE ***/
                //variables intermediaires
                float coordXCam = this.coordX + Parametres.distCamX;
                float coordYCam = this.coordY +( (this.hauteurCylindre + 2*this.rayonSphere) / 2.0f) + Parametres.distCamY;
                //float coordYCam = this.coordY + Parametres.distCamY;
                float coordZcam = this.coordZ + Parametres.distCamZ;
                float rotXCam   = Parametres.rotCamX;
                float rotYCam   = Parametres.rotCamY;
                float rotZCam   = Parametres.rotCamZ;
     
                this.cameraRegle = new Camera(coordXCam, coordYCam, coordZcam, rotXCam, rotYCam, rotZCam);


    cameraRegle est bien sûr défini comme ceci dans ma classe regleVisuelle :

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        //caméra associée à la règle
        private Camera cameraRegle;


    Normalement vous devriez avoir tous les éléments en main pour vous en sortir maintenant (j'ai pu m'en sortir tout seul à l'époque et je n'y connaissais rien non plus encore à JAVA3D donc vous devriez y arriver avec de l'aide, enfin j'espère ^^)

    Bon courage.

  11. #11
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 38
    Par défaut
    Bon impeccable cette petite classe marche du feu de dieu;

    J'aurais une petite question à poser est-ce qu'il serait possible de changer le clic, c'est à dire au lieu de le faire sur bouton gauche classiquement, mettre le clic sur la molette ou alors faire ça sur double clic par exemple?

    Merci

  12. #12
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 7
    Par défaut
    Citation Envoyé par loka Voir le message
    Voici la classe comme promis :

    Code java : 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
    package modele;
     
    import javax.media.j3d.*;
     
    import com.sun.j3d.utils.geometry.Primitive;
    import com.sun.j3d.utils.picking.PickResult;
    import com.sun.j3d.utils.picking.PickTool;
    import com.sun.j3d.utils.picking.behaviors.PickMouseBehavior;
    /**
     * Cette classe implémente un comportement simple de picking.
     * Elle permet de récupérer l'objet qui a été "pické" (cliqué dans note cas)
     * en utilisant le userData de l'object.
     * @author R.Perruchon
     * @version 1.0
     * @see SimplePick
     */
    public class SimplePickBehaviour extends PickMouseBehavior {
        private Modele modele;
     
    	/**
          * @param pickRoot BranchGroup qui est la racine de l'opération de picking.
          * @param pickCanvas Canvas3D utilisé dans l'opération de picking.
          * @param pickBounds Bounds qui défini la région active pour le comportement.
          * @param modele Modele qui est notre modèle.
          */
          public SimplePickBehaviour(Canvas3D theCanvas, BranchGroup pickRoot, 
    			       Bounds pickBounds, Modele modele) {
                super(theCanvas, pickRoot, pickBounds);
                this.modele = modele;
                setSchedulingBounds(pickBounds);
                pickCanvas.setMode(PickTool.BOUNDS);
          }
    	/**
             * Vérifie si un objet a été "pické"
             * @xpos int qui stocke la position x de la souris
             * @ypos int qui stocke la position y de la souris
             */
    	public void updateScene(int xpos, int ypos) {
     
            PickResult pickResult = null;
    		Primitive pickedShape = null;
    		RegleVisuelle regvisu;
    		pickCanvas.setShapeLocation(xpos,ypos);
     
    		pickResult = pickCanvas.pickClosest();
    		if(pickResult == null){
    			System.out.println("pickres null");
    		}
    		else {
    			pickedShape = (Primitive) pickResult.getNode(PickResult.PRIMITIVE);
    			Shape3D s = (Shape3D)pickResult.getNode(PickResult.SHAPE3D);
     
    			if (pickedShape != null){
    				//System.out.println("Picked the " + pickedShape.getUserData());
    				regvisu = (RegleVisuelle) pickedShape.getUserData();
    				//System.out.println("regvisu : " + regvisu);
    				if(regvisu != null){
    					this.modele.setCameraActive(regvisu.getCamera());
    				}
    			}
    			else if(s != null){
    				System.out.println("s null");
    			}
    			else{
    				System.out.println("Picked nothing");
    			}
    		}
        }
    }

    Il faudra que vous l'adaptiez à votre cas mais je pense que ce qui vous intéresse est ici :

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        regvisu = (RegleVisuelle) pickedShape.getUserData();
        if(regvisu != null){
            this.modele.setCameraActive(regvisu.getCamera());
        }


    Qui me permettent de récupérer mon objet visuel et de zoomer dessus.

    Il ne faut pas oublier d'utiliser le setUserData afin d'avoir les infos sur l'objet à picker, par exemple pour mon cas c'étais une sphère (dans ma classe RegleVisuelle) :

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
        this.sphereHaute.setUserData(this);


    Ma methode getCamera() est la suivante (dans ma classe regleVisuelle) :

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        /**
         * methode permettant de récupérer la caméra associée à la regle
         * @return la caméra associée à l'objet graphique correspondant à la règle */
        public Camera getCamera(){
            return this.cameraRegle;
        }


    Je défini une position de caméra pour chaque objet visuel, par exemple, lorsque je créé une sphère, à la fin de la création je créé une caméra :

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        /*** INSTANCIATION D'UNE CAMERA QUI SERA ASSOCIEE A LA REGLE ***/
                //variables intermediaires
                float coordXCam = this.coordX + Parametres.distCamX;
                float coordYCam = this.coordY +( (this.hauteurCylindre + 2*this.rayonSphere) / 2.0f) + Parametres.distCamY;
                //float coordYCam = this.coordY + Parametres.distCamY;
                float coordZcam = this.coordZ + Parametres.distCamZ;
                float rotXCam   = Parametres.rotCamX;
                float rotYCam   = Parametres.rotCamY;
                float rotZCam   = Parametres.rotCamZ;
     
                this.cameraRegle = new Camera(coordXCam, coordYCam, coordZcam, rotXCam, rotYCam, rotZCam);


    cameraRegle est bien sûr défini comme ceci dans ma classe regleVisuelle :

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        //caméra associée à la règle
        private Camera cameraRegle;


    Normalement vous devriez avoir tous les éléments en main pour vous en sortir maintenant (j'ai pu m'en sortir tout seul à l'époque et je n'y connaissais rien non plus encore à JAVA3D donc vous devriez y arriver avec de l'aide, enfin j'espère ^^)

    Bon courage.
    pouvez vous citer le code ou tu a utiliser cette classe dans la classe principale

  13. #13
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Par défaut
    J'ai du réouvrir mon vieux projet afin de te répondre :p

    Voici le code dans ma méthode d'initialisation de ma classe principale :

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //-- -- Ajout SimplePickBehaviour
    			SimplePickBehaviour pickSimple =
    				new SimplePickBehaviour(this.canvas3D,
    										this.branchRegles,
    				                        new BoundingSphere(new Point3d(), Double.MAX_VALUE),
    				                        this);
    			this.branchRegles.addChild(pickSimple);

    Après, c'est à toi de savoir où tu doit le placer selon ton arbre.

  14. #14
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 7
    Par défaut
    merci beaucoup.
    ms mes objets sont des objets de 3DSmax que j'ai récupéré dans un branchegroup chaque objet .je veux savoir est ce que je doit faire pur chaque branchegroup .setuserdata().voici comment est mon code

    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
      //------------ début de creation de livre 1-----------
        pp=loadWavefrontObject("src/LIVRES/1.obj");
        Shape3D shape = (Shape3D) pp.getChild(0);
        //Shape3D shappe = (Shape3D) pp.getChild(1);
        shape.setUserData("liv1");
        pp.setCapability(BranchGroup.ALLOW_PICKABLE_READ);
        Transform3D transform = new Transform3D();
        Vector3f vector = new Vector3f(0.8f,0.9f,-8.8f);
        transform.setTranslation(vector);
        tg = new TransformGroup(transform);
        initialiser (tg,true);
     Appearance app = new Appearance( );
     // create material for color change
    	Material mat = new Material();
    	mat.setCapability(Material.ALLOW_COMPONENT_WRITE);
    	Alpha timer = new Alpha (-1, 900);
    	// set color interpolator from red to blue
    	ColorInterpolator ci = new ColorInterpolator(
    		timer, mat, new Color3f(1, 0, 0), new Color3f(1f,1f,1f));
    	ci.setSchedulingBounds(sphere);
    	// set material for appearance
    	app.setMaterial(mat);
    //app.setTexture(houseTex);
        shape.setAppearance(app);
        tg.addChild(pp);
        	objRoot.addChild(ci);      
        objRoot.addChild(tg);
    votre classe me donne toujours null losque je clique sur un livre.moi je veux lorsque je clique sur un livre une autre scene s'ouvre avec des parametres que j'ajoute selon le livre cliqué

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XNA] Fonction Clic sur un objet de type button
    Par Katsuhiko dans le forum XNA/Monogame
    Réponses: 2
    Dernier message: 23/04/2011, 16h49
  2. [XNA] Fonction Clic sur un objet de type button
    Par Katsuhiko dans le forum C#
    Réponses: 0
    Dernier message: 14/04/2011, 17h11
  3. Le clic sur un objet HTML ne fonctionne pas
    Par womannosky dans le forum GWT et Vaadin
    Réponses: 1
    Dernier message: 10/03/2010, 11h19
  4. comment lancer un clic sur un objet ?
    Par lestat22 dans le forum Flex
    Réponses: 3
    Dernier message: 27/03/2008, 14h52
  5. [Java3D] Textures sur un objet
    Par vero55 dans le forum 3D
    Réponses: 3
    Dernier message: 18/04/2007, 17h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo