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