Newsgroup: it.comp.java
Titolo: Java 3D Canvas e GraphicsConfiguration

  Ciao a tutti.
  Ho Borland JbuilderPersonal7 e utilizzo il suo SDK 1.3 interno.
  Inoltre, a casa ho WindowsXP ben accessoriato in termini di Hardware.
Ho scaricato le API Java 3D e cercato di comprenderle.
Sul pc portatile tutto funziona, ma sul pc di casa ho problemi 
sull'instanziazione del Canvas3D.
Ecco l'eccezione.
************************************************************************
*** ERROR: Canvas3D constructed with a null GraphicsConfiguration
*** This will cause a NullPointerException in a subsequent release
************************************************************************
java.lang.NullPointerException: Canvas3D: null GraphicsConfiguration
	at javax.media.j3d.Canvas3D.<init>(Canvas3D.java:1093)
	at javax.media.j3d.Canvas3D.<init>(Canvas3D.java:1058)
	at spacelink.fraMain.jbInit(fraMain.java:92)
	at spacelink.fraMain.<init>(fraMain.java:41)
	at spacelink.spaceLink.<init>(spaceLink.java:21)
	at spacelink.spaceLink.main(spaceLink.java:44)
In pratica si arrabbia perchè non gli passo la GraphicsConfiguration, 
nonostante sugli esempi del tutorial java3D passino tranquillamente null.
Allora ho provato in tutti i modi a capire come passarglielo, e trovato 
parecchi modi standard. Tutti rifiutati.
Es:
Canvas3D c3D = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
niente.
Altri metodi: niente.
E' come se il mio sistema di casa non riuscisse a trovare una 
configurazione adatta per il 3d.
Nota... avevo installato la versione windows per directX, funzionava 
(niente eccezioni) ma in rendering tracciava delle lineacce bianche.
HO installato la versione OpenGl enon parte perchè da l'eccezione suddetta.
Come posso fare??
Please help me!!!!
Ciao,
Claudio


[CUT]
Passare null al costruttore di Canvas3D non è bello, e anch'io mi chiedevo
come mai anche nei tutorial Sun non avessero fatto le cose per benino...
Ti invio uno snippet del mio codice:
/*************************************/
/*Graphics Configuration*/
private GraphicsEnvironment gE;
private GraphicsDevice gD;
private GraphicsConfigTemplate3D gCT3D;
private GraphicsConfiguration gC;
/************************/
gE = GraphicsEnvironment.getLocalGraphicsEnvironment();
gD = gE.getDefaultScreenDevice();
gCT3D = new GraphicsConfigTemplate3D();
gC = gCT3D.getBestConfiguration(gD.getConfigurations());
/*************************************/
Passa gC al costruttore.
Nota anche che in questo modo puoi ottenere numerose informazioni sulle
configurazione; ad esempio:
System.out.println("Available accelerated graphics memory  (byte):
"+gC.getDevice().getAvailableAcceleratedMemory());
System.out.println("Refresh rate:
"+gC.getDevice().getDisplayMode().getRefreshRate());
System.out.println("Resolution:
"+gC.getDevice().getDisplayMode().getWidth()+" x
"+gC.getDevice().getDisplayMode().getHeight());
Se hai problemi fammi sapere!
Siccome sei uno dei pochi italiani che utilizzano j3d, posso chiedere in che
cosa sei impegnato?
Fausto Mancini

  Niente da fare!!
  Cmq ieri sera è successa una cosa strana.
  Io ho XP con una Matrox G450DualHead.
  Beh... ho reinstallato i drivers, e... andava!!!!
  Incredibile.
  Cosi' ne ho dedotto che era un problema di natura diversa.
  Poco fa mi riaccingo e... niente... siamo daccapo.
  Neppure col tuo snippet.
  Probabilmente il problema non è quello, ma il fatto che quando il mio 
sistema si accinge a richiedere una configurazione grafica per il 3D, il 
sistema restituisce null.
  Ieri sera funzionava anche con un banale:
Canvas3D c3D = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
Ora mi tocchera' reinstallare i drivers della G450 ogni volta che 
rilancio JBuilder??
  O forse.. è un problema di DualHead?
  Ti faro' sapere.
  per il resto... sto sviluppando privatamente un gioco ove devo 
costruire una matrice di oggetti collocati nelle tre dimensioni nella 
quale devo potermi muovere come osservatore.
  Tu?
Ciao
Claudio


Smanettando un po', reinstallando i drivers, mettendo la risoluzione a 
24bit... dopo un po' di pasticci... parte (in questa sessione).
Pero' ora fa un altra cosa: ogni tanto il canvas3D non fa piu' vedere lo 
spazio renderizzato, ma il colore di sfondo e basta.
Accade randomicamente, non si sa perchč.
UN po' si vede bene, poi si riempie del colore di sfondo, poi torna 
l'immagine 3D. Idee?
Non sono espertissimo in java, ma... non potrebbe avere a che fare con i 
metodi paint vari?
Ti do il codice:
Ciao, grazie!!!!
Claudio
______________________________________________
package spacelink;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import com.sun.j3d.*;
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;
/**
  * <p>Title: </p>
  * <p>Description: </p>
  * <p>Copyright: Copyright (c) 2002</p>
  * <p>Company: </p>
  * @author unascribed
  * @version 1.0
  */
public class fraMain extends JFrame {
   private JPanel contentPane;
   private JMenuBar jMenuBar1 = new JMenuBar();
   private JMenu jMenuFile = new JMenu();
   private JMenuItem jMenuFileExit = new JMenuItem();
   private JMenu jMenuHelp = new JMenu();
   private JMenuItem jMenuHelpAbout = new JMenuItem();
   private JToolBar jToolBar = new JToolBar();
   private JButton jButton1 = new JButton();
   private JButton jButton2 = new JButton();
   private JButton jButton3 = new JButton();
   private ImageIcon image1;
   private ImageIcon image2;
   private ImageIcon image3;
   private JLabel statusBar = new JLabel();
   private BorderLayout borderLayout1 = new BorderLayout();
   //Construct the frame
   public fraMain() {
     enableEvents(AWTEvent.WINDOW_EVENT_MASK);
     try {
       jbInit();
     }
     catch(Exception e) {
       e.printStackTrace();
     }
   }
   //Component initialization
   private void jbInit() throws Exception  {
     image1 = new 
ImageIcon(spacelink.fraMain.class.getResource("openFile.gif"));
     image2 = new 
ImageIcon(spacelink.fraMain.class.getResource("closeFile.gif"));
     image3 = new 
ImageIcon(spacelink.fraMain.class.getResource("help.gif"));
 
//setIconImage(Toolkit.getDefaultToolkit().createImage(fraMain.class.getResource("[Your 
Icon]")));
     contentPane = (JPanel) this.getContentPane();
     contentPane.setLayout(borderLayout1);
     this.setSize(new Dimension(400, 300));
     this.setTitle("Space Link");
     statusBar.setText(" ");
     jMenuFile.setText("File");
     jMenuFileExit.setText("Exit");
     jMenuFileExit.addActionListener(new ActionListener()  {
       public void actionPerformed(ActionEvent e) {
         jMenuFileExit_actionPerformed(e);
       }
     });
     jMenuHelp.setText("Help");
     jMenuHelpAbout.setText("About");
     jMenuHelpAbout.addActionListener(new ActionListener()  {
       public void actionPerformed(ActionEvent e) {
         jMenuHelpAbout_actionPerformed(e);
       }
     });
     jButton1.setIcon(image1);
     jButton1.setToolTipText("Open File");
     jButton2.setIcon(image2);
     jButton2.setToolTipText("Close File");
     jButton3.setIcon(image3);
     jButton3.setToolTipText("Help");
     jToolBar.add(jButton1);
     jToolBar.add(jButton2);
     jToolBar.add(jButton3);
     jMenuFile.add(jMenuFileExit);
     jMenuHelp.add(jMenuHelpAbout);
     jMenuBar1.add(jMenuFile);
     jMenuBar1.add(jMenuHelp);
     this.setJMenuBar(jMenuBar1);
     contentPane.add(jToolBar, BorderLayout.NORTH);
     contentPane.add(statusBar, BorderLayout.SOUTH);
     JPanel contentPane = (JPanel) this.getContentPane();
     contentPane.setLayout(borderLayout1);
     this.setTitle("Space Link");
     Canvas3D c3D = new 
Canvas3D(SimpleUniverse.getPreferredConfiguration());
     contentPane.add(c3D,BorderLayout.CENTER);
     c3D.addComponentListener(new java.awt.event.ComponentAdapter() {
       public void componentHidden(ComponentEvent e) {
         c3D_componentHidden(e);
       }
     });
     c3D.addComponentListener(new java.awt.event.ComponentAdapter() {
       public void componentMoved(ComponentEvent e) {
         c3D_componentMoved(e);
       }
     });
     c3D.addComponentListener(new java.awt.event.ComponentAdapter() {
       public void componentResized(ComponentEvent e) {
         c3D_componentResized(e);
       }
     });
     c3D.setBackground(Color.white);
 
c3D.setForeground(UIManager.getColor("InternalFrame.inactiveTitleForeground"));
     BranchGroup scene = createSceneGraph();
     SimpleUniverse simpleU = new SimpleUniverse(c3D);
     simpleU.getViewingPlatform().setNominalViewingTransform();
     simpleU.addBranchGraph(scene);
     this.setSize(new Dimension(400, 300));
   }
   public BranchGroup createSceneGraph(){
    BranchGroup objRoot = new BranchGroup();
    Appearance app = new Appearance();
    ColoringAttributes cAtt = new ColoringAttributes();
    cAtt.setColor(new Color3f(Color.blue));
    app.setColoringAttributes(cAtt);
    Transform3D sphereTraslation  = new Transform3D();
    sphereTraslation.setTranslation(new Vector3d(0d,0d,-4d));
    TransformGroup sphereTG = new TransformGroup(sphereTraslation);
    sphereTG.addChild(new com.sun.j3d.utils.geometry.Sphere(0.5f,app));
    objRoot.addChild(sphereTG);
    return objRoot;
}
   //File | Exit action performed
   public void jMenuFileExit_actionPerformed(ActionEvent e) {
     System.exit(0);
   }
   //Help | About action performed
   public void jMenuHelpAbout_actionPerformed(ActionEvent e) {
     fraMain_AboutBox dlg = new fraMain_AboutBox(this);
     Dimension dlgSize = dlg.getPreferredSize();
     Dimension frmSize = getSize();
     Point loc = getLocation();
     dlg.setLocation((frmSize.width - dlgSize.width) / 2 + loc.x, 
(frmSize.height - dlgSize.height) / 2 + loc.y);
     dlg.setModal(true);
     dlg.pack();
     dlg.show();
   }
   //Overridden so we can exit when window is closed
   protected void processWindowEvent(WindowEvent e) {
     super.processWindowEvent(e);
     if (e.getID() == WindowEvent.WINDOW_CLOSING) {
       jMenuFileExit_actionPerformed(null);
     }
   }
   void c3D_componentHidden(ComponentEvent e) {
     System.out.println(e.toString());
   }
   void c3D_componentMoved(ComponentEvent e){
     System.out.println(e.toString());
   }
   void c3D_componentResized(ComponentEvent e){
     System.out.println(e.toString());
   }
}

 
Non posso aiutarti x quanto riguarda J3d o JBuilder... ma se ti può
consalare io ho una matrox e veramente Windows me ne ha combinate di
tutti i colori con sta scheda ch eper altro adoro... ma sono
rassegnato la Matrox ha dei driver un po di merda soprattutto se devi
usare Direct3D e poi OpenGL...
Ciao e scusa lo sfogo.

 Claudio
Buon lavoro,
Fausto

>>---<<<





 nemmeno conosce, beh... :
La verità è che ho incontrato prima di te lo stesso problema, e quindi non
mi ringraziare troppo :-P
Ma questo è il bello dei NG: condividere problemi ma soprattutto soluzioni!
Comunque... prego!
Verrà il giorno in cui sbatterò la testa contro un muro e tu mi aiuterai ad
abbatterlo...
Fausto Mancini

 Fausto Mancini
Molto volentieri: tieni a mente: 
byo...@byoblu.com
:-))
Claudio
P.S. ... Oggi ho scritto una lettera a Punto Informatico, e' quella 
sull'ISDN, l'ultimo articolo.