Java3D Objekte entfernen und hinzufügen

Mirkko

Mitglied
Hallo Zusammen,
Vorweg:
Ich bin relativ neu in der Java-Programmierwelt und erst in Tuchfühlung mit Java3D. Ich hoffe, dennoch, dass mein BeispielCode-Lesbar ist (Mühe hab ich mir jedenfalls gegeben:))
Danke für Euer Verständnis und Hilfeleistungen.

Was hab ich vor:
Ich hab ein GUI erstellt mit 3 Buttons, je nach dem welchen ich verwende, soll in der Scene ein Kreis, ein Kubus oder ein Cylinder erscheinen.

Mein Problem:
Also die 3 Buttons erstellen klappt, eine Scene mit einem Start-Objekt klappt auch.
Doch klappt es nun nicht, dieses Start-Objekt wieder zu löschen und durch ein neues zu ersetzen.
Meine Variante ergibt die Fehlermeldung:
Exception in thread "AWT-EventQueue-0" javax.media.j3d.RestrictedAccessException: Group: only a BranchGroup node may be removed at javax.media.j3d.Group.removeAllChildren(Group.java:403)
ich erkenne daraus, dass ich die removeAllChildren nicht verwenden darf, aber weiter komme ich nicht:-(

Frage an die "Profis":
hab ich einen vollständig falschen Ansatz gewählt?
Wie kann ich das Problem lösen?

Hab mich durch dieses und andere Foren durchgelesen aber bin auf keinen grünen Zweig gekommen...

Vielen Dank für Euer Hilfe.


Java:
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.geometry.Cylinder;
import javax.media.j3d.*;
import javax.swing.JFrame;

import java.awt.GraphicsConfiguration;
import javax.swing.JPanel;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;



public class TestLoeschenUndEinfuegen extends javax.swing.JFrame {
	
    static TransformGroup objTrans = new TransformGroup();
    
    
    public static void main(String args[]) {
    	JFrame fenster = new JFrame ("Java3D");
 		fenster.setVisible(true);
        fenster. setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
         
   //////Beginn GUI 
         JPanel drawingPanel= new JPanel(new BorderLayout());
         drawingPanel.setPreferredSize(new java.awt.Dimension(500, 500));
         fenster.add(drawingPanel);
        
         JPanel panel= new JPanel();
         Button aButton = new Button("Kreis");
         Button bButton = new Button("Kugel");
         Button cButton = new Button("Cylinder");
         panel.add(aButton);
         panel.add(bButton);
         panel.add(cButton);
			drawingPanel.add("North",panel);
			
			aButton.addActionListener(
				      new ActionListener(){
				        public void actionPerformed(ActionEvent e){
				        	TestLoeschenUndEinfuegen Aufrufen=new TestLoeschenUndEinfuegen();
				        	Aufrufen.Loeschen();
				        	Aufrufen.Quader();
				        }
				      }
				    );

				    bButton.addActionListener(
				      new ActionListener(){
				        public void actionPerformed(ActionEvent e){
				        	TestLoeschenUndEinfuegen Aufrufen=new TestLoeschenUndEinfuegen();
				        	Aufrufen.Loeschen();
				        	Aufrufen.Kugel();
				        }
				      }
				    );

				    cButton.addActionListener(
				      new ActionListener(){
				        public void actionPerformed(ActionEvent e){
				        	TestLoeschenUndEinfuegen Aufrufen=new TestLoeschenUndEinfuegen();
				        	Aufrufen.Loeschen();
				        	Aufrufen.Cylinder();
					    }
				      }
				    );
//////Ende GUI
			
	///Beginn Universum erstellen			
					GraphicsConfiguration config =
			    	    SimpleUniverse.getPreferredConfiguration();
					Canvas3D c = new Canvas3D(config);
					SimpleUniverse univ = null;
			  	    univ = new SimpleUniverse(c);
		    	  	  univ.getViewingPlatform().setNominalViewingTransform();
	     		  	univ.getViewer().getView().setMinimumFrameCycleTime(5);
			        
			    	drawingPanel.add("Center",c);
			    	objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
			    	BranchGroup objRoot = new BranchGroup();
			    	objRoot.addChild(objTrans);
			    	
			    	//Aufruf eines Objektes
			    	TestLoeschenUndEinfuegen Aufrufen=new TestLoeschenUndEinfuegen();
		        	Aufrufen.Quader();
				    	
			            // Have Java 3D perform optimizations on this scene graph.
			            objRoot.compile();
			            univ.addBranchGraph(objRoot);
			            		            
		    	fenster.pack();
            }
    
    public void Loeschen(){  //Objekte Löschen
    	objTrans.removeAllChildren();
    	}
    
    public void Quader(){
    	objTrans.addChild(new ColorCube(0.1));  	
    }
    
    public void Kugel(){
    	objTrans.addChild(new ColorCube(1));  	
    }
    
    public void Cylinder(){
     	Appearance app = new Appearance();
    	app.setColoringAttributes(new ColoringAttributes (1,0,1,0));
    	Cylinder colorcube1=new Cylinder((float)12,5, app);	 
    	objTrans.addChild(colorcube1);  
   
    }
}
 

Marco13

Top Contributor
Bin ein bißchen raus aus Java3D, aber zum Entfernen muss man Grundsätzlich die Capability-Bits setzen... in diesem fall: Bei dem Knoten, wo Children entfernt und hinzugefügt werden sollen, muss ALLOW_CHILDREN_WRITE gesetzt sein.

Ob man zwischen den TransformGroup und den ColorCube jetzt (wie es die Meldung suggeriert) wirklich eine Brachgroup schalten muss...
Code:
BranchrGroup bg = new BranchGroup()
bg.addChild(new ColorCube(0.1));
objTrans.addChild(bg);
weiß ich grad' nicht auswendig ???:L müßtest du mal ausprobieren - WENN, dann müßte in dieser BranchGroup aber wohl auch das ALLOW_DETACH Capability bit gesetzt sein.
 

Mirkko

Mitglied
Hallo Marco
danke für Deinen Tipp,
doch irgendwie funktioniert das dennoch nicht bei mir.
Hab ich richtig verstanden,
ich füge nach Zeile 82 ein:
Java:
 objTrans.setCapability(TransformGroup.ALLOW_CHILDREN_WRITE)

und in 102:
Java:
BranchrGroup bg = new BranchGroup()
bg.addChild(new ColorCube(0.1));
objTrans.addChild(bg);

Die Sache mit ALLOW_DETACH bei der Capability konnte ich nicht finden.

Oder hab ich Deinen Tipp falsch verstanden?

Vielen Dank für Deine Bemühungen.
 

Marco13

Top Contributor
BranchGroup (Java 3D 1.3.2)

Müßte dann eigentlich
Code:
BranchrGroup bg = new BranchGroup()
[b]bg.setCapability(BranchGroup.ALLOW_DETACH);[/b]
bg.addChild(new ColorCube(0.1));
objTrans.addChild(bg);
sein ... wenn nicht, muss ich's mal testen...
 

Mirkko

Mitglied
Hallo Marco,
Grosses Danke, also einen Schritt weiter bin ich nun schon mal:)

mit der Modifikation klappt es nun das erste Objekt zu löschen,
jedoch kann ich dann kein weiters mehr hinzufügen.
es kommt erneut die Fehlermeldung:
"Group: no capability to append children"
Und der Verweis auf Zeile 109.

Hmm ich bin mir sicher, dass es noch ein kleines Etwas ist, das fehlt, aber sehe es echt nicht alleine. Tut mir leid. Evtl. siehst es Du auf anhieb... Wäre dir sehr dankbar.

Vielen Dank für Dein Engagement

Anbei nochmals der Code wie er im Moment aussieht
Java:
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.geometry.Cylinder;
import com.sun.j3d.utils.geometry.Sphere;
import javax.media.j3d.*;
import javax.swing.JFrame;

import java.awt.GraphicsConfiguration;
import javax.swing.JPanel;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;



public class TestLoeschenUndEinfuegen extends javax.swing.JFrame {
	
    static TransformGroup objTrans = new TransformGroup();
    
    
    public static void main(String args[]) {
    	JFrame fenster = new JFrame ("Java3D");
 		fenster.setVisible(true);
        fenster. setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
         
   //////Beginn GUI 
         JPanel drawingPanel= new JPanel(new BorderLayout());
         drawingPanel.setPreferredSize(new java.awt.Dimension(500, 500));
         fenster.add(drawingPanel);
        
         JPanel panel= new JPanel();
         Button aButton = new Button("Kreis");
         Button bButton = new Button("Kugel");
         Button cButton = new Button("Zylinder");
         panel.add(aButton);
         panel.add(bButton);
         panel.add(cButton);
			drawingPanel.add("North",panel);
			
			aButton.addActionListener(
				      new ActionListener(){
				        public void actionPerformed(ActionEvent e){
				        	TestLoeschenUndEinfuegen Aufrufen=new TestLoeschenUndEinfuegen();
				        	Aufrufen.Loeschen();
				        	Aufrufen.Quader();
				        }
				      }
				    );

				    bButton.addActionListener(
				      new ActionListener(){
				        public void actionPerformed(ActionEvent e){
				        	TestLoeschenUndEinfuegen Aufrufen=new TestLoeschenUndEinfuegen();
				        	Aufrufen.Loeschen();
				        	Aufrufen.Kugel();
				        }
				      }
				    );

				    cButton.addActionListener(
				      new ActionListener(){
				        public void actionPerformed(ActionEvent e){
				        	TestLoeschenUndEinfuegen Aufrufen=new TestLoeschenUndEinfuegen();
				        	Aufrufen.Loeschen();
				        	Aufrufen.Cylinder();
					    }
				      }
				    );
//////Ende GUI
			
	///Beginn Universum erstellen			
					GraphicsConfiguration config =
			    	    SimpleUniverse.getPreferredConfiguration();
					Canvas3D c = new Canvas3D(config);
					SimpleUniverse univ = null;
			  	    univ = new SimpleUniverse(c);
		    	  	  univ.getViewingPlatform().setNominalViewingTransform();
	     		  	univ.getViewer().getView().setMinimumFrameCycleTime(5);
			        
			    	drawingPanel.add("Center",c);
			    	objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
			    	objTrans.setCapability(TransformGroup.ALLOW_CHILDREN_WRITE);
			    	BranchGroup objRoot = new BranchGroup();
			    	//objRoot.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
			    	objRoot.addChild(objTrans);
			    	
			    	//Aufruf eines Objektes
			    	TestLoeschenUndEinfuegen Aufrufen=new TestLoeschenUndEinfuegen();
		        	Aufrufen.Quader();
				    	
			            // Have Java 3D perform optimizations on this scene graph.
			            objRoot.compile();
			            univ.addBranchGraph(objRoot);
			            		            
		    	fenster.pack();
            }
    
    public void Loeschen(){  //Objekte Löschen
    	objTrans.removeAllChildren();
    	}
    
    public void Quader(){
    	//objTrans.addChild(new ColorCube(0.1));  
    	BranchGroup bg = new BranchGroup();
    	bg.setCapability(BranchGroup.ALLOW_DETACH);
    	bg.addChild(new ColorCube(0.1));
    	objTrans.addChild(bg);
    }
    
    public void Kugel(){
    	objTrans.addChild(new Sphere(1));  	
    }
    
    public void Cylinder(){
     	Appearance app = new Appearance();
    	app.setColoringAttributes(new ColoringAttributes (1,0,1,0));
    	Cylinder colorcube1=new Cylinder((float)12,5, app);	 
    	objTrans.addChild(colorcube1);  
   
    }
}
 

Mirkko

Mitglied
Hallo Marco
Grosses DANKE. Ich bin beeindruckt!

Mit deinem Tipp bin ich einen weiteren Schritt weiter. Nun fehlt nur noch einer und dann kann ich hier das fertige Beispiel posten (und wieder ruhig schlafen).

mit ALLOW_CHILDREN_EXTEND nach Zeile 84,
klappt es nun das erste objekt wieder zu entfernen und wieder zu entfernen. :applaus:

Auch kann ich den Würfel wieder einfügen das klappt auch ganz schön. :applaus:

;( Was jedoch immer noch nicht klappt ist ein anderes Objekt einzufügen. Also zum Beispiel einen Zylinder oder die Kugel.

Ich hab erneut ausprobiert auch mit den was ich bis jetzt gelern hab von Deinen anderen Tipps, doch blicke ich nicht durch... hast du noch einen letzten Tipp? wäre mega toll.

Ein enorm grosses DANKE für die bis jetzt geleistete Arbeit.
 

Marco13

Top Contributor
Häm... diese zusätzliche BranchGroup braucht man natürlich nicht nur beim ColorCube, sondern auch bei den anderen beiden Objekttypen....
 

Mirkko

Mitglied
Hallo Marco
yep, das hab ich mir gedacht. :) aber eben das ging auch nicht, oder hab ich wieder etwas falsch gemacht.. also irgend etwas ist falsch, sonst würde es ja gehen:), dass die anderen objekte auch angezeigt werden:)

immerhin gibt es keine fehlermeldung:) kleiner trost:)

anbei nochmals den code so wie ich ihn jetzt hab, evtl. kannst du kurz drauf schauen, wenn du noch lust hast.
En Gruess

Java:
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.geometry.Cylinder;
import com.sun.j3d.utils.geometry.Sphere;
import javax.media.j3d.*;
import javax.swing.JFrame;

import java.awt.GraphicsConfiguration;
import javax.swing.JPanel;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;



public class TestLoeschenUndEinfuegen extends javax.swing.JFrame {
	
    static TransformGroup objTrans = new TransformGroup();
    
    
    public static void main(String args[]) {
    	JFrame fenster = new JFrame ("Java3D");
 		fenster.setVisible(true);
        fenster. setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
         
   //////Beginn GUI 
         JPanel drawingPanel= new JPanel(new BorderLayout());
         drawingPanel.setPreferredSize(new java.awt.Dimension(500, 500));
         fenster.add(drawingPanel);
        
         JPanel panel= new JPanel();
         Button aButton = new Button("Würfel");
         Button bButton = new Button("Kugel");
         Button cButton = new Button("Zylinder");
         panel.add(aButton);
         panel.add(bButton);
         panel.add(cButton);
			drawingPanel.add("North",panel);
			
			aButton.addActionListener(
				      new ActionListener(){
				        public void actionPerformed(ActionEvent e){
				        	TestLoeschenUndEinfuegen Aufrufen=new TestLoeschenUndEinfuegen();
				        	Aufrufen.Loeschen();
				        	Aufrufen.Wuerfel();
				        }
				      }
				    );

				    bButton.addActionListener(
				      new ActionListener(){
				        public void actionPerformed(ActionEvent e){
				        	TestLoeschenUndEinfuegen Aufrufen=new TestLoeschenUndEinfuegen();
				        	Aufrufen.Loeschen();
				        	Aufrufen.Kugel();
				        }
				      }
				    );

				    cButton.addActionListener(
				      new ActionListener(){
				        public void actionPerformed(ActionEvent e){
				        	TestLoeschenUndEinfuegen Aufrufen=new TestLoeschenUndEinfuegen();
				        	Aufrufen.Loeschen();
				        	Aufrufen.Cylinder();
					    }
				      }
				    );
//////Ende GUI
			
	///Beginn Universum erstellen			
					GraphicsConfiguration config =
			    	    SimpleUniverse.getPreferredConfiguration();
					Canvas3D c = new Canvas3D(config);
					SimpleUniverse univ = null;
			  	    univ = new SimpleUniverse(c);
		    	  	  univ.getViewingPlatform().setNominalViewingTransform();
	     		  	univ.getViewer().getView().setMinimumFrameCycleTime(5);
			        
			    	drawingPanel.add("Center",c);
			    	objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
			    	objTrans.setCapability(TransformGroup.ALLOW_CHILDREN_WRITE);
			    	objTrans.setCapability(TransformGroup.ALLOW_CHILDREN_EXTEND);
			    	BranchGroup objRoot = new BranchGroup();
			    	//objRoot.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
			    	objRoot.addChild(objTrans);
			    	
			    	//Aufruf eines Objektes
			    	TestLoeschenUndEinfuegen Aufrufen=new TestLoeschenUndEinfuegen();
		        	Aufrufen.Wuerfel();
				    	
			            // Have Java 3D perform optimizations on this scene graph.
			            objRoot.compile();
			            univ.addBranchGraph(objRoot);
			            		            
		    	fenster.pack();
            }
    
    public void Loeschen(){  //Objekte Löschen
    	objTrans.removeAllChildren();
    	}
    
    public void Wuerfel(){
    	//objTrans.addChild(new ColorCube(0.1));  
    	BranchGroup bg = new BranchGroup();
    	bg.setCapability(BranchGroup.ALLOW_DETACH);
    	bg.addChild(new ColorCube(0.1));
    	objTrans.addChild(bg);
    }
    
    public void Kugel(){
    	BranchGroup bg2 = new BranchGroup();
    	bg2.setCapability(BranchGroup.ALLOW_DETACH);
    	bg2.addChild(new Sphere(1));
    	objTrans.addChild(bg2);
    	//objTrans.addChild(new Sphere(1));  	
    }
    
    public void Cylinder(){
    	Appearance app = new Appearance();
    	app.setColoringAttributes(new ColoringAttributes (1,0,1,0));
    	Cylinder colorcube1=new Cylinder((float)12,5, app);	 
    	//objTrans.addChild(colorcube1);  
  	
    	BranchGroup bg3 = new BranchGroup();
    	bg3.setCapability(BranchGroup.ALLOW_DETACH);
    	bg3.addChild(colorcube1);
    	objTrans.addChild(bg3);
    	
   
    }
}
 

Marco13

Top Contributor
Sie nimmt langsam ab, aber ... naja. Diese vorgefertigten Primitive hatte ich nie verwendet. Offenbar brauchen die ein Licht, damit man sie sieht. Könnte man sicher umgehen, aber mal schnell zusammengeschustert...:
Java:
// From [url]http://www.java-forum.org/spiele-multimedia-programmierung/94294-java3d-objekte-entfernen-hinzufuegen.html#post599590[/url]

import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.geometry.Cylinder;
import com.sun.j3d.utils.geometry.Sphere;
import javax.media.j3d.*;
import javax.swing.JFrame;
import javax.vecmath.*;

import java.awt.GraphicsConfiguration;
import javax.swing.JPanel;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;



public class TestLoeschenUndEinfuegen extends javax.swing.JFrame {

    private TransformGroup objTrans;


    public static void main(String args[]) {
        JFrame fenster = new JFrame ("Java3D");
        fenster.setVisible(true);
        fenster. setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

   //////Beginn GUI
         JPanel drawingPanel= new JPanel(new BorderLayout());
         drawingPanel.setPreferredSize(new java.awt.Dimension(500, 500));
         fenster.add(drawingPanel);

         JPanel panel= new JPanel();
         Button aButton = new Button("Würfel");
         Button bButton = new Button("Kugel");
         Button cButton = new Button("Zylinder");
         panel.add(aButton);
         panel.add(bButton);
         panel.add(cButton);
            drawingPanel.add("North",panel);


        final TestLoeschenUndEinfuegen aufrufen = new TestLoeschenUndEinfuegen();

            aButton.addActionListener(
                      new ActionListener(){
                        public void actionPerformed(ActionEvent e){
                            aufrufen.Loeschen();
                            aufrufen.Wuerfel();
                        }
                      }
                    );

                    bButton.addActionListener(
                      new ActionListener(){
                        public void actionPerformed(ActionEvent e){
                            aufrufen.Loeschen();
                            aufrufen.Kugel();
                        }
                      }
                    );

                    cButton.addActionListener(
                      new ActionListener(){
                        public void actionPerformed(ActionEvent e){
                            aufrufen.Loeschen();
                            aufrufen.Cylinder();
                        }
                      }
                    );
//////Ende GUI

    ///Beginn Universum erstellen
                    GraphicsConfiguration config =
                        SimpleUniverse.getPreferredConfiguration();
                    Canvas3D c = new Canvas3D(config);
                    SimpleUniverse univ = null;
                    univ = new SimpleUniverse(c);
                      univ.getViewingPlatform().setNominalViewingTransform();
                    //univ.getViewer().getView().setMinimumFrameCycleTime(5);

                    drawingPanel.add("Center",c);

                    aufrufen.objTrans = new TransformGroup();
                    aufrufen.objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
                    aufrufen.objTrans.setCapability(TransformGroup.ALLOW_CHILDREN_WRITE);
                    aufrufen.objTrans.setCapability(TransformGroup.ALLOW_CHILDREN_EXTEND);
                    BranchGroup objRoot = new BranchGroup();
                    //objRoot.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
                    objRoot.addChild(aufrufen.objTrans);

                    createLights(objRoot);

                    //Aufruf eines Objektes
                    //aufrufen.Wuerfel();
                    aufrufen.Kugel();

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

                fenster.pack();
            }

    public void Loeschen(){  //Objekte Löschen
        objTrans.removeAllChildren();
        }

    public void Wuerfel(){
        //objTrans.addChild(new ColorCube(0.1));
        BranchGroup bg = new BranchGroup();
        bg.setCapability(BranchGroup.ALLOW_DETACH);
        bg.addChild(new ColorCube(0.1));
        objTrans.addChild(bg);
    }

    static void createLights(BranchGroup bg)
    {
        AmbientLight lightA = new AmbientLight();
        lightA.setInfluencingBounds(new BoundingSphere());
        bg.addChild(lightA);
        DirectionalLight lightD1 = new DirectionalLight();
        lightD1.setInfluencingBounds(new BoundingSphere());
        Vector3f direction1 = new Vector3f(-1.0f, -1.0f, -0.5f);
        direction1.normalize();
        lightD1.setDirection(direction1);
        lightD1.setColor(new Color3f(0.0f, 0.0f, 1.0f));
        bg.addChild(lightD1);
    }


    Appearance createAppearance()
    {
        Appearance appear = new Appearance();
        Material material = new Material();
        material.setShininess(50.0f);
        appear.setMaterial(material);
        return appear;
    }



    public void Kugel(){
        BranchGroup bg2 = new BranchGroup();
        bg2.setCapability(BranchGroup.ALLOW_DETACH);
        bg2.addChild(new Sphere(0.1f, Sphere.GENERATE_NORMALS, createAppearance()));
        //bg2.addChild(new ColorCube(0.1));
        objTrans.addChild(bg2);

    }

    public void Cylinder(){
        Cylinder colorcube1=new Cylinder((float)0.1f,0.5f, createAppearance());
        BranchGroup bg3 = new BranchGroup();
        bg3.setCapability(BranchGroup.ALLOW_DETACH);
        bg3.addChild(colorcube1);
        objTrans.addChild(bg3);


    }
}
 

Mirkko

Mitglied
Hallo Marco,
da hätte ich eigentlich selber drauf kommen sollen:)
ein RICHTIG GROSSES DANKE FÜR DEINE BEMÜHUNGEN, DU BIST MEIN GANZ GEHEIMER HELD VON DIESEM WEEKEND!!!

Anbei der fertige Code, für alljene, die auch irgend einmal das selbe Problem haben.
Hab den Code noch ergänzt mit der Möglichkeit die Objekte rotieren zu lassen.
Java:
// From [url]http://www.java-forum.org/spiele-multimedia-programmierung/94294-java3d-objekte-entfernen-hinzufuegen.html#post599590[/url]
 
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.behaviors.mouse.MouseRotate;
import com.sun.j3d.utils.behaviors.mouse.MouseTranslate;
import com.sun.j3d.utils.behaviors.mouse.MouseWheelZoom;
import com.sun.j3d.utils.behaviors.mouse.MouseZoom;
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.geometry.Cylinder;
import com.sun.j3d.utils.geometry.Sphere;
import javax.media.j3d.*;
import javax.swing.JFrame;
import javax.vecmath.*;
 
import java.awt.GraphicsConfiguration;
import javax.swing.JPanel;
 
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
 
 
public class TestLoeschenUndEinfuegen extends javax.swing.JFrame {
 
    private TransformGroup objTrans;
    private BranchGroup bg = new BranchGroup();
    
 
 
    public static void main(String args[]) {
        JFrame fenster = new JFrame ("Java3D");
        fenster.setVisible(true);
        fenster. setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
 
   //////Beginn GUI
         JPanel drawingPanel= new JPanel(new BorderLayout());
         drawingPanel.setPreferredSize(new java.awt.Dimension(500, 500));
         fenster.add(drawingPanel);
 
         JPanel panel= new JPanel();
         Button aButton = new Button("Würfel");
         Button bButton = new Button("Kugel");
         Button cButton = new Button("Zylinder");
         panel.add(aButton);
         panel.add(bButton);
         panel.add(cButton);
            drawingPanel.add("North",panel);
            
 
        final TestLoeschenUndEinfuegen aufrufen = new TestLoeschenUndEinfuegen();
 
            aButton.addActionListener(
                      new ActionListener(){
                        public void actionPerformed(ActionEvent e){
                            aufrufen.Loeschen();
                            aufrufen.Wuerfel();
                        }
                      }
                    );
 
                    bButton.addActionListener(
                      new ActionListener(){
                        public void actionPerformed(ActionEvent e){
                            aufrufen.Loeschen();
                            aufrufen.Kugel();
                        }
                      }
                    );
 
                    cButton.addActionListener(
                      new ActionListener(){
                        public void actionPerformed(ActionEvent e){
                            aufrufen.Loeschen();
                            aufrufen.Cylinder();
                        }
                      }
                    );
//////Ende GUI
 
    ///Beginn Universum erstellen
                    GraphicsConfiguration config =
                        SimpleUniverse.getPreferredConfiguration();
                    Canvas3D c = new Canvas3D(config);
                    SimpleUniverse univ = null;
                    univ = new SimpleUniverse(c);
                      univ.getViewingPlatform().setNominalViewingTransform();
                    //univ.getViewer().getView().setMinimumFrameCycleTime(5);
 
                    drawingPanel.add("Center",c);
 
                    aufrufen.objTrans = new TransformGroup();
                    aufrufen.objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
                    aufrufen.objTrans.setCapability(TransformGroup.ALLOW_CHILDREN_WRITE);
                    aufrufen.objTrans.setCapability(TransformGroup.ALLOW_CHILDREN_EXTEND);
                    
                    aufrufen.objTrans.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
                    aufrufen.objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
                    aufrufen.objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
            		
                    BranchGroup objRoot = new BranchGroup();
                    //objRoot.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
                    objRoot.addChild(aufrufen.objTrans);
 
                    createLights(objRoot);
 
                    //Aufruf eines Objektes
                    aufrufen.Wuerfel();
                    //aufrufen.Kugel();
                    aufrufen.Mausmanipulation();
 
                        // Have Java 3D perform optimizations on this scene graph.
                        //objRoot.compile();
                        univ.addBranchGraph(objRoot);
                        
             //Manipolieren von Objekten
                       
                        
 
                fenster.pack();
            }
    
 public void Mausmanipulation(){
	//Erlauben dass mit Maus Betrachten
	    
	      BoundingBox boundBox=new BoundingBox (new Point3d(-1000,-1000,-1000),new Point3d(1000,1000,1000));
		
		  //rotieren mit der linken Maustaste
		    MouseRotate behavior = new MouseRotate(objTrans);
		    behavior.setTransformGroup(objTrans);
		    behavior.setSchedulingBounds(boundBox);
		    objTrans.addChild(behavior);
		    
		  //verschieben mit rechter Maustaste
		    MouseTranslate mouseTranslate= new MouseTranslate(objTrans);
		    mouseTranslate.setSchedulingBounds(boundBox);
		    objTrans.addChild(mouseTranslate);
		    
		  //zoomen mit mittlerer Maustaste
		    MouseZoom mouseBeh2=new MouseZoom(objTrans);
		    mouseBeh2.setSchedulingBounds(boundBox);
		    objTrans.addChild(mouseBeh2);
		    
		  // zoom mit MouseWheelZoom
		    MouseWheelZoom mouseWheel=new MouseWheelZoom(objTrans);
		    mouseWheel.setSchedulingBounds(boundBox);
		    objTrans.addChild(mouseWheel);       
 }
    
    public void Loeschen(){  //Objekte Löschen
       // objTrans.removeAllChildren();
        objTrans.removeChild(bg);
        
        }
 
    public void Wuerfel(){
        //objTrans.addChild(new ColorCube(0.1));
    	 bg = new BranchGroup();
        bg.setCapability(BranchGroup.ALLOW_DETACH);
        bg.addChild(new ColorCube(0.1));
        objTrans.addChild(bg);
    }
 
    static void createLights(BranchGroup bg)
    {
        AmbientLight lightA = new AmbientLight();
        lightA.setInfluencingBounds(new BoundingSphere());
        bg.addChild(lightA);
        DirectionalLight lightD1 = new DirectionalLight();
        lightD1.setInfluencingBounds(new BoundingSphere());
        Vector3f direction1 = new Vector3f(-1.0f, -1.0f, -0.5f);
        direction1.normalize();
        lightD1.setDirection(direction1);
        lightD1.setColor(new Color3f(0.0f, 0.0f, 1.0f));
        bg.addChild(lightD1);
    }
 
 
    Appearance createAppearance()
    {
        Appearance appear = new Appearance();
        Material material = new Material();
        material.setShininess(50.0f);
        appear.setMaterial(material);
        return appear;
    }
 
    public void Kugel(){
      bg = new BranchGroup();
        bg.setCapability(BranchGroup.ALLOW_DETACH);
        bg.addChild(new Sphere(0.1f, Sphere.GENERATE_NORMALS, createAppearance()));
        //bg2.addChild(new ColorCube(0.1));
        objTrans.addChild(bg);
 
    }
 
    public void Cylinder(){
        Cylinder colorcube1=new Cylinder((float)0.1f,0.5f, createAppearance());
        bg= new BranchGroup();
        bg.setCapability(BranchGroup.ALLOW_DETACH);
        bg.addChild(colorcube1);
        objTrans.addChild(bg);
 
 
    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Java3D: Objekte platzieren und entfernen? Spiele- und Multimedia-Programmierung 7
M Java3D Picking - falsche Objekte werden gepickt Spiele- und Multimedia-Programmierung 3
S 3D Objekte ohne Java3D darstellen? Spiele- und Multimedia-Programmierung 10
N Java3d in Eclipse einbinden Spiele- und Multimedia-Programmierung 4
Neumi5694 Java3D Viewer Beschriftung Spiele- und Multimedia-Programmierung 1
C Java3D Transformieren von obj. Datein Spiele- und Multimedia-Programmierung 0
M Cylinder anhand eines Vektors ausrichten (Java3d) Spiele- und Multimedia-Programmierung 0
Ruvok Java3D Tutorial gesucht Spiele- und Multimedia-Programmierung 5
U Hilfe bei Implementierung eines PointSounds in Java3D Spiele- und Multimedia-Programmierung 1
R Java3d ViewingPlatform erst Verschieben und dann RotationsInterpolator Spiele- und Multimedia-Programmierung 0
D Java3D - Blickfeld Spiele- und Multimedia-Programmierung 1
P Java3D Box Dimensionen und Positionierung Spiele- und Multimedia-Programmierung 1
E Java3D Objekt skalieren per JSlider/JButton Spiele- und Multimedia-Programmierung 10
S Java3D: Primitives zu einem Objekt kombinieren Spiele- und Multimedia-Programmierung 7
J Java3D - Textur laden geht nicht Spiele- und Multimedia-Programmierung 9
J Java3D - Farben vermischen sich Spiele- und Multimedia-Programmierung 7
T Java3D Rendering Problem Spiele- und Multimedia-Programmierung 7
S Java3D oder JMonkey? Spiele- und Multimedia-Programmierung 17
H Java3D - Textur aufs innere einer Sphere mappen Spiele- und Multimedia-Programmierung 9
C java 3d ohne Java3d Spiele- und Multimedia-Programmierung 28
Maxim6394 [Java3D] Probleme bei Kollision Spiele- und Multimedia-Programmierung 7
Maxim6394 [Java3D] lookAt Mausposition Spiele- und Multimedia-Programmierung 17
Maxim6394 [Java3D] Probleme mit KeyFrame Animationen Spiele- und Multimedia-Programmierung 9
K Java3D als Applet ohne Installation von Java3d Spiele- und Multimedia-Programmierung 6
D Java3D Installation: package javax.media.j3d not found Spiele- und Multimedia-Programmierung 5
C Java3D Texture Mapping Spiele- und Multimedia-Programmierung 2
W Java3D: Kanten die hinter einem Objekt liegen werden gezeigt Spiele- und Multimedia-Programmierung 2
W Java3D: Farbe von Objekten stimmt nicht mit übergebenem RGB-Wert überein Spiele- und Multimedia-Programmierung 9
M Eigene Renderengine ohne Java3D,etc. Spiele- und Multimedia-Programmierung 19
C Java3D Sound spielt nur einen Sound ab. Spiele- und Multimedia-Programmierung 8
A JAVA3D TransformGroup <--> Group Problem Spiele- und Multimedia-Programmierung 3
M [Java3D] Animation von mehreren Objekten Spiele- und Multimedia-Programmierung 7
W Java3D: Eckkoordinaten einer Box herausfinden Spiele- und Multimedia-Programmierung 18
T Java3D: Nur die Kanten des Würfels rendern? Spiele- und Multimedia-Programmierung 4
W Java3D setBounds(BoundingBox) Spiele- und Multimedia-Programmierung 6
T [gelöst] Java3D: Unerwünschte Rotation um die 3.Achse vermeiden? Spiele- und Multimedia-Programmierung 3
Bastie JAVA3D - WRL Transform Spiele- und Multimedia-Programmierung 9
G Eclipse Problem mit Java3d Spiele- und Multimedia-Programmierung 3
T Java3D - Lichtquelle einbauen Spiele- und Multimedia-Programmierung 7
jemandzehage java3d parallel und perspective view Spiele- und Multimedia-Programmierung 5
H Cinema 4D in Java3D importieren Spiele- und Multimedia-Programmierung 2
1 [Java3D] komplexes Projekt? Spiele- und Multimedia-Programmierung 10
P .obj-Datei in Java3D laden: ParsingErrorException Spiele- und Multimedia-Programmierung 7
C Java3D Lichtquelle beim Beobachter Spiele- und Multimedia-Programmierung 2
C Java3D Interaktion während Animation Spiele- und Multimedia-Programmierung 3
aze Java3D: Flächen teilen Spiele- und Multimedia-Programmierung 15
P Java3D Textur verzerrt Spiele- und Multimedia-Programmierung 3
aze Java3D: Gegenstände aufeinander zubewegen ohne Kollision Spiele- und Multimedia-Programmierung 4
D [JAVA3D] Es werden 2 Fenster erzeugt und auf dem falschen gezeichnet Spiele- und Multimedia-Programmierung 3
aze Java3D: leere Räume füllen Spiele- und Multimedia-Programmierung 2
aze Java3d:Helligkeit von Shape3D ändern Spiele- und Multimedia-Programmierung 2
S Einschätzung zu Java3D-Einstieg Spiele- und Multimedia-Programmierung 3
F Programm mit Java3D unter Linux laufen lassen Spiele- und Multimedia-Programmierung 3
I Vergleich von Java3D und OpenGL Spiele- und Multimedia-Programmierung 17
W Waterslide mit Java3D Spiele- und Multimedia-Programmierung 11
M [Java3D] Rotieren der Scene NICHT des POV Spiele- und Multimedia-Programmierung 4
F Jogl oder Java3D ? Spiele- und Multimedia-Programmierung 20
K Java3D Abfängerfrage Spiele- und Multimedia-Programmierung 3
aze Java3D:Farbige Flächen verschwinden lassen(Transparenz- oder Colorinterpolator?)) Spiele- und Multimedia-Programmierung 5
C Java3D PositionInterpolator Spiele- und Multimedia-Programmierung 3
G [Java3D] Probleme bei Animation Spiele- und Multimedia-Programmierung 4
E [JAVA3D] Kamerasteuerung Spiele- und Multimedia-Programmierung 3
E [JAVA3D] Schattenstrich durch die Szene Spiele- und Multimedia-Programmierung 4
M Grundsätzliche Java3D Fragen Spiele- und Multimedia-Programmierung 2
C Java3D SceneGraohPath Spiele- und Multimedia-Programmierung 2
C Java3D Rotation um einen Punkt (y-achse) Spiele- und Multimedia-Programmierung 2
G Java3D plattformunabhängig bundeln Spiele- und Multimedia-Programmierung 3
TheKing Java3D-Shooter View Spiele- und Multimedia-Programmierung 2
A Java3D tutorial? Spiele- und Multimedia-Programmierung 3
R Java3D Kollisionserkennung und Schwerkraft Spiele- und Multimedia-Programmierung 17
J Java3d Schnelle Geschosse Spiele- und Multimedia-Programmierung 12
D Kann ich mit Java3D 2D Daten als 3D surfaceplot plotten? Spiele- und Multimedia-Programmierung 5
J Java3d setTextureTransform verändert J3DGraphics2D Spiele- und Multimedia-Programmierung 4
J Hilfe: Rotation X und Y Achse (Java3d) Spiele- und Multimedia-Programmierung 12
K Java3D: LineStripArray Spiele- und Multimedia-Programmierung 2
P Java3D - Zylinder genau wie Vektor ausrichten Spiele- und Multimedia-Programmierung 5
Developer_X Java3D Mensch Ärgere Dich nicht. Spiele- und Multimedia-Programmierung 10
C JAVA3D Rotation um einen bestimmten Punkt Spiele- und Multimedia-Programmierung 20
Developer_X Java3D-Ungeeignet für 3D Spiele wegen Heap Space=? Spiele- und Multimedia-Programmierung 23
Developer_X Java3D Canvas post Renderer und? Spiele- und Multimedia-Programmierung 5
A Java3D Sichtweite Spiele- und Multimedia-Programmierung 2
"Er" Kamera rotation in Java3D Spiele- und Multimedia-Programmierung 2
A Java3D: Behavior scheduling bounds Spiele- und Multimedia-Programmierung 3
Developer_X THE BALL (needs Java3D) Spiele- und Multimedia-Programmierung 34
Developer_X Java3D Game_(die erste) Spiele- und Multimedia-Programmierung 2
Developer_X Java3D und while schleifen Spiele- und Multimedia-Programmierung 4
Developer_X Collisionserkennung in Java3D Spiele- und Multimedia-Programmierung 3
Developer_X Java3D Node -> Obj Data Spiele- und Multimedia-Programmierung 2
Developer_X Figuren werden nicht angezeigt (Java3D) Spiele- und Multimedia-Programmierung 5
S PDFRenderer und Java3D Spiele- und Multimedia-Programmierung 2
Developer_X Java3D- der Mausklick auf Nodes Spiele- und Multimedia-Programmierung 3
Developer_X Java3D Point Sound Spiele- und Multimedia-Programmierung 71
Developer_X Lines in Java3D Spiele- und Multimedia-Programmierung 4
V Java3D: HUD erstellen Spiele- und Multimedia-Programmierung 2
V Java3D: scheinende Sonne Spiele- und Multimedia-Programmierung 4
V Java3D: Ringe für Saturn erstellen Spiele- und Multimedia-Programmierung 8
V Java3D: automatisches Bewegen der Kamera Spiele- und Multimedia-Programmierung 19
V Java3D: mehrere ViewingPlaforms in Sonnensystem Spiele- und Multimedia-Programmierung 8
Developer_X Thread in Java3D Spiele- und Multimedia-Programmierung 8
B Java3D .obj dateien Spiele- und Multimedia-Programmierung 2

Ähnliche Java Themen

Neue Themen


Oben