⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keynavi.java

📁 本项目是用JAVA3D开发的一款图形界面的3D漫游的类似引擎.至所以这么说.是因为它的部分功能还不完全.说它是引擎是因为它可以完全脱离模型文件.本引擎实现了虚拟漫游,碰撞检测,动态添加模型,以及部分纹
💻 JAVA
字号:
package cn.bz.collision;

import java.awt.AWTEvent;
import java.awt.event.KeyEvent;
import java.util.Enumeration;

import javax.media.j3d.Behavior;
import javax.media.j3d.Bounds;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.media.j3d.WakeupCondition;
import javax.media.j3d.WakeupCriterion;
import javax.media.j3d.WakeupOnAWTEvent;
import javax.media.j3d.WakeupOr;
import javax.vecmath.Vector3f;


import com.sun.j3d.utils.universe.SimpleUniverse;
/**
 * 此类是一个键盘导航类,并保存了Colli_View.theView引用,与Colli_View一起用,能实现视野与添加了
 * Colli_View行为的对象的碰撞检测,发生碰撞时,我们通过Colli_View.theView这个引用重置键盘导航的
 * 值,
 * @author 李光
 *
 */
public class KeyNavi extends Behavior {

	private SimpleUniverse su;

	private Bounds bounds;

	// 碰撞检测参数
	WakeupCondition wakeupCondition = null;

	// 漫游参数
	public  static double suduD = 0.3 ;			//用户修改后的速度
	private TransformGroup viewTransformGroup;
	public  static double FTRANSLATE = suduD; 	// 前方向的平移量
	public  static double BTRANSLATE = suduD; 	// 后方向的平移量
	
	private final double ROT = 2; 				// 左右键。旋转分量 1 度
	private double angle = 0; 					// 左右旋转后的角度
	public  static int flag = 0  ;				//判断发生碰撞时,按的是那个键

	public KeyNavi(TransformGroup viewTransformGroup) {
		this.viewTransformGroup = viewTransformGroup;
		init();
		//在此保存了一个本类的引用
		Colli_View_Exit.theView = this;
		Colli_View_Entry.theView = this;
		ObjParse.keyNavi = this ;
	}

	private void init() {

		WakeupOnAWTEvent wakeupOne = null;

		WakeupCriterion[] wakeupArray = new WakeupCriterion[1];

		wakeupOne = new WakeupOnAWTEvent(KeyEvent.KEY_PRESSED);

		wakeupArray[0] = wakeupOne;

		wakeupCondition = new WakeupOr(wakeupArray);
	}


	public void initialize() {
		// TODO Auto-generated method stub
		wakeupOn(wakeupCondition);

	}

	public void processStimulus(Enumeration criteria) {
		// TODO Auto-generated method stub
		WakeupOnAWTEvent ev;
		WakeupCriterion genericEvt;
		AWTEvent[] events;

		while (criteria.hasMoreElements()) {
			genericEvt = (WakeupCriterion) criteria.nextElement();

			if (genericEvt instanceof WakeupOnAWTEvent) {
				ev = (WakeupOnAWTEvent) genericEvt;
				events = ev.getAWTEvent();
				processAWTEvent(events);
			}
		}
		wakeupOn(wakeupCondition);
	}

	private void processAWTEvent(AWTEvent[] events) {
		for (int n = 0; n < events.length; n++) {
			if (events[n] instanceof KeyEvent) {
				KeyEvent eventKey = (KeyEvent) events[n];

				if (eventKey.getID() == KeyEvent.KEY_PRESSED) {
					int keyCode = eventKey.getKeyCode();
					Vector3f translate = new Vector3f();

					Transform3D t3d = new Transform3D();
					viewTransformGroup.getTransform(t3d);
					t3d.get(translate);

					switch (keyCode) {
					// 左右键用来旋转
					case KeyEvent.VK_LEFT:
						FTRANSLATE = suduD;
						BTRANSLATE = suduD;
						if (angle >= 360) {
							angle -= 360;
						}
						angle += ROT;
						t3d.rotY(Math.toRadians(angle));
						break;

					case KeyEvent.VK_RIGHT:
						FTRANSLATE = suduD;
						BTRANSLATE = suduD;
						if (angle <= 0) {
							angle += 360;
						}
						angle += -ROT;
						t3d.rotY(Math.toRadians(angle));
						break;
					// 前后键按偏移方向旋转
					case KeyEvent.VK_UP:
						flag = 1 ;
						BTRANSLATE = suduD ;
						checkAngle(translate, -FTRANSLATE); 
						break;
					case KeyEvent.VK_DOWN:
						flag = 2 ;
						FTRANSLATE = suduD ;
						checkAngle(translate, BTRANSLATE);
						break;
					}
					// 镜头平移
					t3d.setTranslation(translate);
					viewTransformGroup.setTransform(t3d);
				}
			}
		}
	}

	/**
	 * 根据angle的角度.来进行坐标的平移.实现漫游功能
	 * 
	 */
	public void checkAngle(Vector3f translate, double TRANSLATE) {
		if (angle == 90)
			translate.x += TRANSLATE;
		if (angle == 180)
			translate.z += -TRANSLATE;
		if (angle == 270)
			translate.x += -TRANSLATE;
		if (angle == 360 || angle == 0)
			translate.z += TRANSLATE;
		if (angle >= 0 && angle <= 360) {
			translate.z += TRANSLATE * Math.cos(Math.toRadians(angle));
			translate.x += TRANSLATE * Math.sin(Math.toRadians(angle));
		}
	}
	
	public int getFlag(){
		return flag ;
	}
	
	/**
	 * 设置前进和后退的速度
	 * @param translate
	 */
	public void setTranslate(double translate){
		suduD = translate ;
		this.FTRANSLATE = translate ;
	}
}

⌨️ 快捷键说明

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