import java.awt.Color;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.media.j3d.Appearance;
import javax.media.j3d.Background;
import javax.media.j3d.BoundingSphere;
import javax.media.j3d.Bounds;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.ColoringAttributes;
import javax.media.j3d.GeometryArray;
import javax.media.j3d.IndexedLineArray;
import javax.media.j3d.LineArray;
import javax.media.j3d.LineAttributes;
import javax.media.j3d.Material;
import javax.media.j3d.Node;
import javax.media.j3d.PointAttributes;
import javax.media.j3d.PointLight;
import javax.media.j3d.PolygonAttributes;
import javax.media.j3d.QuadArray;
import javax.media.j3d.Shape3D;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.media.j3d.TransparencyAttributes;
import javax.vecmath.Color3f;
import javax.vecmath.Point3d;
import javax.vecmath.Point3f;
import com.sun.j3d.utils.behaviors.mouse.MouseRotate;
import com.sun.j3d.utils.behaviors.mouse.MouseTranslate;
import com.sun.j3d.utils.behaviors.mouse.MouseZoom;
import com.sun.j3d.utils.geometry.GeometryInfo;
import com.sun.j3d.utils.geometry.NormalGenerator;
import com.sun.j3d.utils.geometry.Sphere;
import com.sun.j3d.utils.universe.SimpleUniverse;
public class Third3DProgram extends Frame
{
/**
*
*/
private static final long serialVersionUID = 1L;
public Third3DProgram(String title)
{
super(title);
Canvas3D canvas3D = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
add(canvas3D);
SimpleUniverse universe = new SimpleUniverse(canvas3D);
universe.getViewingPlatform().setNominalViewingTransform();
//Hintergrund setzen
BoundingSphere riesenkugel = new BoundingSphere(new Point3d(0.0d, 0.0d, 0.0d),
Double.MAX_VALUE);
Background hintergrund = new Background();
hintergrund.setColor(new Color3f(Color.GRAY)/*new Color3f(0.8f, 0.7f, 1.0f)*/);
hintergrund.setApplicationBounds(riesenkugel);
BranchGroup scene1 = createSceneGraph();
BranchGroup scene3 = new BranchGroup();
scene3.addChild(hintergrund);
scene1.compile();
scene3.compile();
universe.addBranchGraph(scene1);
universe.addBranchGraph(scene3);
}
public BranchGroup createSceneGraph()
{
BranchGroup objWurzel = new BranchGroup();
BranchGroup wuerfel = new BranchGroup();
GeometryArray transparente_flaechen;
GeometryArray flaechen;
LineArray kanten;
Point3f[] ecke = new Point3f[8];
//Punkte des Würfels
ecke[0] = new Point3f(-0.5f, 0.0f, 0.5f);
ecke[1] = new Point3f( 0.5f, 0.0f, 0.5f);
ecke[2] = new Point3f( 0.5f, 0.5f, 0.5f);
ecke[3] = new Point3f(-0.5f, 0.5f, 0.5f);
ecke[4] = new Point3f(-0.5f, 0.0f, -0.5f);
ecke[5] = new Point3f( 0.5f, 0.0f, -0.5f);
ecke[6] = new Point3f( 0.5f, 0.5f, -0.5f);
ecke[7] = new Point3f(-0.5f, 0.5f, -0.5f);
//sichtbare Flächen
flaechen = new QuadArray(12, QuadArray.COORDINATES);
flaechen.setCoordinate(0, ecke[0]);
flaechen.setCoordinate(1, ecke[1]);
flaechen.setCoordinate(2, ecke[5]);
flaechen.setCoordinate(3, ecke[4]);
flaechen.setCoordinate(4, ecke[0]);
flaechen.setCoordinate(5, ecke[4]);
flaechen.setCoordinate(6, ecke[7]);
flaechen.setCoordinate(7, ecke[3]);
flaechen.setCoordinate(8, ecke[4]);
flaechen.setCoordinate(9, ecke[5]);
flaechen.setCoordinate(10, ecke[6]);
flaechen.setCoordinate(11, ecke[7]);
// Normalen generieren
GeometryInfo gi = new GeometryInfo(flaechen);
NormalGenerator ng = new NormalGenerator();
ng.generateNormals(gi);
flaechen = gi.getGeometryArray();
//transparente Flächen
transparente_flaechen = new QuadArray(12, QuadArray.COORDINATES);
transparente_flaechen.setCoordinate(0, ecke[0]);
transparente_flaechen.setCoordinate(1, ecke[1]);
transparente_flaechen.setCoordinate(2, ecke[2]);
transparente_flaechen.setCoordinate(3, ecke[3]);
transparente_flaechen.setCoordinate(4, ecke[1]);
transparente_flaechen.setCoordinate(5, ecke[5]);
transparente_flaechen.setCoordinate(6, ecke[6]);
transparente_flaechen.setCoordinate(7, ecke[2]);
transparente_flaechen.setCoordinate(8, ecke[3]);
transparente_flaechen.setCoordinate(9, ecke[2]);
transparente_flaechen.setCoordinate(10, ecke[6]);
transparente_flaechen.setCoordinate(11, ecke[7]);
// Normalen generieren
gi = new GeometryInfo(transparente_flaechen);
ng = new NormalGenerator();
ng.generateNormals(gi);
transparente_flaechen = gi.getGeometryArray();
//Kanten der sichtbaren Flächen
kanten = new LineArray(18, IndexedLineArray.COORDINATES);
kanten.setCoordinate(0, ecke[0]);
kanten.setCoordinate(1, ecke[1]);
kanten.setCoordinate(2, ecke[1]);
kanten.setCoordinate(3, ecke[5]);
kanten.setCoordinate(4, ecke[0]);
kanten.setCoordinate(5, ecke[3]);
kanten.setCoordinate(6, ecke[5]);
kanten.setCoordinate(7, ecke[4]);
kanten.setCoordinate(8, ecke[0]);
kanten.setCoordinate(9, ecke[4]);
kanten.setCoordinate(10, ecke[3]);
kanten.setCoordinate(11, ecke[7]);
kanten.setCoordinate(12, ecke[4]);
kanten.setCoordinate(13, ecke[7]);
kanten.setCoordinate(14, ecke[6]);
kanten.setCoordinate(15, ecke[7]);
kanten.setCoordinate(16, ecke[5]);
kanten.setCoordinate(17, ecke[6]);
//appearance für die Flaechen
Appearance app_f = new Appearance();
app_f.setMaterial(createMaterial());
PolygonAttributes pa_f = new PolygonAttributes();
pa_f.setCullFace(PolygonAttributes.CULL_NONE);
app_f.setPolygonAttributes(pa_f);
//appearance für die transparenten Flaechen
Appearance app_t = new Appearance();
TransparencyAttributes t_app = new TransparencyAttributes();
t_app.setTransparencyMode(TransparencyAttributes.BLENDED);
t_app.setTransparency(0.5f);
app_t.setTransparencyAttributes(t_app);
app_t.setMaterial(createMaterial());
PolygonAttributes pa_t = new PolygonAttributes();
pa_t.setCullFace(PolygonAttributes.CULL_NONE);
app_t.setPolygonAttributes(pa_t);
//appearance für die die Seiten des Wuerfels
Appearance app_l = new Appearance();
LineAttributes l_att = new LineAttributes(2.0f,LineAttributes.PATTERN_SOLID, true);
PointAttributes p_att = new PointAttributes(1.0f, true);
ColoringAttributes c_att = new ColoringAttributes();
c_att.setColor(new Color3f(Color.BLACK));
app_l.setColoringAttributes(c_att);
app_l.setPointAttributes(p_att);
app_l.setLineAttributes(l_att);
wuerfel.addChild(new Shape3D(flaechen, app_f));
wuerfel.addChild(new Shape3D(kanten, app_l));
wuerfel.addChild(new Shape3D(transparente_flaechen, app_t));
//Rotation
Transform3D drehung = new Transform3D();
Transform3D drehung2 = new Transform3D();
drehung2.rotY(Math.PI / -5.0d);
drehung.rotX(Math.PI / 5.0d);
drehung.mul(drehung2);
TransformGroup objDreh = new TransformGroup(drehung);
addMouseInteraction(objWurzel, objDreh);
objDreh.addChild(wuerfel);
objWurzel.addChild(objDreh);
// Licht
objDreh.addChild(createLight());
objDreh.addChild(new Sphere(0.1f));
return objWurzel;
}
private void addMouseInteraction(BranchGroup bg, TransformGroup tg)
{
tg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
Bounds bounds = new BoundingSphere(
new Point3d(0.0d, 0.0d, 0.0d), Double.MAX_VALUE);
MouseRotate mr = new MouseRotate();
mr.setTransformGroup(tg);
mr.setSchedulingBounds(bounds);
bg.addChild(mr);
MouseTranslate mt = new MouseTranslate();
mt.setTransformGroup(tg);
mt.setSchedulingBounds(bounds);
bg.addChild(mt);
MouseZoom mz = new MouseZoom();
mz.setTransformGroup(tg);
mz.setSchedulingBounds(bounds);
bg.addChild(mz);
}
private Material createMaterial()
{
Color3f ambientColor = new Color3f(0.3f, 0.3f, 0.3f);
Color3f emissiveColor = new Color3f(0.0f, 0.0f, 0.0f);
Color3f specularColor = new Color3f(1.0f, 1.0f, 1.0f);
Color3f diffuseColor = new Color3f(1.0f, 0.0f, 0.0f);
float shininess = 20.0f;
return new Material(ambientColor, emissiveColor,
diffuseColor, specularColor, shininess);
}
private Node createLight()
{
Bounds bounds = new BoundingSphere(
new Point3d(0.0d, 0.0d, 0.0d), Double.MAX_VALUE);
Color3f pointColor= new Color3f(1.0f,1.0f,1.0f);
Point3f pointPosition =new Point3f(1.0f,2.0f,1.0f);
Point3f pointAtt = new Point3f(1.0f,0.0f,0.0f);
PointLight pointLight = new PointLight(pointColor,pointPosition,pointAtt);
pointLight.setInfluencingBounds(bounds);
return pointLight;
}
public static void main(String[] args)
{
Third3DProgram prog = new Third3DProgram("mal sehen");
prog.addWindowListener(new WindowAdapter()
{
@Override
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
prog.setSize(800, 800);
prog.setVisible (true);
}
}