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

📄 carsteering.java

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

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

import javax.media.j3d.Behavior;
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;
/**
 * 这个类是用鼠标漫游的类
 * 构造方面接受一下TG.通过对TG的改变.来实现漫游
 * @author 魏丽平
 *
 */
public class CarSteering extends Behavior {
	private WakeupOnAWTEvent wakeupOne = null;

	private WakeupOnAWTEvent wakeupTwo = null;

	private WakeupCriterion[] wakeupArray = new WakeupCriterion[1];

	private WakeupCondition wakeupCondition = null;

	private double TRANSLATE = 1; // 四个方向的平移量

	private final double ROT = 1; // 左右键。旋转分量 1 度

	private double angle = 0; // 左右旋转后的角度

	TransformGroup m_TransformGroup = null;
	/**
	 * 构造函数里保存了tg 的一个引用.
	 * @param tg
	 */
	public CarSteering(TransformGroup tg) {
		m_TransformGroup = tg ;
		Transform3D t3d = new Transform3D();
		t3d.set(new Vector3f(0.0f, -1.0f, 3.0f));
		m_TransformGroup.setTransform(t3d);
		try {
			m_TransformGroup
					.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
			m_TransformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
		} catch (Exception e) {
		}

		wakeupOne = new WakeupOnAWTEvent(KeyEvent.KEY_PRESSED);
		wakeupArray[0] = wakeupOne;

		wakeupCondition = new WakeupOr(wakeupArray);
	}

	/**
	 * 初始化行为类
	 */
	public void initialize() {
		// Establish initial wakeup criteria
		wakeupOn(wakeupCondition);
	}

	/**
	 * Override Behavior's stimulus method to handle the event.
	 */
	public void processStimulus(Enumeration criteria) {
		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);
			}
		}

		// Set wakeup criteria for next time
		wakeupOn(wakeupCondition);
	}

	/**
	 * Process a keyboard event
	 */
	private void processAWTEvent(AWTEvent[] events) {
		
		System.out.println("nihao");
		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();
					int keyChar = eventKey.getKeyChar();

					Vector3f translate = new Vector3f();

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

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

					case KeyEvent.VK_RIGHT:
						if (angle <= 0) {
							angle += 360;
						}
						angle += -ROT;
						t3d.rotY(Math.toRadians(angle));
						break;
					// 前后键按偏移方向旋转
					case KeyEvent.VK_UP:
						checkAngle(translate, -TRANSLATE);
						break;
					case KeyEvent.VK_DOWN:
						checkAngle(translate, TRANSLATE);
						break;
					}
					// 镜头平移
					translate.y = 0.5f;
					t3d.setTranslation(translate);
					m_TransformGroup.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 < 90 || angle > 270 && angle < 360) {
			translate.z += TRANSLATE;
			translate.x += TRANSLATE * Math.tan(Math.toRadians(angle));		
		}
		if (angle > 90 && angle < 270) {
			translate.z += -TRANSLATE;
			translate.x += -TRANSLATE * Math.tan(Math.toRadians(angle));		
		}
	}
}

⌨️ 快捷键说明

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