//ScaleChange.java
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.awt.GraphicsConfiguration;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;

public class ScaleChange extends Applet implements AdjustmentListener {
  Scrollbar   sb;
  Transform3D scale3D;
  TransformGroup sliderTrans;
  float scale;

  public BranchGroup createSceneGraph() {
    BranchGroup objRoot = new BranchGroup();
    scale3D = new Transform3D();
    sliderTrans = new TransformGroup(scale3D);
    sliderTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
    objRoot.addChild(sliderTrans);
        
    BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);

    Color3f bgColor = new Color3f(1.0f, 1.0f, 1.0f);
    Background bg = new Background(bgColor);
      bg.setApplicationBounds(bounds);
    objRoot.addChild(bg);

    TransformGroup objTrans = new TransformGroup();
    objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
    sliderTrans.addChild(objTrans);
    objTrans.addChild(new ColorCube(0.4));

    Transform3D yAxis = new Transform3D();
    Alpha rotationAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE,
                                     0, 0, 4000, 0, 0, 0, 0, 0);

    RotationInterpolator rotator = new RotationInterpolator(rotationAlpha, 
                              objTrans, yAxis, 0.0f, (float) Math.PI*2.0f);
    rotator.setSchedulingBounds(bounds);
    sliderTrans.addChild(rotator);
    objRoot.compile();
    return objRoot;
  }

  public void adjustmentValueChanged(AdjustmentEvent e) {
    scale=(float)sb.getValue()/10.0f+1.0f;
    scale3D.setScale(scale);
    sliderTrans.setTransform(scale3D);
  }

  public ScaleChange() {
    setLayout(new BorderLayout());
    GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
    Canvas3D c = new Canvas3D(config);
    add("Center", c);

    sb = new Scrollbar(Scrollbar.HORIZONTAL, 0, 1, -10, 10);
    sb.addAdjustmentListener(this);
    add("South", sb);
    BranchGroup scene = createSceneGraph();
    SimpleUniverse u = new SimpleUniverse(c);
    u.getViewingPlatform().setNominalViewingTransform();
    u.addBranchGraph(scene);
  }

  public static void main(String[] args) {
    new MainFrame(new ScaleChange(), 400, 300);
  }
}
//end of ScaleChange.java