import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JFrame; import org.jogamp.java3d.Appearance; import org.jogamp.java3d.BranchGroup; import org.jogamp.java3d.Canvas3D; import org.jogamp.java3d.ColoringAttributes; import org.jogamp.java3d.LineAttributes; import org.jogamp.java3d.PolygonAttributes; import org.jogamp.java3d.Transform3D; import org.jogamp.java3d.TransformGroup; import org.jogamp.java3d.utils.geometry.Box; import org.jogamp.java3d.utils.universe.SimpleUniverse; import org.jogamp.vecmath.Color3f; import org.jogamp.vecmath.Vector3f; /** * SSCCE showing distortian of geometry. * @author basti */ public class TestWith3Boxes extends JFrame { public static void main(String[] args) { new TestWith3Boxes().setVisible(true); } private final float boxSize = 0.5f; private final Vector3f cameraPos = new Vector3f(0f, 0f, 10f); private final double backClipDistance = 10d; private final Color3f white = new Color3f(1f, 1f, 1f); private final Color3f red = new Color3f(1f, 0f, 0f); private final Color3f blue = new Color3f(0f, 0f, 1f); private final Dimension windowSize = new Dimension(500, 500); private final Canvas3D canvas; private final SimpleUniverse simpleUniverse; private final BranchGroup root; private final Transform3D t3dCamera; private final TransformGroup tgCamera; public TestWith3Boxes() { System.setProperty("sun.awt.noerasebackground", "true"); this.canvas = new Canvas3D(SimpleUniverse.getPreferredConfiguration()); this.root = new BranchGroup(); this.simpleUniverse = new SimpleUniverse(canvas); this.t3dCamera = new Transform3D(); this.tgCamera = simpleUniverse.getViewingPlatform() .getViewPlatformTransform(); addBox(blue, new Vector3f(-1f, 0f, 0f)); addBox(white, new Vector3f(0f, 0f, 0f)); addBox(red, new Vector3f(1f, 0f, 0f)); setCameraPosition(); simpleUniverse.addBranchGraph(root); initCanvas(); initFrame(); } private void addBox(Color3f color, Vector3f pos) { /* Note: ColoringAttributes, PolygonAttributes and LineAttributes are only set to be able to differentiate the cubes. New instances for each cube are created to rule out any side effects from reusing them. */ Appearance appearance = new Appearance(); ColoringAttributes coloringAttributes = new ColoringAttributes(color, ColoringAttributes.FASTEST); PolygonAttributes polygonAttributes = new PolygonAttributes(); LineAttributes lineAttributes = new LineAttributes(); Box box = new Box(boxSize, boxSize, boxSize, appearance); TransformGroup tg = new TransformGroup(); Transform3D t3d = new Transform3D(); polygonAttributes.setPolygonMode(PolygonAttributes.POLYGON_LINE); appearance.setPolygonAttributes(polygonAttributes); appearance.setLineAttributes(lineAttributes); appearance.setColoringAttributes(coloringAttributes); t3d.setTranslation(pos); tg.setTransform(t3d); tg.addChild(box); root.addChild(tg); } private void setCameraPosition() { t3dCamera.setTranslation(cameraPos); tgCamera.setTransform(t3dCamera); } private void initCanvas() { canvas.getView().setBackClipDistance(backClipDistance); canvas.setDoubleBufferEnable(true); add(canvas, BorderLayout.CENTER); } private void initFrame() { setTitle("Box Test Scene"); setPreferredSize(windowSize); pack(); setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { super.windowClosing(e); simpleUniverse.cleanup(); dispose(); } }); } }