Hallo,
beschäftige mich seit kurzem mit Java 3D. Da wollte ich mal mein erstes kleines Java 3D Beispiel Programm schreiben, komme aber irgendwie nicht weiter.
Die Idee ist, in einem SimpleUniverse per Thread die primitiven Formen nacheinander anzuzeigen lassen. So das immer eine Form verschwindet und an deren Stelle die nächste angezeigt wird.
In Swing würde ich einfach mit remove() eine Komponente entfernen und die andere mit add() hinzufügen, anschließend mit updateUI() die Oberfläche aktualisieren.
Zuerst habe ich versucht nur das Kind auszutauschen, was nicht funktioniert hat. Mein zweiter Versuch war die Szene auszutauschen, dies hat leider auch nicht geklappt.
Optimal wäre es natürlich wenn nur das Kind ausgetauscht wird, und nicht die ganze Szene oder gar das ganze Universe.
Hätte jemand eine Idee was an dem unteren Code falsch ist? Es entsteht zwar kein Fehler, aber der Canvas ist vollständig schwarz, d.h. die Objekte sind nicht zu sehen. Auch würde mich interessieren, wie man das umsetzt, das einfach nur das jeweilige Kind gewechselt und die Szene aktualisiert wird.
Vg Flashray
beschäftige mich seit kurzem mit Java 3D. Da wollte ich mal mein erstes kleines Java 3D Beispiel Programm schreiben, komme aber irgendwie nicht weiter.
Die Idee ist, in einem SimpleUniverse per Thread die primitiven Formen nacheinander anzuzeigen lassen. So das immer eine Form verschwindet und an deren Stelle die nächste angezeigt wird.
In Swing würde ich einfach mit remove() eine Komponente entfernen und die andere mit add() hinzufügen, anschließend mit updateUI() die Oberfläche aktualisieren.
Zuerst habe ich versucht nur das Kind auszutauschen, was nicht funktioniert hat. Mein zweiter Versuch war die Szene auszutauschen, dies hat leider auch nicht geklappt.
Optimal wäre es natürlich wenn nur das Kind ausgetauscht wird, und nicht die ganze Szene oder gar das ganze Universe.
Hätte jemand eine Idee was an dem unteren Code falsch ist? Es entsteht zwar kein Fehler, aber der Canvas ist vollständig schwarz, d.h. die Objekte sind nicht zu sehen. Auch würde mich interessieren, wie man das umsetzt, das einfach nur das jeweilige Kind gewechselt und die Szene aktualisiert wird.
Vg Flashray
Code:
package basic;
import java.awt.BorderLayout;
import java.util.ArrayList;
import java.util.Iterator;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.Node;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.vecmath.Color3f;
import com.sun.j3d.utils.geometry.Box;
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.geometry.Cone;
import com.sun.j3d.utils.geometry.Cylinder;
import com.sun.j3d.utils.geometry.Sphere;
import com.sun.j3d.utils.geometry.Text2D;
import com.sun.j3d.utils.universe.SimpleUniverse;
public class GeometrySlide extends JPanel {
private ArrayList<Node> geometries = new ArrayList<Node>();
private BranchGroup scene;
private SimpleUniverse simpleU;
public GeometrySlide() {
this.setLayout(new BorderLayout());
Canvas3D canvas3D = new Canvas3D(SimpleUniverse
.getPreferredConfiguration());
this.add(canvas3D);
simpleU = new SimpleUniverse(canvas3D);
simpleU.getViewingPlatform().setNominalViewingTransform();
scene = new BranchGroup();
simpleU.addBranchGraph(scene);
geometries.add(new Box());
geometries.add(new ColorCube());
geometries.add(new Cone());
geometries.add(new Cylinder());
geometries.add(new Sphere());
geometries.add(new Text2D("Text2D", new Color3f(0f, 1f, 1f), "Arial",
20, 4));
new Thread() {
public void run() {
while (true) {
for (Iterator<Node> iter = geometries.iterator(); iter
.hasNext();) {
scene = new BranchGroup();
Node node = iter.next();
node = node.cloneNode(true);
System.out.println(node);
scene.addChild(node);
scene.compile();
GeometrySlide.this.updateUI();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}.start();
}
public static void main(String[] args) {
JFrame frame = new JFrame("Geometry Slide");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new GeometrySlide());
frame.setSize(320, 480);
frame.setVisible(true);
}
}