import java.applet.Applet;
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.BorderLayout;
import java.awt.GraphicsConfiguration;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.geometry.Cylinder;
import com.sun.j3d.utils.universe.*;
import javax.vecmath.*;
import javax.media.j3d.*;
public class Pseudo extends Applet{
SimpleUniverse u = null;
private TransformGroup schultergelenk;
private TransformGroup ellBogenGelenk;
Canvas3D canvas;
BoundingSphere BigBounds = new BoundingSphere(new Point3d(), 1000);
public Pseudo() {
}
public void destroy(){
u.cleanup();
}
public void init(){
setLayout(new BorderLayout());
GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
canvas = new Canvas3D(config);
add("Center",canvas);
add("East",createControlPanel());
u = new SimpleUniverse(canvas);
u.getViewingPlatform().setNominalViewingTransform();
u.addBranchGraph(erstelleSzenenGraph());
}
private Component createControlPanel()
{
JPanel p = new JPanel(new GridLayout(0,2));
final JCheckBox link = new JCheckBox();
p.add(new JLabel("Schulter"));
final JSlider ss = new JSlider(0,360,0);
ss.addChangeListener(new ChangeListener()
{
public void stateChanged(ChangeEvent e)
{
float angleDeg = ss.getValue();
setzeSchulterWinkel(angleDeg);
if (link.isSelected())
{
setzeEllbogenWinkel(180-angleDeg);
}
}
});
p.add(ss);
p.add(new JLabel("Ellbogen"));
final JSlider es = new JSlider(0,360,0);
es.addChangeListener(new ChangeListener()
{
public void stateChanged(ChangeEvent e)
{
float angleDeg = es.getValue();
setzeEllbogenWinkel(angleDeg);
if (link.isSelected())
{
setzeSchulterWinkel(180-angleDeg);
}
}
});
p.add(es);
p.add(new JLabel("Verbinde"));
p.add(link);
return p;
}
private void setzeSchulterWinkel(float angleDeg)
{
System.out.println("Schulter: "+angleDeg);
Transform3D t = new Transform3D();
t.setRotation(new AxisAngle4f(0f, 0f, 1f, (float)Math.toRadians(angleDeg)));
schultergelenk.setTransform(t);
}
private void setzeEllbogenWinkel(float angleDeg)
{
System.out.println("Ellbogen: "+angleDeg);
Transform3D t = new Transform3D();
t.setRotation(new AxisAngle4f(0f, 0f, 1f, (float)Math.toRadians(angleDeg)));
ellBogenGelenk.setTransform(t);
}
public BranchGroup erstelleSzenenGraph(){
BranchGroup schulter = new BranchGroup();
schulter.addChild(new Sphere(0.07f));
schulter.addChild(erstelleAmbientLight());
schulter.addChild(erstelleDirectLight());
float oberarmLaenge = 0.6f;
float unterarmLaenge = 0.5f;
schultergelenk = new TransformGroup();
schultergelenk.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
schulter.addChild(schultergelenk);
Group oberarmObjekt = erstelleCylinder(0.05f, oberarmLaenge,
Sphere.GENERATE_NORMALS, erstelleAppearance(true));
schultergelenk.addChild(oberarmObjekt);
TransformGroup oberarm = erstelleKonstante(oberarmLaenge);
oberarm.addChild(new Sphere(0.06f));
schultergelenk.addChild(oberarm);
ellBogenGelenk = new TransformGroup();
ellBogenGelenk.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
oberarm.addChild(ellBogenGelenk);
Group unterarmobjekt = erstelleCylinder(0.05f, unterarmLaenge,
Sphere.GENERATE_NORMALS,erstelleAppearance(false));
ellBogenGelenk.addChild(unterarmobjekt);
TransformGroup unterarm = erstelleKonstante(unterarmLaenge);
ellBogenGelenk.addChild(unterarm);
unterarm.addChild(new Sphere(0.05f));
schulter.compile();
return schulter;
}
private static Group erstelleCylinder(float radius, float length, int flags, Appearance app)
{
Transform3D t = new Transform3D();
t.setTranslation(new Vector3f(0,length/2,0));
TransformGroup tg = new TransformGroup(t);
Cylinder c = new Cylinder(radius, length, flags, app);
tg.addChild(c);
return tg;
}
private static TransformGroup erstelleKonstante(float dy)
{
Transform3D t = new Transform3D();
t.setTranslation(new Vector3f(0,dy,0));
TransformGroup tg = new TransformGroup(t);
return tg;
}
public static void main(String[] args) {
new MainFrame(new Pseudo(), 1000, 600);
}
public DirectionalLight erstelleDirectLight(){
DirectionalLight directlight = new DirectionalLight(
new Color3f(0.8f, 0.8f, 0.8f), new Vector3f(-0.5f, -1f, -0.5f));
directlight.setInfluencingBounds(BigBounds);
return directlight;
}
public AmbientLight erstelleAmbientLight(){
AmbientLight amlight = new AmbientLight(new Color3f(0.8f, 0.8f, 0.8f));
amlight.setInfluencingBounds(BigBounds);
return amlight;
}
public Appearance erstelleAppearance(boolean wahr){
if(wahr){
Appearance app = new Appearance();
app.setMaterial(new Material(new Color3f(0.6f, 0.1f, 0.5f),
new Color3f(0f, 0f, 0f),
new Color3f(0.9f, 0.9f, 0.9f),
new Color3f(0.8f, 0.8f, 0.8f),
1f));
return app;
}
Appearance app2 = new Appearance();
app2.setMaterial(new Material(new Color3f(0f, 0f, 1f),
new Color3f(0f, 0f, 0f),
new Color3f(0.9f, 0.9f, 0.9f),
new Color3f(0.8f, 0.8f, 0.8f),
1f));
return app2;
}
}