Affichage d'object .obj dans un canvas3D

Résolu
bimane - 12 mars 2013 à 13:48
 Utilisateur anonyme - 13 mars 2013 à 17:21
Bonjour ,
je suis une débutante sur java3D j'ai reussi a afficher un canvas3D mais j'arrive pas à charger une image *.obj l'afficher dans ce canvas3D en appuiant sur un bouton parcourir voila ce que j'ai utilisé :
if (e.getSource()==parcourir) {
// try {
JFileChooser fd = new JFileChooser("Répertoire de l'image:");
fd.setVisible(true);
fd.showOpenDialog(null);
filename = "maison.max";
int dim = ObjectFile.RESIZE;
ObjectFile f = new ObjectFile(dim,
(float)(creaseAngle * Math.PI / 180.0));
Scene s = null;
try
{
System.out.println("bn,");
s = f.load(filename);
}
catch (FileNotFoundException evt)
{
System.err.println(e);
System.exit(1);
}
catch (ParsingErrorException evt)
{
System.err.println(e);
System.exit(1);
}
catch (IncorrectFormatException evt)
{
System.err.println(e);
System.exit(1);
}
Merci pour votre aide

31 réponses

Utilisateur anonyme
13 mars 2013 à 17:19
Au moins on voit une trace d'exception. Vous ne comprenez pas le code que vous essayez d'utiliser. Il faut créer l'objet ObjectFile à partir du chemin vers le fichier qui est sur votre bureau. Là, vous voyez bien que ça prend le chemin de l'exemple, c'est normal que le fichier ne soit pas trouvé. De plus, vous n'avez pas compris la documentation de setBackClipDistance et setFrontClipDistance ni le concept de frustum. Si vous mettez vos plans au même endroit, vous ne verrez rien du tout.



























T.U.E.R (First Person Shooter créé par Julien Gouesse)
3
cs_AlexN Messages postés 694 Date d'inscription lundi 5 décembre 2005 Statut Membre Dernière intervention 8 janvier 2014 19
13 mars 2013 à 10:03
Bonjour,

Et l'erreur est ? FileNotFoundException , ParsingErrorException, IncorrectFormatException ou autre chose ?
Que dit la console ? Est-ce qu'il y a une trace de la pile d'exécution (StackTrace) ?

Dire "ça marche po", ne suffit pas à comprendre ce qui ne va pas et ne permet pas de t'aider.
Merci pour ton aide ;o)
0
Bonjour pour etre précise voila mon erreur :

Exception in thread "AWT-EventQueue-0" java.lang.UnsupportedOperationException: Not supported yet.
at testobject.Test.mouseEntered(Test.java:144)
at java.awt.AWTEventMulticaster.mouseEntered(AWTEventMulticaster.java:283)
at java.awt.Component.processMouseEvent(Component.java:6298)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6054)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4652)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4482)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
at java.awt.LightweightDispatcher.trackMouseEnterExit(Container.java:4366)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4220)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Component.dispatchEvent(Component.java:4482)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:644)
at java.awt.EventQueue.access$000(EventQueue.java:85)
at java.awt.EventQueue$1.run(EventQueue.java:603)
at java.awt.EventQueue$1.run(EventQueue.java:601)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
at java.awt.EventQueue$2.run(EventQueue.java:617)
at java.awt.EventQueue$2.run(EventQueue.java:615)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:614)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

et voila ma classe :
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package testobject;

import com.sun.j3d.loaders.IncorrectFormatException;
import com.sun.j3d.loaders.ParsingErrorException;
import com.sun.j3d.loaders.Scene;
import com.sun.j3d.loaders.objectfile.ObjectFile;
import java.awt.*;
import java.awt.event.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
// classes Java 3D
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.universe.SimpleUniverse;
import javax.media.j3d.*;
import java.awt.image.*;
import javax.vecmath.*;
import java.util.*;
import com.sun.j3d.utils.picking.behaviors.*;
import com.sun.j3d.utils.picking.*;
import java.io.FileNotFoundException;

public class Test extends Frame implements MouseListener,MouseMotionListener{

Canvas3D canvas3D = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
SimpleUniverse simpleU= new SimpleUniverse(canvas3D); ;
private double creaseAngle = 60.0;
private String filename;


BoundingSphere behaveBounds = new BoundingSphere();
JButton parcourir;
Panel pan;

public Test(){
super("Test de l'application :p :p" );
setLayout(new BorderLayout());
Panel framepane=new Panel();
framepane.setBackground(Color.cyan);
this.add(framepane);
framepane.setLayout(null);
this.setSize(500,500);
this.setVisible(true);


Panel panel=new Panel();
panel.setLayout(new BorderLayout());panel.setBackground(Color.blue);
panel.setSize(500,500);panel.setLocation(120,40);
pan=new Panel();pan.setLayout(null);
pan.setBackground(Color.yellow);
JSeparator sep = new JToolBar.Separator();
sep.setBackground(Color.blue);
sep.setOpaque(true);
panel.add(pan);
panel.setLocation(140, 80);
pan.add(canvas3D);
pan.setSize(300,300);canvas3D.setSize(300,500);




canvas3D.setLocation(pan.getLocation());
canvas3D.setBackground(Color.red);
framepane.add(panel);


//---creation des boutons
parcourir=new JButton("Parcourir." );parcourir.addMouseListener(this);
parcourir.setSize(100,30);parcourir.setLocation(30,10);
framepane.add(parcourir);
this.setSize(500,500);this.setVisible(true);

}
//--------------------------


public void mouseClicked(MouseEvent e){



if (e.getSource()==parcourir) {
// try {
JFileChooser fd = new JFileChooser("Répertoire de l'image:");
fd.setVisible(true);
fd.showOpenDialog(null);
filename = "C:\\imane\\desktop\\wateringcan.obj";
int dim = ObjectFile.RESIZE;
ObjectFile f = new ObjectFile(dim,
(float)(creaseAngle * Math.PI / 180.0));
Scene s = null;
try
{
System.out.println("bn,");
s = f.load(filename);
}
catch (FileNotFoundException evt)
{
System.err.println(e);
System.exit(1);
}
catch (ParsingErrorException evt)
{
System.err.println(e);
System.exit(1);
}
catch (IncorrectFormatException evt)
{
System.err.println(e);
System.exit(1);
}


}

rafraichir();
}

//-------------------------------------
public void rafraichir(){
}


public void mouseReleased(MouseEvent e){canvas3D.repaint() ;}


public void mouseMoved(MouseEvent e){}
//ajouter des spheres a notre univers

//-------methode main
public static void main(String args[]){
Test myApp=new Test();
}

public void mousePressed(MouseEvent e) {
throw new UnsupportedOperationException("Not supported yet.");
}

public void mouseEntered(MouseEvent e) {
throw new UnsupportedOperationException("Not supported yet.");
}

public void mouseExited(MouseEvent e) {
throw new UnsupportedOperationException("Not supported yet.");
}

public void mouseDragged(MouseEvent e) {
throw new UnsupportedOperationException("Not supported yet.");
}


}
0
J'ai essayé de résoudre cette erreur mais là j'ai une autre et il n'affiche toujours rien
l'erreur :run:

java.awt.event.MouseEvent[MOUSE_CLICKED,(46,20),absolute(84,60),button=1,modifiers=Button1,clickCount=1] on javax.swing.JButton[,30,10,100x30,alignmentX=0.0,alignmentY=0.5,border=javax.swing.plaf.BorderUIResource$CompoundBorderUIResource@bb0d0d,flags=296,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=2,left=14,bottom=2,right=14],paintBorder=true,paintFocus=true,pressedIcon=,rolloverEnabled=true,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=Parcourir.,defaultCapable=true]
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
13 mars 2013 à 12:42
Bonjour

Le modèle au format WaveFront OBJ doit être dans le frustum sinon vous ne verrez absolument rien.

Vous devez utiliser View.setBackClipDistance() et View.setFrontClipDistance().




















T.U.E.R (First Person Shooter créé par Julien Gouesse)
0
cs_AlexN Messages postés 694 Date d'inscription lundi 5 décembre 2005 Statut Membre Dernière intervention 8 janvier 2014 19
13 mars 2013 à 13:01
Re,

Il faut bien comprendre que si ton IDE (interface de programmation, eclipse, netbeans ou autre) te permet d'indenter ton code et de le coloriser, c'est pour que tu puisses le lire correctement et comprendre ce que tu fais.
Comment veux-tu que je lise le torchon que tu as copier/coller (noir sur fond blanc et sans aucune indentation) ?
Utilises les balises de l'éditeur de message de ce site pour que ce soit lisible, s'il te plait.

at testobject.Test.mouseEntered(Test.java:144)


La stacktrace dit qu'il y a une erreur à la ligne 144. Qu'est-ce que cette ligne ? Tu penses qu'en plus de lire un torchon, je vais compter les lignes ?

at java.awt.AWTEventMulticaster.mouseEntered(AWTEventMulticaster.java:283)


Ta Frame implémente les interfaces MouseListener,MouseMotionListener et notamment la capture de l’événement MouseEntered, que tu gères comme ceci :

public void mouseEntered(MouseEvent e) {
   throw new UnsupportedOperationException("Not supported yet.");
} 


Ton programme marche bien.
Il capture l'évènement MouseEnter, et tu as demandé au gestionnaire de cet évènement de lever une exception de type UnsupportedOperationException. Et c'est bien ce qui se passe comme en atteste la première ligne de la stacktrace :

Exception in thread "AWT-EventQueue-0" java.lang.UnsupportedOperationException: Not supported yet.


Ton application n'est pas fausse mais incomplète. Il faut que tu ajoutes le code qui correspond à la capture de l’événement MouseEnter dans le gestionnaire, au lieu de lever une exception.

public void mouseEntered(MouseEvent e) {
   // Faire ce qui doit être fait en cas de clic
   // Et prier pour que ça marche ;o)
} 
0
Merci pour ta réponse j'ai bien résolu ce problème maintenant mais Mr gouessej m'as dis que je dois utiliser ces deux méthodes pour que mon objet sera visible dans le canvas View.setBackClipDistance() et View.setFrontClipDistance()
Je cherche comment les utiliser mais je n'arrive pas à trouver
ce sont des méthodes mais le contexte de ces méthodes je ne sais pas ce quoi ca doit contenir.
public void setFrontClipPolicy(int policy) {
      synchronized(this) {
         // Mais le code ici je ne sais pas ce que ca doit etre 
      }
      canvas3D.repaint();
    }


public int getFrontClipPolicy() {
return this.frontClipPolicy;
//et ce frontClipPolicy; je ne sais pas sa nature
}
Merci bcp
0
cs_AlexN Messages postés 694 Date d'inscription lundi 5 décembre 2005 Statut Membre Dernière intervention 8 janvier 2014 19
13 mars 2013 à 13:25
gouessej est plus qualifié que moi pour la partie 3D. Je n'y connais rien.
Enfin au moins une partie de ton problème est résolu. Tu avances, tant mieux
0
merci bcp
je cherche toujours
Bonne journée
0
Utilisateur anonyme
13 mars 2013 à 13:35
Je vous ai dit d'utiliser setBackClipDistance et setFrontClipDistance, pourquoi parlez-vous de setFrontClipPolicy? La documentation est ici (je suis désolé, la documentation de la version 1.6 de Java3D n'a pas encore été publiée à ma connaissance). Vous pouvez appeler votreCanvas.getView().setBackClipDistance().

Peut-être que simpleU.getViewingPlatform().setNominalViewingTransform() peut suffire.


















T.U.E.R (First Person Shooter créé par Julien Gouesse)
0
     if (e.getSource()==parcourir) {
               // try {
                    JFileChooser fd = new JFileChooser("Répertoire de l'image:");
                    fd.setVisible(true);
                    fd.showOpenDialog(null);
                   filename = "C:\\imane\\desktop\\wateringcan.obj";
                            int dim = ObjectFile.RESIZE;
                            ObjectFile f = new ObjectFile(dim,
                                      (float)(creaseAngle * Math.PI / 180.0));
                            Scene s = null;
                                    try
                                    {
                                        System.out.println("bn,");
                                            s = f.load(filename);
                                            
                                    }
                                    catch (FileNotFoundException evt)
                                    {
                                            System.err.println(e);
                                            System.exit(1);
                                    }
                                    catch (ParsingErrorException evt)
                                    {
                                            System.err.println(e);
                                            System.exit(1);
                                    }
                                    catch (IncorrectFormatException evt)
                                    {
                                            System.err.println(e);
                                            System.exit(1);
                                    }
                   

 	}
canvas3D.getView().setBackClipDistance(creaseAngle);
simpleU.getViewingPlatform().setNominalViewingTransform();
 rafraichir();
 }

Voila mon code j'ai fais exactement ce que vous m'avez demandé voici la portion du code que j'utilise quand je clique sue le bouton parcourir !Rien ne s'affiche toujours et j'ai cette erreur
java.awt.event.MouseEvent[MOUSE_CLICKED,(57,23),absolute(95,63),button=1,modifiers=Button1,clickCount=1] on javax.swing.JButton[,30,10,100x30,alignmentX=0.0,alignmentY=0.5,border=javax.swing.plaf.BorderUIResource$CompoundBorderUIResource@49d67c,flags=296,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=2,left=14,bottom=2,right=14],paintBorder=true,paintFocus=true,pressedIcon=,rolloverEnabled=true,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=Parcourir.,defaultCapable=true]
Java Result: 1
0
J'ai fait ce que vous m'avez demandé mais j'ai rien qui s'affiche .
voila l'erreur
java.awt.event.MouseEvent[MOUSE_CLICKED,(57,23),absolute(95,63),button=1,modifiers=Button1,clickCount=1] on javax.swing.JButton[,30,10,100x30,alignmentX=0.0,alignmentY=0.5,border=javax.swing.plaf.BorderUIResource$CompoundBorderUIResource@49d67c,flags=296,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=2,left=14,bottom=2,right=14],paintBorder=true,paintFocus=true,pressedIcon=,rolloverEnabled=true,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=Parcourir.,defaultCapable=true]
Java Result: 1


voila mon code normalement quand je clique sur le bouton parcourir il doit m'afficher un filechooser et c'est le cas mais une fois je choisis un objet .obj la page se ferme
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package testobject;

import com.sun.j3d.loaders.IncorrectFormatException;
import com.sun.j3d.loaders.ParsingErrorException;
import com.sun.j3d.loaders.Scene;
import com.sun.j3d.loaders.objectfile.ObjectFile;
import java.awt.*;
import java.awt.event.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
// classes Java 3D
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.universe.SimpleUniverse;
import javax.media.j3d.*;
import java.awt.image.*; 
import javax.vecmath.*;
import java.util.*;
import com.sun.j3d.utils.picking.behaviors.*;
import com.sun.j3d.utils.picking.*;
import java.io.FileNotFoundException;

public class Test extends Frame implements MouseListener,MouseMotionListener{

 Canvas3D canvas3D = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
 SimpleUniverse simpleU= new SimpleUniverse(canvas3D); ;
 private double creaseAngle = 60.0;
  private String filename;



    BoundingSphere behaveBounds = new BoundingSphere();
    JButton parcourir;
    Panel pan;
   

    public Test(){
        super("Test de l'application :p :p" );
        setLayout(new BorderLayout());
        Panel framepane=new Panel();
        framepane.setBackground(Color.cyan);
        this.add(framepane);
        framepane.setLayout(null);
        this.setSize(500,500);
        this.setVisible(true);

       
       Panel panel=new Panel();
      panel.setLayout(new BorderLayout());panel.setBackground(Color.blue);
      panel.setSize(500,500);panel.setLocation(120,40);
      pan=new Panel();pan.setLayout(null);
      pan.setBackground(Color.yellow);
      JSeparator sep = new JToolBar.Separator();
        sep.setBackground(Color.blue);
         sep.setOpaque(true);
      panel.add(pan);
      panel.setLocation(140, 80);
      pan.add(canvas3D);
      pan.setSize(300,300);canvas3D.setSize(300,500);
   


      
      canvas3D.setLocation(pan.getLocation());
      canvas3D.setBackground(Color.red);
      framepane.add(panel);


      //---creation des boutons
       parcourir=new JButton("Parcourir." );parcourir.addMouseListener(this);
       parcourir.setSize(100,30);parcourir.setLocation(30,10);
       framepane.add(parcourir);
         this.setSize(500,500);this.setVisible(true);
         
 }
//--------------------------


   
public void mouseClicked(MouseEvent e){



     if (e.getSource()==parcourir) {
               // try {
                    JFileChooser fd = new JFileChooser("Répertoire de l'image:");
                    fd.setVisible(true);
                    fd.showOpenDialog(null);
                   filename = "C:\\imane\\desktop\\wateringcan.obj";
                            int dim = ObjectFile.RESIZE;
                            ObjectFile f = new ObjectFile(dim,
                                      (float)(creaseAngle * Math.PI / 180.0));
                            Scene s = null;
                                    try
                                    {
                                        System.out.println("bn,");
                                            s = f.load(filename);
                                            
                                    }
                                    catch (FileNotFoundException evt)
                                    {
                                            System.err.println(e);
                                            System.exit(1);
                                    }
                                    catch (ParsingErrorException evt)
                                    {
                                            System.err.println(e);
                                            System.exit(1);
                                    }
                                    catch (IncorrectFormatException evt)
                                    {
                                            System.err.println(e);
                                            System.exit(1);
                                    }
                   

 	}
canvas3D.getView().setBackClipDistance(creaseAngle);
simpleU.getViewingPlatform().setNominalViewingTransform();

 }

 //-------------------------------------
  


public void mouseReleased(MouseEvent e){canvas3D.repaint()	;}


public void mouseMoved(MouseEvent e){}
 public void mousePressed(MouseEvent e) {}

//    public void mouseEntered(MouseEvent e) {}

    public void mouseExited(MouseEvent e) {}

    public void mouseDragged(MouseEvent e) { }

//-------methode main
public static void main(String args[]){
 Test myApp=new Test();
}

    public void mouseEntered(MouseEvent e) {
       canvas3D.repaint();
    }

   


}
0
Utilisateur anonyme
13 mars 2013 à 15:03
Comme vous retournez 1 à chaque fois sans afficher la trace d'exception, je ne peux pas savoir ce qui ne va pas. Voilà ce que je vous propose :
- remplacez System.err.println(e); par evt.printStackTrace(); (on verra ainsi d'où vient votre problème)
- un fichier .obj ne contient pas une image mais un maillage, vous devez connaître votre maillage pour savoir comment l'afficher dans le frustum
- utilisez soit simpleU.getViewingPlatform().setNominalViewingTransform() soit canvas3D.getView().setBackClipDistance() et canvas3D.getView().setFrontClipDistance(), passez à ces 2 méthodes les valeurs appropriées au lieu de prendre n'importe quoi, la documentation n'indique pas que vous devriez passer un angle

S'il vous plait, lisez bien la documentation.















T.U.E.R (First Person Shooter créé par Julien Gouesse)
0
Utilisateur anonyme
13 mars 2013 à 15:05
Vous avez également oublié d'ajouter votre maillage au graphe de scène donc il ne risque pas d'être visible.



























T.U.E.R (First Person Shooter créé par Julien Gouesse)
0
Utilisateur anonyme
13 mars 2013 à 15:06
C'est expliqué ici.

s = f.load (airFile);
   tg.addChild (s.getSceneGroup ());



























T.U.E.R (First Person Shooter créé par Julien Gouesse)
0
Utilisateur anonyme
13 mars 2013 à 15:09
Je vous conseille de regarder l'exemple complet et de l'adapter à votre cas comme il vous manque beaucoup de choses.












T.U.E.R (First Person Shooter créé par Julien Gouesse)
0
cs_AlexN Messages postés 694 Date d'inscription lundi 5 décembre 2005 Statut Membre Dernière intervention 8 janvier 2014 19
13 mars 2013 à 15:16
Je me permet d'intervenir parce que c'est la seconde fois qu'un intervenant demande la même chose à l'auteur de ce post : une trace de l'erreur.
Est-ce que l'auteur de ce post peut comprendre qu'il est difficile voire impossible de comprendre une erreur en lisant simplement un morceau de code ?
C'est décourageant parfois
0
J'essaye d'adapter mon code avec celui que tu m'as envoyé mais ma question est celui que tu m'as envoyé est une classe qui hérite de JApllet mais mon application est une JFrame est ce que je dois travailler sur les applets ou quoi ?
Désolée de vous avoir soûlée mais je suis vraiment une débutante et j'aimerai bien connaitre.
Merci
0
J'essaye d'adapter mon code avec celui que tu m'as envoyé mais ma question est celui que tu m'as envoyé est une classe qui hérite de JApllet mais mon application est une JFrame est ce que je dois travailler sur les applets ou quoi ?
Désolée de vous avoir soûlée mais je suis vraiment une débutante et j'aimerai bien connaitre.
Merci
0
J'essaye d'adapter mon code avec celui que tu m'as envoyé mais ma question est celui que tu m'as envoyé est une classe qui hérite de JApllet mais mon application est une JFrame est ce que je dois travailler sur les applets ou quoi ?
Désolée de vous avoir soûlée mais je suis vraiment une débutante et j'aimerai bien connaitre.
Merci
0
Rejoignez-nous