import java.awt.Frame;
import java.awt.GraphicsConfiguration;
import java.awt.event.MouseAdapter;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.media.j3d.AmbientLight;
import javax.media.j3d.Appearance;
import javax.media.j3d.BoundingSphere;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.*;
import javax.media.j3d.DirectionalLight;
import javax.media.j3d.IndexedQuadArray;
import javax.media.j3d.Material;
import javax.media.j3d.PolygonAttributes;
import javax.media.j3d.Shape3D;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.vecmath.Color3f;
import javax.vecmath.Point3d;
import javax.vecmath.Point3f;
import javax.vecmath.Vector3d;
import javax.vecmath.Vector3f;
import com.sun.j3d.utils.behaviors.mouse.MouseRotate;
import com.sun.j3d.utils.behaviors.mouse.MouseZoom;
import com.sun.j3d.utils.geometry.Box;
import com.sun.j3d.utils.geometry.Sphere;
import com.sun.j3d.utils.universe.SimpleUniverse;
public class PrintCanvas extends MouseAdapter {
SimpleUniverse u;
Box LKW = new Box(2.44f,2.35f,7.7f,Box.GENERATE_NORMALS,null);
protected Box box = new Box(0.8f,1.2f,1.2f,Box.ENABLE_APPEARANCE_MODIFY | Box.GENERATE_NORMALS,null);
public Box box2 = new Box(1.2f,1.2f,0.8f,Box.ENABLE_APPEARANCE_MODIFY | Box.GENERATE_NORMALS,null);
public Box box3 = new Box(1.2f,1.2f,0.8f,Box.ENABLE_APPEARANCE_MODIFY | Box.GENERATE_NORMALS,null);
public Box box4 = new Box (0.5f,0.3f,4f,Box.ENABLE_APPEARANCE_MODIFY | Box.GENERATE_NORMALS,null);
public PrintCanvas() {
Frame frame = new Frame("BoxExample");
GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
Canvas3D c = new Canvas3D(config);
c.setSize(800,600);
u = new SimpleUniverse(c);
BranchGroup rootBranchGroup = new BranchGroup();
TransformGroup BoxTG=new TransformGroup();
//Hier hängt die transform bzw. moveGroup später dran
Transform3D BoxT3D=new Transform3D();
BoxT3D.setTranslation(new Vector3f(0f,0f,-25f));
Appearance BoxAppearance=new Appearance();
DirectionalLight DLgt=new DirectionalLight(new Color3f
(0.8f,0.8f,1.0f),new Vector3f(-0.5f,-1f,-0.5f));
AmbientLight ALgt=new AmbientLight(new Color3f(0.8f,0.8f,0.8f));
BoundingSphere BigBounds=new BoundingSphere(new Point3d(),100000);
ALgt.setInfluencingBounds(BigBounds);
DLgt.setInfluencingBounds(BigBounds);
rootBranchGroup.addChild(ALgt);
rootBranchGroup.addChild(DLgt);
DirectionalLight DLgt2=new DirectionalLight(new Color3f
(0.8f,0.8f,1f),new Vector3f(0.5f,1f,0.5f));
DLgt2.setInfluencingBounds(BigBounds);
BoxAppearance.setMaterial(new Material(new Color3f(0.5f,0.5f,0.5f),new
Color3f(0.2f,0.2f,0.2f),new Color3f(0.9f,0.9f,0.9f),new Color3f(0.8f,0.8f,0.8f),
1f));
BoxAppearance.setPolygonAttributes(new PolygonAttributes
(PolygonAttributes.POLYGON_FILL,PolygonAttributes.CULL_FRONT,0));
LKW.setAppearance(BoxAppearance);
//Setzen der Kisten
TransformGroup testLKW = new TransformGroup();
Transform3D testLKW2 = new Transform3D();
TransformGroup test = new TransformGroup();
Transform3D test2 = new Transform3D();
TransformGroup test3 = new TransformGroup();
Transform3D test4 = new Transform3D();
TransformGroup test5 = new TransformGroup();
Transform3D test6 = new Transform3D();
TransformGroup test7 = new TransformGroup();
Transform3D test8 = new Transform3D();
test2.setTranslation(new Vector3f(-1.64f,-1.15f,-6.5f));
test4.setTranslation(new Vector3f(0.4f,-1.15f,-6.9f));
test6.setTranslation(new Vector3f(0.4f,1.2f,-6.9f));
test8.setTranslation(new Vector3f(-1.94f,-2.05f,-1.3f));
test.setTransform(test2);
test3.setTransform(test4);
test5.setTransform(test6);
test7.setTransform(test8);
testLKW.setTransform(testLKW2);
test.addChild(box);
test3.addChild(box2);
test5.addChild(box3);
test7.addChild(box4);
testLKW.addChild(LKW);
//Appearance für Ladungsbox
Appearance ladungsAppearance = new Appearance();
ladungsAppearance.setMaterial(new Material(new Color3f(1f,0f,0f),new
Color3f(1f,0f,0f),new Color3f(1f,0f,0f),new Color3f(0.8f,0.8f,0.8f),
1f));
ladungsAppearance.setPolygonAttributes(new PolygonAttributes
(PolygonAttributes.POLYGON_FILL,PolygonAttributes.CULL_NONE,0));
Appearance ladungsAppearance2 = new Appearance();
Material m = new Material (new Color3f(0f,1f,0f),new
Color3f(0f,1f,0f),new Color3f(0f,1f,0f),new Color3f(0.8f,0.8f,0.8f),
1f);
m.setCapability(Material.ALLOW_COMPONENT_READ);
m.setCapability(Material.ALLOW_COMPONENT_WRITE);
ladungsAppearance2.setMaterial(m);
ladungsAppearance2.setCapability(Appearance.ALLOW_MATERIAL_WRITE);
ladungsAppearance2.setCapability(Appearance.ALLOW_TEXTURE_WRITE);
ladungsAppearance2.setCapability(Appearance.ALLOW_TEXTURE_ATTRIBUTES_WRITE);
ladungsAppearance2.setCapability(Appearance.ALLOW_TEXGEN_WRITE);
ladungsAppearance2.setPolygonAttributes(new PolygonAttributes
(PolygonAttributes.POLYGON_FILL,PolygonAttributes.CULL_NONE,0));
ladungsAppearance.setCapability(Appearance.ALLOW_COLORING_ATTRIBUTES_READ);
ladungsAppearance.setCapability(Appearance.ALLOW_COLORING_ATTRIBUTES_WRITE);
box.setAppearance(ladungsAppearance);
box3.setAppearance(ladungsAppearance2);
box4.setAppearance(ladungsAppearance2);
box4.setCapability(Shape3D.ALLOW_APPEARANCE_READ);
box4.setCapability(Shape3D.ALLOW_APPEARANCE_WRITE);
box4.setCapability(Appearance.ALLOW_MATERIAL_READ);
box4.setCapability(Appearance.ALLOW_MATERIAL_WRITE);
BoxTG.addChild(testLKW); //Box mit Breite, Höhe, Länge (x,y,z)
BoxTG.addChild(test);
BoxTG.addChild(test3);
BoxTG.addChild(test5);
BoxTG.addChild(test7);
// XXX TEST
final LoadBox loadBox = new LoadBox(2,3,4);
BoxTG.addChild(loadBox.getNode());
Thread t = new Thread(new Runnable()
{
public void run()
{
LoadBox.CornerMode modes[] = LoadBox.CornerMode.values();
int i=0;
while (true)
{
loadBox.setCornerMode(modes[i]);
i = (i+1)%4;
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
Thread.currentThread().interrupt();
}
}
}
});
t.start();
// XXX TEST
BoxTG.setTransform(BoxT3D);
BoxTG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
//Add rotation function
MouseRotate mouseRotate = new MouseRotate();
mouseRotate.setTransformGroup(BoxTG);
mouseRotate.setSchedulingBounds(BigBounds);
rootBranchGroup.addChild(mouseRotate);
//Add zoom function
MouseZoom mouseZoom = new MouseZoom();
mouseZoom.setTransformGroup(BoxTG);
mouseZoom.setSchedulingBounds(BigBounds);
rootBranchGroup.addChild(mouseZoom);
u.getViewingPlatform().setNominalViewingTransform();
rootBranchGroup.addChild(BoxTG);
u.addBranchGraph(rootBranchGroup);
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent winEvent) {
System.exit(0);
}
});
frame.add(c);
c.addMouseListener(this);
frame.pack();
frame.show();
}
private void doCorners (Box box, TransformGroup transform)
{
for (int i=0; i<8; i++)
{
transform.addChild(createCorner(i));
}
}
private TransformGroup createCorner(int magic)
{
int dx = -1+2*((magic >> 0) & 0x1);
int dy = -1+2*((magic >> 1) & 0x1);
int dz = -1+2*((magic >> 2) & 0x1);
TransformGroup tg = new TransformGroup();
Transform3D t = new Transform3D();
t.set(new Vector3f(dx,dy,dz));
tg.setTransform(t);
tg.addChild(new Sphere(0.2f));
return tg;
}
public static void main(String[] args){
new PrintCanvas();
}
}
class LoadBox
{
enum CornerMode
{
NONE,
LEFT,
RIGHT,
BOTH
};
private BranchGroup root;
private Switch leftCorners;
private Switch rightCorners;
private CornerMode cornersMode;
public LoadBox(float dx, float dy, float dz)
{
root = new BranchGroup();
root.addChild(new Box(dx,dy,dz, createAppearance()));
leftCorners = new Switch();
leftCorners.setCapability(Switch.ALLOW_SWITCH_WRITE);
leftCorners.addChild(createCorner(-dx, -dy, -dz));
leftCorners.addChild(createCorner(-dx, -dy, dz));
leftCorners.addChild(createCorner(-dx, dy, -dz));
leftCorners.addChild(createCorner(-dx, dy, dz));
root.addChild(leftCorners);
rightCorners = new Switch();
rightCorners.setCapability(Switch.ALLOW_SWITCH_WRITE);
rightCorners.addChild(createCorner( dx, -dy, -dz));
rightCorners.addChild(createCorner( dx, -dy, dz));
rightCorners.addChild(createCorner( dx, dy, -dz));
rightCorners.addChild(createCorner( dx, dy, dz));
root.addChild(rightCorners);
setCornerMode(CornerMode.BOTH);
}
private static Appearance createAppearance()
{
Appearance app1 = new Appearance();
TransformGroup moveGroup = new TransformGroup();
Color3f ambientColour1 = new Color3f(1.0f, 0.0f, 0.0f);
Color3f emissiveColour = new Color3f(0.0f, 0.0f, 0.0f);
Color3f specularColour = new Color3f(1.0f, 1.0f, 1.0f);
Color3f diffuseColour1 = new Color3f(1.0f, 0.0f, 0.0f);
float shininess = 20.0f;
app1.setMaterial(new Material(ambientColour1, emissiveColour,
diffuseColour1, specularColour, shininess));
return app1;
}
public Group getNode()
{
return root;
}
public void setCornerMode(CornerMode cornerMode)
{
switch (cornerMode)
{
case NONE:
leftCorners.setWhichChild(Switch.CHILD_NONE);
rightCorners.setWhichChild(Switch.CHILD_NONE);
break;
case LEFT:
leftCorners.setWhichChild(Switch.CHILD_ALL);
rightCorners.setWhichChild(Switch.CHILD_NONE);
break;
case RIGHT:
leftCorners.setWhichChild(Switch.CHILD_NONE);
rightCorners.setWhichChild(Switch.CHILD_ALL);
break;
case BOTH:
leftCorners.setWhichChild(Switch.CHILD_ALL);
rightCorners.setWhichChild(Switch.CHILD_ALL);
break;
}
}
private static Group createCorner(float dx, float dy, float dz)
{
TransformGroup tg = new TransformGroup();
Transform3D t = new Transform3D();
t.set(new Vector3f(dx,dy,dz));
tg.setTransform(t);
tg.addChild(new Sphere(0.2f));
return tg;
}
}