本帖最后由 snoopy79 于 2009-10-15 21:16:22 编辑

解决方案 »

  1.   

    刚学Java一个多月,很多东西都不懂。现在被老师赶着写个程序,要实现4*4*4的小立方体依次出现的效果,还要用JSlider和JButton去控制它。我现在把JSlider那块写完了,可以做到拖动滑块Canvas上出现相应的立方体数。但是Button那里搞不定,我想要的是一按Start动画从头开始,按Stop就停止。请大家帮我看一下,下面是代码,被我写得有点乱。另外,我是新手,分数少得可怜,不好意思。// TestBoundingBox.javaimport java.awt.BorderLayout;
    import java.awt.Frame;
    import java.awt.GraphicsConfiguration;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;import javax.media.j3d.Alpha;
    import javax.media.j3d.BoundingBox;
    import javax.media.j3d.BoundingSphere;
    import javax.media.j3d.BranchGroup;
    import javax.media.j3d.Canvas3D;
    import javax.swing.JButton;
    import javax.swing.JPanel;
    import javax.swing.JSlider;
    import javax.swing.event.*;
    import javax.vecmath.Point3d;import com.sun.j3d.utils.behaviors.vp.OrbitBehavior;
    import com.sun.j3d.utils.universe.SimpleUniverse;
    import com.sun.j3d.utils.universe.ViewingPlatform;public class TestBoundingBox {/**
    * set coordinates for every surface of the bounding box
    *
    * @param points
    * @param vs
    * @param position
    */private Frame frame;private JPanel panel;
    private JSlider slider;
    private JButton startButton;
    private JButton stopButton;private int numberOfPortion;
    private int numberOfPortionSum;private SingleBox[] singleBoxes;private Canvas3D canvas3D;
    private BoundingBox bbox;
    private BranchGroup bg;
    private SimpleUniverse simpleU;private int PreDatum;static final int MIN = 0;
    static final int INIT = 0;public void discreteCube(BoundingBox bbox, Double factor,
    Point3d translation, BranchGroup objRoot, String color,
    Integer viewType, int numberOfPortion) {Point3d lower = new Point3d();
    bbox.getLower(lower);Point3d upper = new Point3d();
    bbox.getUpper(upper);double interval = Math.abs(upper.x - lower.x) / numberOfPortion;
    BoundingBox[][][] bb = new BoundingBox[numberOfPortion][numberOfPortion][numberOfPortion];int counter = 0;
    for (int i = 0; i < numberOfPortion; i++) {
    for (int j = 0; j < numberOfPortion; j++) {
    for (int k = 0; k < numberOfPortion; k++) {bb[i][j][k] = new BoundingBox(new Point3d(lower.x + i
    * interval, lower.y + j * interval, lower.z + k
    * interval), new Point3d(lower.x + (i + 1)
    * interval, lower.y + (j + 1) * interval, lower.z
    + (k + 1) * interval));
    singleBoxes[counter].drawBox(bb[i][j][k], factor, translation, objRoot,
    color, viewType);
    counter++;
    }
    }
    }System.out.println("The volume of unit cube is: " + interval * interval
    * interval);
    System.out.println("The volume of whole cube is: " + interval
    * numberOfPortion * interval * numberOfPortion * interval
    * numberOfPortion);
    }private void setupView(SimpleUniverse universe, Canvas3D canvas,
    BoundingSphere bounds) {// add mouse interaction to the ViewingPlatformOrbitBehavior orbit = new OrbitBehavior(canvas,
    OrbitBehavior.REVERSE_ALL);orbit.setSchedulingBounds(bounds);ViewingPlatform viewingPlatform = universe.getViewingPlatform();// This will move the ViewPlatform back a bit so the// objects in the scene can be viewed.viewingPlatform.setNominalViewingTransform();viewingPlatform.setViewPlatformBehavior(orbit);}public TestBoundingBox() {PreDatum = -1;
    numberOfPortion = 4;
    numberOfPortionSum = numberOfPortion * numberOfPortion
    * numberOfPortion;singleBoxes = new SingleBox[numberOfPortionSum];for (int i = 0; i < numberOfPortionSum; i++) {
    singleBoxes[i] = new SingleBox();
    }Point3d min = new Point3d(-1, -1, -1);
    Point3d max = new Point3d(1, 1, 1);
    bbox = new BoundingBox();
    bbox.setLower(min);
    bbox.setUpper(max);frame = new Frame("3D Modell");
    GraphicsConfiguration config = SimpleUniverse
    .getPreferredConfiguration();canvas3D = new Canvas3D(config);
    canvas3D.setSize(500, 500);
    canvas3D.setDoubleBufferEnable(true);
    frame.add(canvas3D);panel = new JPanel();slider = new JSlider(JSlider.HORIZONTAL, MIN, numberOfPortion
    * numberOfPortion * numberOfPortion - 1, INIT);
    slider.addChangeListener(new SliderListener());
    slider.setMajorTickSpacing(1);
    // slider.setMinorTickSpacing(2);
    slider.setPaintTicks(true);
    slider.setPaintLabels(true);startButton = new JButton("start");
    startButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {System.out.println("start Animation");redo(slider.getValue());// if (PreDatum > -1)
    // {
    // if(PreDatum > slider.getValue()){
    //
    // }
    // }
    //
    // for (int i = 0; i < numberOfPortionSum; i++)
    // {
    // singleBoxes[i].startDraw(0);
    //     }
    //
    // for (int i = 0; i < numberOfPortionSum; i++)
    // {
    // singleBoxes[i].setTransparent(1);
    // }// for (int i = 0; i < numberOfPortionSum; i++) {
    // singleBoxes[i].setTransparent(1);
    // }
    // for (int i = 0; i < slider.getValue(); i++)
    // {
    // singleBoxes[i].startDraw(i);
    //     }//
    // for (int i = 0; i < numberOfPortionSum; i++) {
    // //singleBoxes[i].setTransparent(0);
    // singleBoxes[i].startDraw(i);
    // }
    }
    });stopButton = new JButton("stop");stopButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {
    simpleU.cleanup();
    simpleU.getCanvas();
    canvas3D.repaint();
    // discreteCube(bbox, null, null, bg, "red", null,
    // numberOfPortion);
    }
    });frame.add(panel, BorderLayout.SOUTH);
    panel.add(slider, BorderLayout.WEST);
    panel.add(startButton);
    panel.add(stopButton);simpleU = new SimpleUniverse(canvas3D);
    bg = new BranchGroup();discreteCube(bbox, null, null, bg, "red", null, numberOfPortion);
    simpleU.addBranchGraph(bg);BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0),
    1000.0);
    this.setupView(simpleU, canvas3D, bounds);
    simpleU.getViewingPlatform().setNominalViewingTransform();frame.addWindowListener(new WindowAdapter() {
    public void windowClosing(WindowEvent winEvent) {
    System.exit(0);
    }
    });
    frame.pack();
    frame.setVisible(true);
    }public class SliderListener implements ChangeListener
    {
    public void stateChanged(ChangeEvent e)
    {System.out.println(slider.getValue());if (PreDatum > -1)
    {
    if(PreDatum > slider.getValue()){}
    }for (int i = 0; i < numberOfPortionSum; i++)
    {
    singleBoxes[i].startDraw(0);
        }for (int i = 0; i < slider.getValue(); i++)
    {
    singleBoxes[i].setTransparent(0);
    }
    for (int i = numberOfPortionSum-1; i > slider.getValue(); i--)
    {
    singleBoxes[i].setTransparent(1);
    }
    // for (int i = 0; i < slider.getValue(); i++) {
    // singleBoxes[i].startDraw(0);
    // }}
    }public void redo(int datum)
    {
    // bg = new BranchGroup();
    // discreteCube(bbox, null, null, bg, "red", null, numberOfPortion);
    // simpleU.addBranchGraph(bg);
    //
    if (PreDatum > -1)
    {
    if(PreDatum > datum){}
    }for (int i = 0; i < datum; i++)
    {
    singleBoxes[i].setTransparent(0);
    singleBoxes[i].startDraw(i);
        }for (int i = numberOfPortionSum-1; i > datum; i--)
    {
    singleBoxes[i].setTransparent(1);
    // singleBoxes[i].startDraw(0);
    }}public static void main(String[] args) {
    new TestBoundingBox();
    }} 
      

  2.   

    提示说我帖子太长,下面还有段代码:// SingleBox.javaimport java.awt.Color;import javax.media.j3d.Alpha;
    import javax.media.j3d.Appearance;
    import javax.media.j3d.BoundingBox;
    import javax.media.j3d.BoundingSphere;
    import javax.media.j3d.BranchGroup;
    import javax.media.j3d.ColoringAttributes;
    import javax.media.j3d.Material;
    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.media.j3d.TransparencyInterpolator;
    import javax.vecmath.Color3f;
    import javax.vecmath.Point3d;
    import javax.vecmath.Vector3d;
    public class SingleBox {private Alpha alpha;private Appearance app;TransparencyAttributes objTransp;private void setBoundingBoxSurfacePoints(Point3d[] points,
    Point3d[][][] vs, int position) {int count = 0;
    switch (position) {
    case 0:
    for (int i = 0; i < 2; i++) {
    for (int j = 0; j < 2; j++) {
    points[count] = vs[0][i][j];count = count + 1;
    }
    }
    count = 0;
    break;
    case 1:
    for (int i = 0; i < 2; i++) {
    for (int j = 0; j < 2; j++) {
    points[count] = vs[1][i][j];
    count = count + 1;
    }
    }
    count = 0;
    break;
    case 2:
    for (int i = 0; i < 2; i++) {
    for (int j = 0; j < 2; j++) {
    points[count] = vs[i][0][j];
    count = count + 1;
    }
    }
    count = 0;
    break;
    case 3:
    for (int i = 0; i < 2; i++) {
    for (int j = 0; j < 2; j++) {
    points[count] = vs[i][1][j];
    count = count + 1;
    }
    }
    count = 0;
    break;
    case 4:
    for (int i = 0; i < 2; i++) {
    for (int j = 0; j < 2; j++) {
    points[count] = vs[i][j][0];
    count = count + 1;
    }
    }
    count = 0;
    break;
    case 5:
    for (int i = 0; i < 2; i++) {
    for (int j = 0; j < 2; j++) {
    points[count] = vs[i][j][1];
    count = count + 1;
    }
    }
    count = 0;
    break;
    default:
    break;
    }
    }public SingleBox()
    {
    alpha = new Alpha();
    alpha.setLoopCount(1);
    alpha.setMode(Alpha.DECREASING_ENABLE);
    alpha.setPhaseDelayDuration(200);
    alpha.pause();}public void resetBox()
    {
    alpha.pause();
    }public void drawBox(BoundingBox bbox, Double factor,
    Point3d translation, BranchGroup objRoot, String color,
    Integer viewType) {if (factor == null) {
    factor = 1.0d;
    }Point3d lower = new Point3d();
    bbox.getLower(lower);Point3d upper = new Point3d();
    bbox.getUpper(upper);PolygonAttributes pAtt = new PolygonAttributes();
    pAtt.setCullFace(PolygonAttributes.CULL_NONE);if (viewType == null) {
    pAtt.setPolygonMode(PolygonAttributes.POLYGON_LINE);
    } else {
    pAtt.setPolygonMode(PolygonAttributes.POLYGON_FILL);
    }pAtt.setBackFaceNormalFlip(true);Material mat = new Material();
    mat.setDiffuseColor(1.f, 1.f, 0);ColoringAttributes ca_2 = new ColoringAttributes();if (color != null & color.equalsIgnoreCase("red")) {
    ca_2.setColor(new Color3f(Color.RED));
    }if (color != null & color.equalsIgnoreCase("blue")) {
    ca_2.setColor(new Color3f(Color.BLUE));
    }if (color != null & color.equalsIgnoreCase("green")) {
    ca_2.setColor(new Color3f(Color.GREEN));
    }if (color != null & color.equalsIgnoreCase("gray")) {
    ca_2.setColor(new Color3f(Color.GRAY));
    }if (color != null & color.equalsIgnoreCase("yellow")) {
    ca_2.setColor(new Color3f(Color.YELLOW));
    }if (color != null & color.equalsIgnoreCase("black")) {
    ca_2.setColor(new Color3f(Color.BLACK));
    }if (color == null) {
    ca_2.setColor(new Color3f(Color.BLUE));
    }setApp(new Appearance());
    getApp().setColoringAttributes(ca_2);
    getApp().setPolygonAttributes(pAtt);
    getApp().setMaterial(mat);Point3d[][][] vs = new Point3d[2][2][2];vs[0][0][0] = new Point3d();
    vs[0][0][1] = new Point3d();
    vs[0][1][0] = new Point3d();
    vs[0][1][1] = new Point3d();
    vs[1][0][0] = new Point3d();
    vs[1][0][1] = new Point3d();
    vs[1][1][0] = new Point3d();
    vs[1][1][1] = new Point3d();for (int i = 0; i < 2; i++) {
    for (int j = 0; j < 2; j++) {
    vs[0][i][j].setX(lower.x * factor);
    vs[1][i][j].setX(upper.x * factor);
    vs[i][0][j].setY(lower.y * factor);
    vs[i][1][j].setY(upper.y * factor);
    vs[i][j][0].setZ(lower.z * factor);
    vs[i][j][1].setZ(upper.z * factor);
    }
    }for (int i = 0; i < 6; i++) {Point3d[] bboxPoints = new Point3d[4];
    setBoundingBoxSurfacePoints(bboxPoints, vs, i);QuadArray bboxGeo = new QuadArray(4, QuadArray.COORDINATES);
    bboxGeo.setCoordinate(0, bboxPoints[1]);
    bboxGeo.setCoordinate(1, bboxPoints[0]);
    bboxGeo.setCoordinate(2, bboxPoints[2]);
    bboxGeo.setCoordinate(3, bboxPoints[3]);Shape3D bboxShape = new Shape3D();
    bboxShape.setGeometry(bboxGeo);
    bboxShape.setAppearance(getApp());
    Transform3D transform = new Transform3D();if (translation != null) {
    transform.setTranslation(new Vector3d(translation));
    }TransformGroup transformGruppe = new TransformGroup();
    transformGruppe.setTransform(transform);
    transformGruppe.addChild(bboxShape);objTransp = new TransparencyAttributes();
    objTransp.setCapability(TransparencyAttributes.ALLOW_VALUE_WRITE);
    objTransp.setTransparencyMode(TransparencyAttributes.BLENDED);BoundingSphere bounds = new BoundingSphere();TransparencyInterpolator traInt = new TransparencyInterpolator(
    alpha, objTransp, 0, 1);
    traInt.setSchedulingBounds(bounds);objRoot.addChild(transformGruppe);
    getApp().setTransparencyAttributes(objTransp);
    objRoot.addChild(traInt);
    }
    }public void startDraw(int i)
    {
    alpha.setTriggerTime(500 * i);
    alpha.resume();
    }// public void hideBox()
    // {
    // this.setTransparent(1);
    // }public void setApp(Appearance app) {
    this.app = app;
    }public Appearance getApp() {
    return app;
    }public void setTransparent(float trans){
    this.objTransp.setTransparency(trans);
    }