Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : java 3d: un objet qui suit le deplacement de la souris [ Archives / Java2D et java3D ] (sajaris)

vendredi 18 novembre 2005 à 20:02:30 | java 3d: un objet qui suit le deplacement de la souris

sajaris

salut,

j'ai un probleme et j'espere trouver la solution ici. j'essai dadapter la position d'un objet au deplacement de la souris. en quelque sorte je clique sur l'objet et quand je deplace la souris l'objet sur lequel j'ai cliqué se deplacement en meme tant que la souris mais reste derriere la souris ( pas comme un PickTranslateBehavior ou l'objet se deplace uniquement sans prendre compte de la position de la souris).

bon voila un exemple de ce que j'ai deja fait mais si quelqu'un a deja une meilleur, merci de me le donner.le probleme de mon code est que certain objet suivent la souris et d'autre non:

[code]
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.applet.MainFrame;
import javax.media.j3d.*;
import javax.vecmath.*;
import java.awt.*;
import java.applet.*;
//import com.sun.j3d.utils.behaviors.mouse.*;
import java.util.Enumeration;
import java.awt.event.*;
import com.sun.j3d.utils.picking.*;
//import com.sun.j3d.utils.picking.behaviors.*;
//import java.awt.event.*;
//import javax.swing.*;
//import java.util.Vector;
import com.sun.j3d.utils.picking.PickTool;


public class try1 extends Applet
{
 public try1() 
 {
  Canvas3D canvas=new Canvas3D(SimpleUniverse.
  getPreferredConfiguration());
  setLayout(new BorderLayout());
  add("Center",canvas);
  
  SimpleUniverse universe=new SimpleUniverse(canvas);
  
  BranchGroup scene=CreateScene(canvas);
  
  universe.getViewingPlatform().setNominalViewingTransform();
  universe.addBranchGraph(scene);
 }
 
 public BranchGroup CreateScene(Canvas3D canvas)
 {
  BranchGroup root=new BranchGroup();
        BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
  TransformGroup tg=new TransformGroup();
  TransformGroup tg1=new TransformGroup();
  TransformGroup tg2=new TransformGroup();
  TransformGroup tg3=new TransformGroup();
  tg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  tg.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
//  tg.setCapability(TransformGroup.ALLOW_CHILDREN_READ);
  tg2.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  tg2.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
//  tg2.setCapability(TransformGroup.ALLOW_CHILDREN_READ);
  tg3.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  tg3.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
//  tg3.setCapability(TransformGroup.ALLOW_CHILDREN_READ);
  tg1.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  tg1.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
  tg1.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
  
  Transform3D t3d=new Transform3D();
  
  t3d.set(new Vector3d(0,0.3,0));
  tg2.setTransform(t3d);
  
  t3d.set(new Vector3d(0,-0.3,0));
  tg3.setTransform(t3d);

  MyBeh be=new MyBeh(canvas,root,tg);
  be.setSchedulingBounds (bounds);    
  root.addChild(be);

  MyBeh be1=new MyBeh(canvas,root,tg1);
  be1.setSchedulingBounds (bounds);    
  root.addChild(be1);

  MyBeh be2=new MyBeh(canvas,root,tg2);
  be2.setSchedulingBounds (bounds);    
  root.addChild(be2);

  MyBeh be3=new MyBeh(canvas,root,tg3);
  be3.setSchedulingBounds (bounds);    
  root.addChild(be3);

//Points du CARRE1
  Point3f point1=new Point3f(-0.3f,0.1f,0.0f);
  Point3f point2=new Point3f(-0.3f,-0.1f,0.0f);
  Point3f point3=new Point3f(-0.2f,-0.1f,0.0f);
  Point3f point4=new Point3f(-0.2f,0.1f,0.0f);
//Points du CARRE2 
  Point3f point5=new Point3f(-0.1f,0.1f,0f);
  Point3f point6=new Point3f(-0.1f,-0.1f,0f);
  Point3f point7=new Point3f(0.1f,-0.1f,0f);
  Point3f point8=new Point3f(0.1f,0.1f,0f);

  GeometryArray pa1=new QuadArray(4,PointArray.COORDINATES| PointArray.BY_REFERENCE);
  GeometryArray pa2=new QuadArray(4,PointArray.COORDINATES| PointArray.BY_REFERENCE);
  Shape3D sh1;
  Shape3D sh2;
  
  pa1.setCapability(GeometryArray.ALLOW_REF_DATA_WRITE);
  pa1.setCapability(GeometryArray.ALLOW_REF_DATA_READ);
  pa1.setCapability(GeometryArray.ALLOW_COUNT_READ); 
  pa1.setCoordRef3f(new Point3f[]{point1,point2,point3,point4});

  pa2.setCapability(GeometryArray.ALLOW_REF_DATA_WRITE);
  pa2.setCapability(GeometryArray.ALLOW_REF_DATA_READ);
  pa2.setCapability(GeometryArray.ALLOW_COUNT_READ); 
  pa2.setCoordRef3f(new Point3f[]{point5,point6,point7,point8});
  
//CARRE1 a gauche fils de tg1 
  sh1=new Shape3D(pa1);
//CARRE2 au centre fils de tg   
  sh2=new Shape3D(pa2);
//CUBE1 en HAUT, fils de tg2   
  ColorCube cube1=new ColorCube(0.05f);
//CUBE2 EN BAS fils de tg3
  ColorCube cube2=new ColorCube(0.05f);
  
//  Node sphere=new Sphere(0.05f);
  //il faut appliquer le PickTool.setCapabilities(Node,int)
  // sur le Node concerné lorsque un
  //pickIntersection doit se faire sur ce node.sinon erreur
  PickTool.setCapabilities(cube1, PickTool.INTERSECT_FULL);
  PickTool.setCapabilities(cube2, PickTool.INTERSECT_FULL);
  PickTool.setCapabilities(sh1, PickTool.INTERSECT_FULL);
  PickTool.setCapabilities(sh2, PickTool.INTERSECT_FULL);
//  PickTool.setCapabilities(sphere, PickTool.INTERSECT_FULL);

   root.addChild(tg1);
  root.addChild(tg2);
  root.addChild(tg3);
  root.addChild(tg);
  
  tg.addChild(sh2);  
  tg1.addChild(sh1);
  tg2.addChild(cube1);
  tg3.addChild(cube2);
  
  
  Vector3f lightdirection=new Vector3f(0.0f,0.0f,-15.0f);
  Color3f lightcolor=new Color3f(0.0f,1.0f,6.0f);
  DirectionalLight dl=new DirectionalLight(lightcolor,lightdirection);
  BoundingSphere bound=new BoundingSphere(new Point3d(),150.0f);
  dl.setInfluencingBounds(bound);
  root.addChild(dl);

  root.compile();
  return root;
 }
 
 public static void main(String[] args)
 {
  new MainFrame(new try1(),args,150,150);
 }
 
}

/*********************************************/
/*********************************************/
class MyBeh extends Behavior
{
 WakeupCriterion clic=new WakeupOnAWTEvent(MouseEvent.MOUSE_PRESSED);
 WakeupCriterion drag=new WakeupOnAWTEvent(MouseEvent.MOUSE_DRAGGED);
 WakeupCondition wakeupOr=new WakeupOr(new WakeupCriterion[]{clic,drag});
 Canvas3D canvas;
 Transform3D t =new Transform3D();
 TransformGroup tg=new TransformGroup();
 Vector3d v=new Vector3d(0,0,0);
 PickCanvas pickCanvas;
 PickResult pickResult;
 Point3d intPt=new Point3d(0,0,0);
 Point3d floatPt=new Point3d(0,0,0);
 Transform3D t3=new Transform3D();
 
 public MyBeh(Canvas3D canvas,BranchGroup scene,TransformGroup tg)
 {
     pickCanvas = new PickCanvas(canvas, scene);
     pickCanvas.setMode(PickTool.GEOMETRY_INTERSECT_INFO);
     pickCanvas.setTolerance(4.0f);
  this.canvas=canvas;
  tg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  tg.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
  tg.setCapability(TransformGroup.ALLOW_CHILDREN_READ);
  this.tg=tg;
 }
 
 public void initialize()
 {
  wakeupOn(wakeupOr);
 }
 
 public void processStimulus (Enumeration criteria)
 {
  WakeupCriterion wakeup;
  AWTEvent[] events;
  
  while(criteria.hasMoreElements())
  {
   wakeup=(WakeupCriterion)criteria.nextElement();
   if(wakeup instanceof WakeupOnAWTEvent)
   {
    events=((WakeupOnAWTEvent)wakeup).getAWTEvent();
    for(int i=0;i<events.length;i++)
    {
//TRANSLATE     
     if((events[i].getID()==MouseEvent.MOUSE_PRESSED || events[i].getID()==MouseEvent.MOUSE_DRAGGED)&&
     !((MouseEvent)events[i]).isControlDown() &&
     !((MouseEvent)events[i]).isMetaDown() &&
     !((MouseEvent)events[i]).isAltDown())
     {
      int x=((MouseEvent)events[i]).getX();
      int y=((MouseEvent)events[i]).getY();
      System.out.println("Coordinates of Mouse: "+new Point2d(x,y));
      //marque le point de clic
      pickCanvas.setShapeLocation(x,y);
      //Point a partir duquel le rayon commencera a detecté le point le plus proche
      //ce point est la distance ou est placé l'oeil de l'observateur
      //ainsi le rayon detecteur est lancé a parit de ce point donc on est sur q'aucun pointt
      //n'est epargné
      Point3d eyePos=pickCanvas.getStartPosition();
      pickResult=pickCanvas.pickClosest();
      
      if(pickResult!=null && pickResult.getObject()==tg.getChild((tg.numChildren())-1))
      {
       PickIntersection pi=
       pickResult.getClosestIntersection(eyePos);
       
       intPt=pi.getPointCoordinatesVW();
       intPt.z=0;
       floatPt.x=intPt.x;
       floatPt.y=intPt.y;
       v.set(intPt);
       t3.set(v);
       tg.setTransform(t3);

      System.out.println("Coordinates of pick intersection\n: "+intPt);
      System.out.println("Coordinates of eyePos: "+eyePos);
      }
     }
/*//ZOOM      
     if((events[i].getID()==MouseEvent.MOUSE_PRESSED || events[i].getID()==MouseEvent.MOUSE_DRAGGED)&&
     ((MouseEvent)events[i]).isControlDown() &&
     !((MouseEvent)events[i]).isMetaDown() &&
     !((MouseEvent)events[i]).isAltDown())
     {
      int x=((MouseEvent)events[i]).getX();
      int y=((MouseEvent)events[i]).getY();
      System.out.println("Coordinates of Mouse: "+new Point2d(x,y));
      //marque le point de clic
      pickCanvas.setShapeLocation(x,y);
      //Point a partir duquel le rayon commencera a detecté le point le plus proche
      //ce point est la distance ou est placé l'oeil de l'observateur
      //ainsi le rayon detecteur est lancé a parit de ce point donc on est sur q'aucun pointt
      //n'est epargné
      Point3d eyePos=pickCanvas.getStartPosition();
      pickResult=pickCanvas.pickClosest();
      
      if(pickResult!=null)
      {
       PickIntersection pi=
       pickResult.getClosestIntersection(eyePos);
       
       intPt=pi.getPointCoordinatesVW();
       intPt.x=0;
       intPt.y=0;
       v.set(intPt);
       t3.set(v);
       tg.setTransform(t3);

      System.out.println("Coordinates of pick intersection\n: "+intPt);
      System.out.println("Coordinates of eyePos: "+eyePos);
      }

      System.out.println("\n\n********************************************************");
      System.out.println("********************************************************");
      System.out.println("********************************************************");
     }*/
    }
   }
  }
  
  wakeupOn(wakeupOr);
 } 
}
/************************************************/
/************************************************/


Merci de m'aider




Cette discussion est classé dans : tg, allow, transformgroup, setcapability, point3f


Répondre à ce message

Sujets en rapport avec ce message

A l'aide 3d !!!! Pitié !!! [ par omcougar ] Bonjour,je commence a capter globalement  comment fonctionne la 3D sous javajusque la j'ai réussi à creer quelques petits objets et à les animer....ma java 3D : limite de déplacement d'objet [ par JavaFab ] Bonjour, J'ai un petit souci en Java3D. J'ai crée une scene avec un Cube de type simple (ColorCube) et un MouseTranslate afin de pouvoir le déplacer. modelisation d'une voiture mais probleme de texture [ par Topgun89 ] Bonjour à tousJe me suis mis au java3d et je me suis modeleise une voiture avec cette methodeint tab[]=new int[1]; tab[0]=26; charger un fichier au format 3DS [ par julienlll ] Salute, je suis en train d'écrire un programme java3D qui permet de visualiser des Modeles numeriques de terrain (MNT) (modèle 3d d'un terrain).J'ai r Java3D : 2 shape3D dans un meme TG d'apparence differente [ par assuryan ] Bonjour, voila mon probleme : grace a un loadeur, je recupere les vertex d'un fichier 3DS. pour toutes les scenes     Shape3D fleur = null;     Shap Importation et affichage de .obj [ par The_Moye ] Salut! Donc, je sais importer et afficher un .obj ds une scène, mais je ne vois pas comment en afficher plusieurs... Faut-il se créer un loader par .


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Appels d'offres



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,218 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.