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] Problème Picking


Sujet :

3D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté Avatar de juliens9
    Profil pro
    Développeur Web
    Inscrit en
    Mars 2007
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2007
    Messages : 192
    Par défaut [JAVA3D] Problème Picking
    Bonjour,
    j'ai un problème au niveau de la selection avec la souris.
    J'ai le code suivant :
    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
    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
     
    public void processStimulus (Enumeration criteria) {
     
            WakeupCriterion wakeup;
            AWTEvent[] event;
            int eventId;  
            while (criteria.hasMoreElements()) {
              wakeup = (WakeupCriterion) criteria.nextElement();
              if (wakeup instanceof WakeupOnAWTEvent) {
            //ici on enregistre tout les evenements qui ont eu lieu
            event = ((WakeupOnAWTEvent)wakeup).getAWTEvent();
            for (int i=0; i<event.length; i++) {     
              eventId = event[i].getID();
              if (eventId == MouseEvent.MOUSE_PRESSED) {
                //on recupere les coordonnees ou ca a pické sur le canvas 
                int x = ((MouseEvent)event[i]).getX();
                int y = ((MouseEvent)event[i]).getY();
                //et on dit au canvas : ca a pické ici,regarde si tu trouve des objets
                pickCanvas.setShapeLocation(x, y);
     
                Point3d eyePos = pickCanvas.getStartPosition ();
                double[] t =new double[3];
                double[] t2= new double[3];
                 eyePos.get(t);
                 t[2]=t[2]-7000;
     
               // pickResult = pickCanvas.pickAllSorted();
     
                  canvas.getCenterEyeInImagePlate(eyePos);
     
                  Point3d mousePos = new Point3d();
                  canvas.getPixelLocationInImagePlate(x, y, mousePos);
     
                  Transform3D transform3D = new Transform3D();
                  canvas.getImagePlateToVworld(transform3D);
     
                  transform3D.transform(eyePos);
                  transform3D.transform(mousePos);
     
     
                  Vector3d mouseVec;
                  //if (parallel) {
                     Vector3d vect = new Vector3d(0.f, 0.f, 3.f);
                  // }
                  // else {
                      mouseVec = new Vector3d();
                      mouseVec.sub(mousePos, vect);
                      mouseVec.normalize();
                 //  }
     
     
                  pickRay.set(mousePos, mouseVec);
                  sceneGraphPath = bg.pickAll(pickRay);
     
     
     
     
                  if (sceneGraphPath != null) {
                      for (int j=0; j<sceneGraphPath.length; j++) {
                         if (sceneGraphPath[j] != null) {
                            Node node = sceneGraphPath[j].getObject();
                            Appearance appar2 = new Appearance();
                            System.out.println("Click detecté");
                         Appearance texture = new Appearance();
                         Material colorMat2= new Material();
                         colorMat2.setDiffuseColor(new Color3f(Color.yellow));
                         appar2.setMaterial(colorMat2);
     
                         Appearance appar = new Appearance();
                         Material colorMat= new Material();
                         colorMat.setDiffuseColor(new Color3f(Color.red));
                         appar.setMaterial(colorMat);
     
                        try{
                         Sphere cone = (Sphere) sceneGraphPath[j].getNode(0);
                         System.out.println("Recuperation objet");
                         String nom = cone.getName();
     
                         for (int g =0;g<25;g++)
                         {
                             if ( listep[g].getname().equals(nom)){
     
                                 coordar=listep[g].getcoord();
     
     
                                 if (listep[g].getappar().equals("appar")){
                                     if (nbselect<=2){
                                    nbselect++;
                                    if ( nbselect==2){
                                        canvas.setName(String.valueOf(listep[g].getcoord().x+1).concat(String.valueOf(listep[g].getcoord().y+1).concat(String.valueOf(listep[g].getcoord().z+1))));
     
                                     }
                                    if ( nbselect==3){
     
                                        canvas.setName(canvas.getName().concat(String.valueOf(listep[g].getcoord().x+1).concat(String.valueOf(listep[g].getcoord().y+1).concat(String.valueOf(listep[g].getcoord().z+1)))));
                                         }
                                     listep[g].setappar("appar2");
                                     texture=appar2;
                                     }
                                     else{
                                         JOptionPane.showMessageDialog(canvas,"Vous avez deja selectionnez 2 points ", "Attention",JOptionPane.INFORMATION_MESSAGE);
                                         texture=appar;
                                     }
                                    }
                                 else{
                                     listep[g].setappar("appar");
                                     texture=appar;
                                     nbselect--;
     
                                 }
     
                                 cone.setAppearance(texture);
     
     
                             }
     
                         }
     
     
                         }
                        catch(ClassCastException e)
                        {
                             System.out.print("mauvais click");
                        }
     
                        break;
                       }
     
     
     
                         }
             }
            } 
           }
          }

    et en fait je n'arrive a selectionner des objets que s'il se trouve au fond. En gros tous les objets se situant a une profondeur z inférieur a 0 ne sont pas selectionnable,
    Je voulais donc savoir si quelqu'un pouvais m'aider et si fallait que je modifie la methode de selection
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    pickRay.set(mousePos, mouseVec);
     sceneGraphPath = bg.pickAll(pickRay);

    Merci

  2. #2
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 56
    Par défaut
    SAlut, je ne sais pas si ca peut , t'aider, moi je l'ai fait un peu autrement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     PickCanvas   pickCanvas=new PickCanvas(myCan, myScene);
    pickCanvas.setTolerance(5.0f);
     pickCanvas.setMode(PickCanvas.GEOMETRY_INTERSECT_INFO);
     pickCanvas.setShapeLocation(x, y);
     Point3d eyePos = pickCanvas.getStartPosition ();
     PickResult[] pickResult = pickCanvas.pickAllSorted();     
    if (pickResult != null) {              
    PickIntersection pi =              pickResult[0].getClosestIntersection(eyePos);  Point3d point = pi.getPointCoordinatesVW();}
    Ce qui me donne,si ma souris rencontre un objet, les coordonnées 3D du clique.
    De , la, vu que j'ai enregistré les coordonnées 3D de mes objets ainsi que leur taille, j'arrive à retrouver la référence de l'objet rencontré et ce, quel que soit la profondeur.

  3. #3
    Membre expérimenté Avatar de juliens9
    Profil pro
    Développeur Web
    Inscrit en
    Mars 2007
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2007
    Messages : 192
    Par défaut
    Merci ca marche nikel

    Juste un petit problème c'est que sous mac ca marche pas. As tu aussi ce problème d'incompatibilité ?


    Julien

  4. #4
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 56
    Par défaut
    Pas testé sous mac (je l'ai pas)

  5. #5
    Membre expérimenté Avatar de juliens9
    Profil pro
    Développeur Web
    Inscrit en
    Mars 2007
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2007
    Messages : 192
    Par défaut
    ok pas de problème

    merci beaucoup

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

    Voici le message d'erreur que j'obtiens.
    Manque-t-il quelque chose ?
    Merci de votre aide.


    Exception occurred during Behavior execution:
    javax.media.j3d.CapabilityNotSetException: Shape3D: no capability to get geometry
    at javax.media.j3d.Shape3D.numGeometries(Shape3D.java:398)
    at com.sun.j3d.utils.picking.PickResult.storeGeometry(PickResult.java:508)
    at com.sun.j3d.utils.picking.PickResult.generateIntersections(PickResult.java:632)
    at com.sun.j3d.utils.picking.PickResult.numIntersections(PickResult.java:428)
    at com.sun.j3d.utils.picking.PickTool.pickGeomAllSortedIntersect(PickTool.java:854)
    at com.sun.j3d.utils.picking.PickTool.pickAllSorted(PickTool.java:528)
    at PickIt.processStimulus(PickIt.java:73)
    at javax.media.j3d.BehaviorScheduler.doWork(BehaviorScheduler.java:172)
    at javax.media.j3d.J3dThread.run(J3dThread.java:250)



    Et voici ma classe de Picking.
    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
     
    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.*;
    //pickit est le gestionnaire de picking
    //heritant de behavior qui est abstrait,elle doit redefinir initialize() et processStimulus()
    class PickIt extends Behavior {
     
    BranchGroup b=null;
    private PickCanvas pickCanvas;    
    private Canvas3D can;
    private BranchGroup bg;
    private PickResult[] pickResult;
    private String message;
    static final double parsec=3.2616;
     
    private Shape3D sh=null;
    public PickIt(Canvas3D c, BranchGroup b){
     
    //un pickcanvas a besoin de connaitre le canvas à picker et les objets du branchGroup 
    //qu il doit tester.
     
    //position est la position d'un objet pické en cartésien
         can=c;
         bg=b;                 
         pickCanvas= new PickCanvas(c,b); 
         pickCanvas.setMode(PickTool.GEOMETRY_INTERSECT_INFO); 
         pickCanvas.setTolerance(4.0f);    
    }        
     
     
    public void initialize(){
    //je dit que processStimulus doit etre appelé lors d'un press de souris gauche        
        wakeupOn(new WakeupOnAWTEvent(MouseEvent.MOUSE_PRESSED));
    }    
     
    public void processStimulus (Enumeration criteria) {
     
        WakeupCriterion wakeup;
        AWTEvent[] event;
        int eventId;
    //lorsqu'il recoit un evenement,le critere est envoyer en parametres 
    //(geré par java3D)    
        while (criteria.hasMoreElements()) {
          wakeup = (WakeupCriterion) criteria.nextElement();
          if (wakeup instanceof WakeupOnAWTEvent) {
        //ici on enregistre tout les evenements qui ont eu lieu
        event = ((WakeupOnAWTEvent)wakeup).getAWTEvent();
        for (int i=0; i<event.length; i++) { 
          //un evenement est reconnu par un static final int         
          eventId = event[i].getID();
          //ici on veut que lé evenements MOUSE_PRESS
          if (eventId == MouseEvent.MOUSE_PRESSED) {
            //on recupere les coordonnees ou ca a pické sur le canvas 
            int x = ((MouseEvent)event[i]).getX();
            int y = ((MouseEvent)event[i]).getY();
            //et on dit au canvas : ca a pické ici,regarde si tu trouve des objets
            pickCanvas.setShapeLocation(x, y);
     
            Point3d eyePos = pickCanvas.getStartPosition ();
     
            double[] t =new double[3];
            double[] t2= new double[3];
             eyePos.get(t);
             System.out.println(t[0]+" "+t[1]+" "+t[2]);
             t[2]=t[2]-7000;
     
            pickResult = pickCanvas.pickAllSorted();
     
          if (pickResult ==null)
           {
              System.out.println("aucune étoile piqué");
           }
     
          if (pickResult != null) 
          {
                  //on garde l'intersection la plus près de l'observateur
                  PickIntersection pi = pickResult[0].getClosestIntersection(eyePos);
     
                Point3d point = pi.getPointCoordinatesVW();
                Node n = pickResult[0].getObject();
                  //e = (Etoile)n.getUserData();
                 System.out.println(point.toString()+" "+n.toString());
                 point.get(t2);
                 t2[2]=t[2];
                 Point3d textPos= new Point3d(t2);
                 System.out.println(textPos.toString());
                //ici on calcul la distance de l'etoile pické par rapport au centre du repere
                double d=eyePos.distance(new Point3d(0.0,0.0,0.0));
     
         }
        } 
       }
      }
     }wakeupOn (new WakeupOnAWTEvent(MouseEvent.MOUSE_PRESSED));
    }         
     
    }

  7. #7
    Membre expérimenté Avatar de juliens9
    Profil pro
    Développeur Web
    Inscrit en
    Mars 2007
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2007
    Messages : 192
    Par défaut
    Il vous manque les autorisations de modification et de lecture des données de géométrie

Discussions similaires

  1. [Java3D] Problème d'update de la view d'une scene 3D
    Par wolfgangouille dans le forum 3D
    Réponses: 0
    Dernier message: 21/01/2011, 04h51
  2. problème picking jogl
    Par Clilmbatize dans le forum 3D
    Réponses: 5
    Dernier message: 09/09/2010, 16h30
  3. [Java3D] Problème de Picking
    Par Casano dans le forum 3D
    Réponses: 8
    Dernier message: 28/04/2010, 15h19
  4. java3D problème de bibliothèque
    Par ancrou dans le forum NetBeans
    Réponses: 2
    Dernier message: 09/12/2007, 15h28
  5. Réponses: 4
    Dernier message: 03/11/2007, 23h34

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