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 : probleme de pickage d objet dans une scene trois 3D [ Multimédia / Java3D ] (ESISA00)

lundi 9 juin 2008 à 15:11:14 | probleme de pickage d objet dans une scene trois 3D

ESISA00

bonjour ,
je suis entrain de réaliser une application en java 3D tout en chargeant des avatar en x3d en utilisant l API xj3d le probleme c'est que j'ai un avatar en trois 3D dans ma scene je lui rajoute un item (box ) de petite taille je peux utilisé plusieur box si je veux dans le corp de l avatar mainteant je veux que lorsque j insert la box elle doit savoir sur quelle point 3D elle est mise et elle reste toujours en parallele avec le corp dans le point mentionner
voici la classe dans la quelle j ai le prob (ItemCube) :



package Manequin.x3DTools;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.picking.*;
import com.sun.j3d.loaders.Scene;
import org.ietf.uri.ContentHandlerFactory;
import org.ietf.uri.FileNameMap;
import org.ietf.uri.URI;
import javax.media.j3d.*;
import javax.vecmath.*;

import org.web3d.j3d.loaders.X3DLoader;
import org.web3d.vrml.renderer.j3d.browser.*;
import java.net.*;
import java.io.* ;
import java.util.* ;
import java.awt.*;
import java.awt.event.*;

import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.image.TextureLoader;

import javax.media.j3d.*;
import javax.vecmath.*;
import javax.media.j3d.GeometryArray;

public class ItemCube extends Item{
    private Appearance at;
    private TransformGroup objPos;
    private float rayon = 0.015F;
    private Point3d p;
    private Material m;
    private Box b;
    private Color3f cS = new Color3f(1.0F,1.0F,0.0F);
     private Color3f cU = new Color3f(0.0F,1.0F,1.0F);
     private Transform3D tr;
     private CanvasX3D c;
     private Scene scene;
    
     
     
public ItemCube(){    
        at =new Appearance();
        m = new Material();
        m.setDiffuseColor(new Color3f(0.0F,1.0F,1.0F));
        m.setCapability(Material.ALLOW_COMPONENT_READ);
        m.setCapability(Material.ALLOW_COMPONENT_WRITE);
        at.setMaterial(m);
        Transform3D tr = new Transform3D();
        objPos = new TransformGroup(tr);
        objPos.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
        objPos.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
        objPos.setTransform(tr);
        objPos.addChild(b);
    TextureLoader loader = new TextureLoader("c:\\img0095.jpg","", new Container());
    Texture texture = loader.getTexture();
    at.setTexture(texture);
    TextureAttributes texAttr = new TextureAttributes();
    at.setTextureAttributes(texAttr);
    Box b=new Box(0.03f,0.03f,0.03f,Box.GENERATE_TEXTURE_COORDS,at);
    objPos.addChild(b);  
    setCapability(BranchGroup.ALLOW_DETACH);
    addChild(objPos);
   
}

public void setSelected() {
    m.setDiffuseColor(cS);
  }
 
  public void setUnselected() {
    m.setDiffuseColor(cU);
  }

  public Point3d getPosition() {
    return(new Point3d(p));
  
  }
 
  public void setPosition(Point3d p) {
    this.p = new Point3d(p);
    Transform3D tr = new Transform3D();
    tr.setTranslation(new Vector3d(p.x,p.y,p.z));
    objPos.setTransform(tr);
  }
 
  public void saveToX3DFile(X3DFile file) {
    file.ecrireDebutTagTranslation(p);
    file.ecrireDebutTagGroup();
    file.ecrireDebutTagShape();
    file.ecrireDebutTagAppearance();
    file.ecrireTagMaterial(0.2F,
                           new Color3f(0.0F,0.0F,0.0F),
                           cU,
                           new Color3f(1.0F,1.0F,1.0F),
                           0.5,
                           0.0);
    file.ecrireFinTagAppearance();
    file.ecrireTagSphere(rayon);
    file.ecrireFinTagShape();
    file.ecrireFinTagGroup();
    file.ecrireFinTagTranslation();
  }

}





**********************************************************


voici la classe item :
public abstract class Item extends BranchGroup {

  public abstract void setSelected();
  public abstract void setUnselected();
  public abstract Point3d getPosition();
  public abstract void setPosition(Point3d p);
  public abstract void saveToX3DFile(X3DFile f);
}

**********************************************************

voici la classe CanvasX3D

public class CanvasX3D extends Canvas3D
                       implements MouseListener,
                                  MouseMotionListener,
                                  ActionListener {

  private MouseMyTranslate mT;
  private View view;
  private SimpleUniverse u;
  private BranchGroup mnq;
  private GraphicsConfiguration config;
  private PickCanvas pickCanvas;
  private TransformGroup objTrans;
  private Scene scene;
  private Hashtable htn;
  private Node body;
  private MenuItem mai;
  private MenuItem msi;
  private Point3d p2;
  private Node n;
  private boolean onMove = false;
  public Vector items;
  private Class item;
 
 
  public CanvasX3D(String filename,Class item) {
    super(SimpleUniverse.getPreferredConfiguration());
    this.item = item;
    config = SimpleUniverse.getPreferredConfiguration();
    u = new SimpleUniverse(this);
    u.getViewingPlatform().setNominalViewingTransform();
    view = u.getViewer().getView();
    view.setProjectionPolicy(View.PARALLEL_PROJECTION);
    view.setBackClipDistance(100.0);
    view.setFrontClipDistance(0.1);
    u.addBranchGraph(mnq = createSceneGraph(filename,u));
    addMouseListener(this);
    addMouseMotionListener(this);
    items = new Vector();   
    pickCanvas = new PickCanvas(this,mnq);
    pickCanvas.setMode(PickCanvas.GEOMETRY);
    pickCanvas.setTolerance(0.0F);
  }
 
  public void loadX3DFile(String filename) {
    BranchGroup newMnq = createSceneGraph(filename,u);
    u.getLocale().addBranchGraph(newMnq);
    u.getLocale().removeBranchGraph(mnq);
    mnq = newMnq;
    pickCanvas = new PickCanvas(this,mnq);
    pickCanvas.setMode(PickCanvas.GEOMETRY);
    pickCanvas.setTolerance(0.0F);
  }
 
  public BranchGroup loadFile(String file) {
    BranchGroup sceneGroup = null;
    if ( file == null ) {
      sceneGroup = new BranchGroup();
      sceneGroup.setCapability(BranchGroup.ALLOW_DETACH);
      sceneGroup.setCapability(BranchGroup.ALLOW_BOUNDS_READ);
      sceneGroup.compile();
      return(sceneGroup); }
    X3DLoader loader = new X3DLoader(X3DLoader.LOAD_ALL);
    File f = new File(file);
    if ( f.exists() && !f.isFile() ) {
      System.out.println("Can't load directories specified");
      System.exit(1); }
    URL url = null;
    scene = null;
    try {
      url = new URL(file); }
    catch (MalformedURLException badUrl) { }
    try {
      if ( url != null )
        scene = loader.load(url);
        else
        scene = loader.load(file); }
    catch(Exception e) {
      System.out.println("Exception loading URL:" + e);
      e.printStackTrace();
      System.exit(0); }
    if ( scene != null ) {
      sceneGroup = scene.getSceneGroup();
      sceneGroup.setCapability(BranchGroup.ALLOW_DETACH);
      sceneGroup.setCapability(BranchGroup.ALLOW_BOUNDS_READ);
      Group geg =(Group) chercheGlobalEffectsGroup(sceneGroup);
      geg.removeAllChildren();
      htn = scene.getNamedObjects();
      body =(Node) htn.get("Body");
      sceneGroup.compile(); }
    return(sceneGroup);
  }

  private BranchGroup createSceneGraph(String filename,SimpleUniverse u) {
    BranchGroup objRoot = new BranchGroup();
    objRoot.setCapability(BranchGroup.ALLOW_DETACH);
    objRoot.setCapability(BranchGroup.ENABLE_PICK_REPORTING);
    objTrans = new TransformGroup();
    objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
    objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
    objTrans.setCapability(TransformGroup.ALLOW_CHILDREN_EXTEND);
    objTrans.setCapability(TransformGroup.ALLOW_CHILDREN_WRITE);
    objTrans.setCapability(TransformGroup.ALLOW_CHILDREN_READ);
    TransformGroup objPos = new TransformGroup();
    Transform3D tr = new Transform3D();
    tr.setTranslation(new Vector3d(0.0,0.0,0.0));
    objPos.setTransform(tr);
    objRoot.addChild(objPos);
    objPos.addChild(objTrans);
    objTrans.addChild(loadFile(filename));
    BoundingSphere largeBounds;
    largeBounds = new BoundingSphere(new Point3d(0.0,0.0,0.0),100.0);
    BoundingSphere smallBounds;
    smallBounds = new BoundingSphere(new Point3d(0.0,0.0,0.0),0.4);
    { Vector3f ldir = new Vector3f(1.0F,1.0F,-1.0F);
      Color3f lcouldl = new Color3f(1.0F,0.5F,0.5F);
      DirectionalLight dl = new DirectionalLight(lcouldl,ldir);
      dl.setInfluencingBounds(largeBounds);
      objRoot.addChild(dl); }
    { Color3f lcoulal = new Color3f(0.5F,0.5F,0.1F);
      AmbientLight al = new AmbientLight(lcoulal);
      al.setInfluencingBounds(largeBounds);
      objRoot.addChild(al); }
    { Point3f lpos = new Point3f(0.5F,0.0F,0.0F);
      Point3f laten = new Point3f(1.0F,1.0F,1.0F);
      Color3f lcoulpl = new Color3f(0.5F,1.0F,0.5F);
      PointLight pl = new PointLight(lcoulpl,lpos,laten);
      pl.setInfluencingBounds(largeBounds);
      objRoot.addChild(pl); }
    BoundingSphere bounds;
    bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0),10.0);

    { MouseMyScale behavior = new MouseMyScale(objTrans);
      objTrans.addChild(behavior);
      behavior.setSchedulingBounds(bounds); }

    { MouseMyTranslate mT = new MouseMyTranslate(objTrans);
      mT.setFactor(mT.getXFactor()/3.0);
      objTrans.addChild(mT);
      mT.setSchedulingBounds(bounds); }

    { MouseMyRotate behavior = new MouseMyRotate(objTrans);
      objTrans.addChild(behavior);
      behavior.setSchedulingBounds(bounds); }

    objRoot.compile();
    return(objRoot);
  }
 
  private void affichage(Node n,int niveau) {
    System.out.println(niveau+" "+n.getClass().getName());
    try {
      Group r =(Group) n;
      int nb = r.numChildren();
      for ( int i = 0 ; i < nb ; i++ ) {
        affichage(r.getChild(i),niveau+1); } }
    catch (Exception e) { }
  }
 
  private Light chercheLumiere(Node n) {
    try {
      Light l =(Light) n;
      return(l); }
    catch (Exception e) {
      try {
        Group r =(Group) n;
        int nb = r.numChildren();
        for ( int i = 0 ; i < nb ; i++ ) {
          Object o = chercheLumiere(r.getChild(i));
          if ( o != null )
            return((Light) o); } }
      catch (Exception ee) { } }
    return(null);
  }
 
  private Node chercheGlobalEffectsGroup(Node n) {
    if ( n.getClass().getName().equals("org.web3d.vrml.renderer.j3d.browser.GlobalEffectsGroup") )
      return(n);
    try {
      Group r =(Group) n;
      int nb = r.numChildren();
      for ( int i = 0 ; i < nb ; i++ ) {
        Object o = chercheGlobalEffectsGroup(r.getChild(i));
        if ( o != null )
          return((Node) o); } }
    catch (Exception ee) { }
    return(null);
  }
 
  public void affichageGrapheDeScene(Node mnq) {
    affichage(mnq,0);
    Light l = chercheLumiere(mnq);
    l.setEnable(false);
  }
 
  public void affichageGrapheDeScene() {
    affichageGrapheDeScene(mnq);
  }
 
  public Point3d calculCoordEcran(PickResult result,int i,Transform3D tt) {
    PickIntersection pi = result.getIntersection(i);
    Point3d pt = new Point3d(pi.getPointCoordinatesVW());
    tt.transform(pt);
    return(pt);
  }
 
  public Point3d calculCoordReel(PickResult result,int i) {
    PickIntersection pi = result.getIntersection(i);
    Point3d p2 = new Point3d(pi.getPointCoordinatesVW());
    Transform3D t = new Transform3D();
    objTrans.getTransform(t);
    t.invert();
    t.transform(p2);
    return(p2);
  }

  public  Point3d getMouseClickedBodyPosition(MouseEvent e) {
    return(getMouseClickedBodyPosition(e.getX(),e.getY()));
  }

  public Point3d getMouseClickedBodyPosition(int x,int y) {
    pickCanvas.setShapeLocation(x,y);
    PickResult [] result = pickCanvas.pickAll();
    Transform3D tt = new Transform3D();
    getVworldToImagePlate(tt);
    Point3d p2 = null;
    if ( result != null ) {
      double v = -100000.0;
      for ( int j = 0 ; j < result.length ; j++ ) {
        PickResult rslt = result[j];
        Shape3D s =(Shape3D) rslt.getNode(PickResult.SHAPE3D);
        if ( s != null ) {
          Node n = s.getParent().getParent();
          if ( n == body ) {
            for ( int i = 0 ; i < rslt.numIntersections() ; i++ ) {
              Point3d pt = calculCoordEcran(rslt,i,tt);
              if ( pt.z > v ) {
                v = pt.z;
                p2 = calculCoordReel(rslt,i); } } } } } }
    return(p2);
  }
 
  public void mouseClicked(MouseEvent e) {
     pickCanvas.setShapeLocation(e);
    PickResult result = pickCanvas.pickClosest();
    Transform3D tt = new Transform3D();
    getVworldToImagePlate(tt);
    if ( result != null ) {
      p2 = calculCoordReel(result,0);
      Point3d pt = calculCoordEcran(result,0,tt);
      double v = pt.z;
      for ( int i = 1 ; i < result.numIntersections() ; i++ ) {
        pt = calculCoordEcran(result,i,tt);
        if ( pt.z > v ) {
          v = pt.z;
          p2 = calculCoordReel(result,i); } }
     
      Primitive p =(Primitive) result.getNode(PickResult.PRIMITIVE);
      if ( p != null ) {
        if ( e.getButton() == MouseEvent.BUTTON3 ) {
          n = p.getParent().getParent();
          PopupMenu pm = new PopupMenu();
          msi = new MenuItem("Supprimer item");
          msi.addActionListener(this);
          this.add(pm);
          pm.add(msi);
          pm.show(this,e.getX(),e.getY());
          return; } }
      Shape3D s =(Shape3D) result.getNode(PickResult.SHAPE3D);
      if ( s != null ) {
        n = s.getParent().getParent();
        if ( e.getButton() == MouseEvent.BUTTON3 ) {
          if ( n == body ) {
            PopupMenu pm = new PopupMenu();
            mai = new MenuItem("Ajouter item");
            mai.addActionListener(this);
            this.add(pm);
            pm.add(mai);
            pm.show(this,e.getX(),e.getY());
            return; } } } }
  }
 
  public void mouseEntered(MouseEvent e) {
  }
 
  public void mouseExited(MouseEvent e) {
  }
 
  public void mousePressed(MouseEvent e) {
    pickCanvas = new PickCanvas(this,mnq);
    pickCanvas.setMode(PickCanvas.GEOMETRY);
    pickCanvas.setTolerance(0.0F);
    pickCanvas.setShapeLocation(e);
    PickResult result = pickCanvas.pickClosest();
    Transform3D tt = new Transform3D();
    getVworldToImagePlate(tt);
    if ( result != null ) {
      p2 = calculCoordReel(result,0);
      Point3d pt = calculCoordEcran(result,0,tt);
      double v = pt.z;
      for ( int i = 1 ; i < result.numIntersections() ; i++ ) {
        pt = calculCoordEcran(result,i,tt);
        if ( pt.z > v ) {
          v = pt.z;
          p2 = calculCoordReel(result,i); } }
     
      Primitive p =(Primitive) result.getNode(PickResult.PRIMITIVE);
      if ( p != null ) {
        if ( e.getButton() == MouseEvent.BUTTON1 ) {
          onMove = true;
          n = p.getParent().getParent();
          ((Item) n).setSelected();
          return; } } }
  }
 
  public void mouseReleased(MouseEvent e) {
    if ( ( onMove ) && ( e.getButton() == MouseEvent.BUTTON1 ) ) {
      onMove = false;
      ((Item) n).setUnselected(); }
  }

  public void mouseDragged(MouseEvent e) {
    if ( onMove ) {
      Point3d pm = getMouseClickedBodyPosition(e);
      if ( pm != null ) {
        ((Item) n).setPosition(pm); } }
  }
 
  public void mouseMoved(MouseEvent e) {
  }   

  private void ajouterItem() {
    try {
      Item it =(Item) item.newInstance();
      it.setPosition(p2);
      objTrans.addChild(it);
      items.add(it);
       
    }
    catch(Exception e) {
      System.out.println("Erreur "+e);
      }
  }

  private void supprimerItem() {
    BranchGroup bg =(BranchGroup) n;
    ((Group) bg.getParent()).removeChild(n);
    items.remove(bg);
  }

  public void actionPerformed(ActionEvent e) {
    if ( e.getSource() == mai ) {
      ajouterItem();
      return; }
    if ( e.getSource() == msi ) {
      supprimerItem();
      return; }
  }

 
  public void sauverFichierItems(String filename) {
    try {
      X3DFile file = new X3DFile(filename);
      file.ecrireEntete();
      file.ecrireDebutTagX3D();
      file.ecrireDebutTagScene("Scene");
      for ( int i = 0 ; i < items.size() ; i++ )
        ((Item) items.elementAt(i)).saveToX3DFile(file);
      file.ecrireFinTagScene();
      file.ecrireFinTagX3D();
      file.close();
     
    }
    catch(Exception e) {
      System.out.println(e); }
  }
}



Cette discussion est classé dans : public, file, private, 0f, if


Répondre à ce message

Sujets en rapport avec ce message

Problème de référence de classe JTable [ par tihon ] En fait, mon but est d'afficher le résultat d'une requête dans un JTable et ensuite, en appuyant sur un bouton de récupérer, dans un premier temps, la Besoin correction: erreur lecture fichier wav [ par Sw1tch ] Rebonsoir, je viens à nouveau vous embeter avec mes questions ;-)J'ai programmé une petite classe sound pour lire facilement des fichiers wav mais[vou layout et reactualisation... [ par alexglvr ] Bonjour,je suis en train de faire un prg en java avec une interface utilisateur. une JFrame (VisionPG1) contient une TabbedPanel (TP). Cette TabbedPan Erreur d'execution: java.lang.NullPointerException [ par amjad ] A la compilation d'un projet java3D j'obtient le message d'erreur suivant :Exception in thread "main" java.lang.NullPointerException at javax.vecmath pb de thread [ par hysteria ] salut all, je n'ai jamais utilise des thread mais g qd meme essaye, mais mon applet ne se rafraichit pas :(. Comme c cense etre un compte a rebours, s Ben, j'ai pas bien compris... [ par AbriBus ] Bonjour/bonsoir à tous,Voila, j'ai un petit probleme qui se situe entre l'écriture d'un fichier a partir d'un tableau de byte et l'utilisation d'un By Permier écouteur [ par fafa00 ] HelloVoici mon problème :Je veux récupérer du texte dans un JTextField et l'écrire à l'envers dans un JLabel en cliquant sur un bouton.Voici mon code RPG Java : Problème de Chargement Graphique [ par Torog ] Bonjour ! Je travaille actuellement sur un jeu de labyrinthe/RPG en java, et j'ai un problème à résoudre. En fait, quand je démarre le jeu, et à chaqu Barre progression via thread [ par fred889944 ] Bonjour, j'aimerais afficher une barre de progression pendant l'execution d'une fonction nommée TOTO (son temps d'execution est relativement long)... pb mon lecteur Video bouffe toutes mes ressources [ par nomad56 ] salut, j'ai piqué du code un peu partout sur ce site pour coder mon petit player. Il marche super bien (relativement) sauf que il reste un PB : cert


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



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,203 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é.