simplebehavior.java

来自「包括了JAVA3D(全世界都能看到的网络三维动画)的源代码部分! 很多基础但是」· Java 代码 · 共 105 行

JAVA
105
字号
//SimpleBehavior.java
//该程序用来说明如何写自己的Behavior
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.AWTEvent;
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.*;
import java.awt.event.*;
import java.util.Enumeration;

public class SimpleBehavior extends Applet {

    public class MyBehavior extends Behavior{
		// 控制目标对象以及状态信息
        private TransformGroup targetTG;
        private Transform3D rotation = new Transform3D();
        private double angle = 0.0;

        // 构造函数
        MyBehavior(TransformGroup targetTG){
            this.targetTG = targetTG;
					//获得控制对象的引用
        }

        
		// initialize 方法
        public void initialize(){
			this.wakeupOn(new WakeupOnAWTEvent(KeyEvent.KEY_PRESSED));
					//设置唤醒条件为有键按下
        }

        // processStimulus方法
        public void processStimulus(Enumeration criteria){
           	WakeupCriterion wakeup = null;
			AWTEvent[] event = null;
			// 对获得的事件进行解析,并作出响应的反应
			wakeup = (WakeupCriterion)criteria.nextElement( );
					// 获得当前的唤醒条件
			if ( wakeup instanceof WakeupOnAWTEvent )
			{
				event = ((WakeupOnAWTEvent)wakeup).getAWTEvent( );
						// 获得当前的唤醒事件
				KeyEvent keyevent = (KeyEvent)event[0];
						// 转化为键盘事件
				// 判断是否为左键,并做相应左旋处理
				if(keyevent.getKeyCode()==KeyEvent.VK_LEFT){
					angle-=0.1;
					rotation.rotY(angle);
					targetTG.setTransform(rotation);
				}
				// 判断是否为右键,并做相应右旋处理
				if(keyevent.getKeyCode()==KeyEvent.VK_RIGHT){
					angle+=0.1;
					rotation.rotY(angle);
		            targetTG.setTransform(rotation);
				}
			}
			// 设置下一次的唤醒条件
            this.wakeupOn(new WakeupOnAWTEvent(KeyEvent.KEY_PRESSED));
        }
    } 

    public BranchGroup createSceneGraph() {
		BranchGroup objRoot = new BranchGroup();
				// 创建根分支节点
		// 添加一个可旋转的节点
		TransformGroup objRotate = new TransformGroup();
		objRotate.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
		objRoot.addChild(objRotate);
		objRotate.addChild(new ColorCube(0.4));
				// 向该节点添加六面体
		// 向场景中添加新的行为对象
		MyBehavior myRotationBehavior = new MyBehavior(objRotate);
				// 设定该行为控制的对象为可旋转的节点
	    myRotationBehavior.setSchedulingBounds(new BoundingSphere());
				// 设定作用范围	
//	    objRoot.addChild(myRotationBehavior);
		objRotate.addChild(myRotationBehavior);
				// 将行为对象添加到根结点,即接收激励的来源
		objRoot.compile();
				// 进行优化
		return objRoot;
    } 

    public SimpleBehavior() {
        setLayout(new BorderLayout());
        Canvas3D canvas3D = new Canvas3D(null);
        add("Center", canvas3D);
        BranchGroup scene = createSceneGraph();
		SimpleUniverse simpleU = new SimpleUniverse(canvas3D);
				// 创建虚拟空间
		simpleU.getViewingPlatform().setNominalViewingTransform();
				//将观察者向后移动
        simpleU.addBranchGraph(scene);
    } 
    public static void main(String[] args) {
        Frame frame = new MainFrame(new SimpleBehavior(), 256, 256);
    } 

} 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?