📄 carsteering.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 + -