Java 版 (精华区)

发信人: bali (阿奔), 信区: Java
标  题: JAVA3D学习系列(16)--动画的生成(中)
发信站: 紫 丁 香 (Fri Mar 24 11:06:28 2000), 转信

发信人: vrml (3d), 信区: Java
标  题: JAVA3D学习系列(16)--动画的生成(中)
发信站: BBS 水木清华站 (Mon Apr 26 11:48:12 1999)

           JAVA3D学习系列(16)--动画的生成(中)


     汕头大学机电系  张杰(jzhang@mailserv.stu.edu.cn)


    上一讲我们已经介绍了一个JAVA3D的内插对象:
PositionInterpolator。本讲我们将继续介绍其它的
内插对象。

一. RotationInterpolator对象
    RotationInterpolator的构造函数有两个:
    public RotationInterpolator(Alpha alpha,
                                TransformGroup target)
    public RotationInterpolator(Alpha alpha,
                                TransformGroup target,
                                Transform3D axisOfRotation,
                                float minimumAngle,
                                float  maximumAngle)

    RotationInterpolator的方法有:
       public void setMinimumAngle(float angle)
       public float getMinimumAngle()

       public void setMaximumAngle(float angle)
       public float getMaximumAngle()

       public void setAxisOfRotation(Transform3D axis)
       public Transform3D getAxisOfRotation()

       public void setTarget(TransformGroup target)
       public TransformGroup getTarget()

       public void processStimulus(Enumeration criteria)

    利用这个对象,我们可以在给定的时间内,使某一个局部坐标系
在按照Alpha提供的方式绕着某一个轴旋转,它的作用类似于VRML
的OrientationInterpolator节点。
    RotationInterpolator的前三个参数和我们上一讲介绍的
PositionInterpolator对象的前三个参数概念一样:
    Alpha为我们提供了旋转方式。
    target为我们提供了需要旋转的局部坐标系。
    axisOfRotation确定了旋转轴的方位。

1. 第一个构造函数的运行结果
    假如我们利用的是第一个构造函数,我们所获得的最大角度为
2*PI,最小角度为0,坐标系绕着Y轴,按照Alpha给出的旋转方式
旋转。

2. 第二个构造函数的运行结果
    我们来看一下OrientationInterpolator第二个构造函数的后两
个参数,它们给出了旋转的最大最小的角度。
    下面的程序Rot.java利用了RotationInterpolator对象,使一个
立方体绕着自己的Y轴不停地旋转:先正转180度。停顿几秒后,又反
转180度,再停顿几秒钟。

//Rot.java
import com.sun.j3d.utils.geometry.ColorCube;
import java.applet.Applet;
import java.awt.BorderLayout;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;

public class Rot extends Applet {
    private BranchGroup createSceneGraph( ) {
        float min = 0.0f;
        float max = (float) Math.PI;
        BranchGroup objRoot = new BranchGroup();
        BoundingSphere bound=new BoundingSphere(
           new Point3d(0.0,0.0,0.0),50.);

        Transform3D tr=new Transform3D();
        TransformGroup group=new TransformGroup(tr);
        group.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
        group.addChild(new ColorCube());

        Alpha xtranAlpha = new Alpha(-1,
            Alpha.DECREASING_ENABLE|Alpha.INCREASING_ENABLE,
            0, 0,5000, (long)0.5, 5000, 5000,(long)0.5, 5000);
        RotationInterpolator tran =
            new RotationInterpolator(xtranAlpha, group, tr,
                                     min,max);
        tran.setSchedulingBounds(bound);
        group.addChild(tran);

        Color3f bgColor = new Color3f(1.0f, 1.0f, 1.0f);
        Background bg = new Background(bgColor);
        bg.setApplicationBounds(bound);
        objRoot.addChild(bg);

        objRoot.addChild(group);
        return objRoot;
    }

    public Rot() {
        setLayout(new BorderLayout());
        Canvas3D c = new Canvas3D(null);
        add("Center", c);
          ViewPlatform        viewPlatform;
          Viewer viewer = new Viewer(c);
          Vector3d viewpoint = new Vector3d(0.0, 0.0, 10.0);
                                                 //初始观察点位置
       Transform3D t = new Transform3D();
       t.set(viewpoint);
          ViewingPlatform v = new ViewingPlatform( );
          v.getViewPlatformTransform().setTransform(t);

        BranchGroup scene = createSceneGraph();
       SimpleUniverse u =   new SimpleUniverse( v,   viewer);

       u.getViewingPlatform();
       u.addBranchGraph(scene);
    }

    public static void main(String[] args) {
        new MainFrame(new Rot(), 400,400);
    }
}
//end of Rot.java

    我们给出相应的VRML语言编写出的程序,由VRML程序的
运行结果可以看出,VRML程序无法使形体的速度渐变,而只
能突变,因而JAVA3D在这一方面功能较强。

#VRML V2.0 utf8
DEF T Transform{
  children Shape{
    appearance Appearance{material Material{diffuseColor 1 0 .5}}
    geometry Box{}}
}
DEF ild(new Cone( ));
              s.addChild(new ColorCube(0.2));
              s.setCapability(Switch.ALLOW_SWITCH_WRITE);
        objTrans.addChild(obj);
        obj.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);

             obj.addChild(s);
        Alpha scaleAlpha = new Alpha(-1,
                        Alpha.INCREASING_ENABLE|Alpha.DECREASING_ENABLE,
                                        0, 0, 4000, 0, 4000, 4000, 0, 4000);
        SwitchValueInterpolator sv =
           new SwitchValueInterpolator(scaleAlpha, s,0,4);
        BoundingSphere bounds =
            new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
        sv.setSchedulingBounds(bounds);

        obj.addChild(sv);

    Color3f light1Color = new Color3f(1.0f, 1.0f, 0.9f);
      Vector3f light1Direction  = new Vector3f(4.0f, -7.0f, -12.0f);

      DirectionalLight light1
            = new DirectionalLight(light1Color, light1Direction);
      light1.setInfluencingBounds(bounds);

      objRoot.addChild(light1);

        objRoot.compile();

        return objRoot;
        }

    public mySwitch() {
        setLayout(new BorderLayout());
        Canvas3D c = new Canvas3D(null);
        add("Center", c);
        BranchGroup scene = createSceneGraph();
        SimpleUniverse u = new SimpleUniverse(c);
        u.getViewingPlatform().setNominalViewingTransform();
        u.addBranchGraph(scene);
    }
        public static void main(String[] args) {
                new MainFrame(new mySwitch(),400,400);
    }
}

//end of mySwitch.java


--
※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: 202.118.243.89]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:4.266毫秒