Voici la classe comme promis :
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 :
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) :
this.sphereHaute.setUserData(this);
Ma methode getCamera() est la suivante (dans ma classe regleVisuelle) :
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 :
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 :
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.
Partager