Java3D im FSEM

Eich

Mitglied
Grüße,

ich habe folgendes Problem mit einem Programm das eine 3D Umgebung in den FSEM (Full Screen Exclusive Mode) einbinden will. Der Bildschirm geht auf Fullscreen bleibt aber schwarz und zeigt nicht den sich drehenden bunten Würfel an. Nur wenn ich das Programm auf der Taskleiste ablege (Alt + Tab) zeigt sich der Würfel kurz. Der Würfel ist auch kurz zu sehen nachdem ich das Programm wieder maximiert habe.

Starte ich das Programm nicht im FSEM sondern in einem Frame der bspw. 500x500px groß ist wird der Würfel korrekt dargestellt. Nach unzähligen Versuchen gelang mir nun schließlich der Durchbruch. Ich legte den Befehl in den FSEM zu wechseln auf Tastendruck 'q'.

Nach Programmstart rotiert der Würfel nun in einem Frame der 500x500px groß ist und wenn ich 'q' drücke wechselt er in den FSEM und der Würfel dreht sich. Problem gelöst. Aber wieso? Kann mir jeman weiterhelfen? Ich dachte zuerst das eventuell ein Problem mit dem Fokus vorliegen könnte aber ich bin mir nicht sicher.

Im Moment ist es nun so das ich das Programm nicht mehr auf der Taskleiste ablegen kann. Wenn ich Alt+Tab drücke erscheint nur die Windowsleiste aber keine andere Anwendung kann sich vor meinen Frame schieben. Das ist etwas ungewöhnlich und wahrscheinlich auch der Grund wieso es nun funktioniert.

Hier mal mein Quellcode:

Java:
import java.awt.* ;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.media.j3d.* ;
import javax.vecmath.* ;
import com.sun.j3d.utils.geometry.ColorCube ;
import com.sun.j3d.utils.universe.* ;

public class ExclusiveModeTest implements KeyListener
{

    static GraphicsDevice device ;
    static GraphicsEnvironment env ;
    static GraphicsConfiguration config ;
    
    static DisplayMode Modus; 
    
    static Frame Full;
    
    static Canvas3D C3D;
    
    static SimpleUniverse Uni;
    
    public static void main(String[] args) 
    {
        

        env = GraphicsEnvironment.getLocalGraphicsEnvironment() ;
        device = env.getDefaultScreenDevice() ;

        config = SimpleUniverse.getPreferredConfiguration() ;

        Modus = device.getDisplayMode();

        Full = new Frame(null, config) ;
    
        Full.setUndecorated(true) ;
        Full.setResizable(false);

        C3D = new Canvas3D(config) ;
        
        Full.add(C3D) ;
        Full.addKeyListener(new ExclusiveModeTest());
        C3D.addKeyListener(new ExclusiveModeTest());


        Uni = new SimpleUniverse(C3D) ;
        Uni.getViewingPlatform().setNominalViewingTransform() ;

       
        Full.setSize(500,500);
        Full.setVisible(true);

        BranchGroup scene = createSceneGraph() ;
        Uni.addBranchGraph(scene) ;
        
        
        
    }

    static BranchGroup createSceneGraph() {
        // Create the root of the branch graph
        BranchGroup objRoot = new BranchGroup() ;

        // Create the TransformGroup node and initialize it to the
        // identity. Enable the TRANSFORM_WRITE capability so that
        // our behavior code can modify it at run time. Add it to
        // the root of the subgraph.
        TransformGroup objTrans = new TransformGroup();
        objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
        objRoot.addChild(objTrans) ;

        // Create a simple Shape3D node; add it to the scene graph.
        objTrans.addChild(new ColorCube(0.4)) ;

        // Create a new Behavior object that will perform the
        // desired operation on the specified transform and add
        // it into the scene graph.
        Transform3D yAxis = new Transform3D() ;
        Alpha rotationAlpha = new Alpha(-1, 4000) ;

        RotationInterpolator rotator =
            new RotationInterpolator(rotationAlpha, objTrans, yAxis,
                                     0.0f, (float) Math.PI*2.0f) ;
        BoundingSphere bounds =
            new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
        rotator.setSchedulingBounds(bounds);
        objRoot.addChild(rotator) ;

        // Have Java 3D perform optimizations on this scene graph.
        objRoot.compile() ;
        
        
        
        return objRoot ;
    }


	public void keyPressed(final KeyEvent event) 
	{
		
		
	}


	public void keyReleased(final KeyEvent event) 
	{
		
		if (event.getKeyChar() == 'q')
		{
			
			device.setFullScreenWindow(Full) ;
	        device.setDisplayMode(new DisplayMode(Modus.getWidth(),Modus.getHeight(),Modus.getBitDepth(),Modus.getRefreshRate()));
	        
		}

	}


	public void keyTyped(final KeyEvent event) 
	{
		
		
	}


}

Vielen Dank für jeden Hinweis!
 
Zuletzt bearbeitet:

Ariol

Top Contributor
Könnte es ein Problem mit der Initialisierungsreihenfolge sein?

Also z.B.:
Java:
 device.setFullScreenWindow(Full) ;
            device.setDisplayMode(new DisplayMode(Modus.getWidth(),Modus.getHeight(),Modus.getBitDepth(),Modus.getRefreshRate()));
erst nach dem
Code:
setVisible(true)
aufrufen. Evtl. mit einem Sleep dazwischen?
 

Eich

Mitglied
Das mit dem Sleep ist eine gute Idee das werde ich mal ausprobieren.

Habe aber grade meinen Kumpel dieses Workaround mal auf seinem Rechner testen lassen. Bei ihm hat es nicht funktioniert, der Bildschirm wurde wieder schwarz im FSEM.

Irgendwie habe ich aber immer noch die Vermutung das dieses Problem irgendwie mit einer Art Fokus Problem zwischen FSEM und Windows 7 zusammenhängt. In allen Tutorials zu dem Thema wurden solche Schwierigkeiten wie ich sie habe nicht beschrieben was daran liegen könnte das die Tutorials sämtlich mehrere Jahre alt waren und höchstwahrscheinlich noch XP genutzt wurde.

Da dieses Thema irgendwie nicht gerade stark diskutiert wird gehe ich davon aus das man allgemein einfach die Größe des Frames auf die Bildschirmauflösung anpasst und undecorated auf true setzt? Ansonsten könnte ich mir nicht erklären wieso ich der einzige mit diesem Problem bin ^^
 

jgh

Top Contributor
hier mal ein Code, der ohne den komischen KeyListener im FSEM den Würfel anzeigt...auch unter Win7.

Java:
import java.awt.*;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.universe.*;

public class ExclusiveModeTest {

	static GraphicsDevice device;
	static GraphicsEnvironment env;
	static GraphicsConfiguration config;
	static DisplayMode Modus;
	static Frame Full;
	static Canvas3D C3D;
	static SimpleUniverse Uni;

	public static void main(String[] args) {
		env = GraphicsEnvironment.getLocalGraphicsEnvironment();
		device = env.getDefaultScreenDevice();
		config = SimpleUniverse.getPreferredConfiguration();
		Modus = device.getDisplayMode();
		Full = new Frame(null, config);
		Full.setUndecorated(true);
		Full.setResizable(false);
		C3D = new Canvas3D(config);
		Full.add(C3D);
		Uni = new SimpleUniverse(C3D);
		Uni.getViewingPlatform().setNominalViewingTransform();
		Full.setSize(Modus.getWidth(), Modus.getHeight());
		BranchGroup scene = createSceneGraph();
		Uni.addBranchGraph(scene);
		Full.addWindowListener(new WindowListener() {

			@Override
			public void windowOpened(WindowEvent e) {
				// TODO Auto-generated method stub
			}

			@Override
			public void windowIconified(WindowEvent e) {
				// TODO Auto-generated method stub
			}

			@Override
			public void windowDeiconified(WindowEvent e) {
				// TODO Auto-generated method stub
			}

			@Override
			public void windowDeactivated(WindowEvent e) {
				// TODO Auto-generated method stub
			}

			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}

			@Override
			public void windowClosed(WindowEvent e) {
				System.exit(0);
			}

			@Override
			public void windowActivated(WindowEvent e) {
				// TODO Auto-generated method stub
			}
		});
		Full.setVisible(true);
	}

	static BranchGroup createSceneGraph() {
		BranchGroup objRoot = new BranchGroup();
		TransformGroup objTrans = new TransformGroup();
		objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
		objRoot.addChild(objTrans);
		objTrans.addChild(new ColorCube(0.4));
		Transform3D yAxis = new Transform3D();
		Alpha rotationAlpha = new Alpha(-1, 4000);
		RotationInterpolator rotator = new RotationInterpolator(rotationAlpha,
				objTrans, yAxis, 0.0f, (float) Math.PI * 2.0f);
		BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0),
				100.0);
		rotator.setSchedulingBounds(bounds);
		objRoot.addChild(rotator);
		objRoot.compile();
		return objRoot;
	}

}
 

Eich

Mitglied
@ jgh,

Also wenn mich meine Augen jetzt nicht täuschen dann fehlt in deinem Code die Anweisung in den FSEM zu wechseln.

Java:
device.setFullScreenWindow(Full) ;

Den Frame einfach auf Desktopauflösung aufzublasen ist natürlich eine Notlösung soviel ist klar. Deswegen wollte ich ja auch wissen ob das alle so machen.
Wenn ich den FSEM nicht auf allen System zum laufen kriege muss ich wohl auch darauf zurückgreifen. Was eigentlich ein Unding ist da der FSEM ja extra dafür vorgesehen war Grafikintensive Anwendungen schneller und flüssiger auf den Bildschirm zu bringen...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Java3D, ViewP Translattform soll sich nach einerformgroup richten. AWT, Swing, JavaFX & SWT 5
S Java3D: Ikosaeder mit unterschiedlich gefärbten Flächen AWT, Swing, JavaFX & SWT 3
K Fullscreen Java3D AWT, Swing, JavaFX & SWT 5
T 3D-Grafik (Java3D) Aus einem Objekt einer Szene (Würfel, Ebene) die wichtigen Randkoordinaten auslesen AWT, Swing, JavaFX & SWT 3
T Erstellung einer ShadowMap mit Java3D AWT, Swing, JavaFX & SWT 6
S Hilfe beim Lernprozess von java3d AWT, Swing, JavaFX & SWT 20
K 3D-Grafik Textur Java3d AWT, Swing, JavaFX & SWT 5
S 3D-Grafik Grafikprogramm mit Java3D AWT, Swing, JavaFX & SWT 14
B 3D-Grafik Punkt in JAVA3D darstellen AWT, Swing, JavaFX & SWT 2
B Java3D Szenegraph Export als VRML, .X3D, .OBJ, .POV, U3D oder PLY AWT, Swing, JavaFX & SWT 4
K Java3D - Startposition ? AWT, Swing, JavaFX & SWT 5
M 3D-Grafik Java3D-Application als executable .jar exportieren (Eclipse) AWT, Swing, JavaFX & SWT 5
I 3D-Grafik Java3D RAM AWT, Swing, JavaFX & SWT 3
S 3D-Grafik Java3D und was noch? AWT, Swing, JavaFX & SWT 3
E 3D-Grafik Java3D AWT, Swing, JavaFX & SWT 5
T Java3D - Picking AWT, Swing, JavaFX & SWT 12
L 3D-Grafik Java3D - Alle SceneGraphObjects geordnet erhalten AWT, Swing, JavaFX & SWT 2
S Java3D in ein JPanel integrieren mit Netbeans 6.8 AWT, Swing, JavaFX & SWT 4
S Java3D: Alle Objekte in BranchGroup löschen während Laufzeit AWT, Swing, JavaFX & SWT 3
C java3D - sichtbare Kanten eines Shape3D AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen


Oben