📄 ramble.java
字号:
package cn.bz.collision;
import java.awt.BorderLayout;
import java.util.List;
import cn.bz.head.frame.ModelManager;
import cn.bz.picking.TestPickBox;
import com.sun.j3d.utils.picking.behaviors.PickRotateBehavior;
import com.sun.j3d.utils.picking.behaviors.PickTranslateBehavior;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.swing.JPanel;
import javax.vecmath.*;
/**
* 封好的
*
* @author 魏丽平
*
*/
public class Ramble extends JPanel {
public static BranchGroup sceneRoot;
//public static SimpleUniverse simpleUniverse ;
private static final long serialVersionUID = 1L;
TransformGroup vpTrans;
BoundingBox Scenebounds;
boolean flag = false;
Canvas3D c ;
List sceneList; // 存取场景列表
/**
*
* @param filename
* //模型文件名
* @param flagCollision
* //是否添加碰撞检测
* @param flagPicking
* //是否添加点取
* @return
*/
public void createSceneGraph(List models) {
// 创建根分支节点,
sceneRoot = new BranchGroup();
Scenebounds = new BoundingBox();
// 将场景叶节点添加到3D模型所在的变换组分支节点
setScene(models);
// setScene(sceneRoot, "3.obj", true, false);
setKeyNavi(sceneRoot);
setView(null);
setBackGroud(Scenebounds);
}
/**
* @param fileName
* 模型文件名
* @param flagCollison
* 是否进行碰撞检测
* @param flagPicking
* 是否进行点取
*/
public Ramble(List models) {
// 指名所要导入的文件
ModelManager.ramble = this;
setLayout(new BorderLayout());
/*Canvas3D */
c = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
add("Center", c);
SimpleUniverse simpleUniverse = new SimpleUniverse(c);
vpTrans = simpleUniverse.getViewingPlatform().getViewPlatformTransform();
simpleUniverse.getViewer().getView().setBackClipDistance(1000);
createSceneGraph(models); // 该方法创建一个场景.并初始化sceneRoot
sceneRoot.setCapability(BranchGroup.ALLOW_CHILDREN_EXTEND);
sceneRoot.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE);
sceneRoot.setCapability(BranchGroup.ALLOW_CHILDREN_READ);
sceneRoot.setCapability(BranchGroup.ALLOW_DETACH);
simpleUniverse.addBranchGraph(sceneRoot);
}
/**
* 建设场景.
*
* @param sceneRoot
* 场景根结点
* @param fileName
* 模型文件名
* @param flagCollison
* 是否进行碰撞检测
* @param flagPicking
* 是否进行点取
*/
private void setScene(List models) {
for (int i = 0; i < models.size(); i++) {
Model model = (Model) models.get(i);
setScene(model);
}
}
public BranchGroup setScene(Model model) {
String fileName = model.fileName;
boolean flagCollision = model.flagCollision;
boolean flagPicking = model.flagPicking;
TransformGroup objTG1 = new TransformGroup();
ObjParse objBG1 = new ObjParse(fileName);
objBG1.setCapability(BranchGroup.ALLOW_DETACH);
for (int j = 0; j < objBG1.getObjNumber(); j++) {
Shape3D shape3D = objBG1.getIndexShape3D(j);
//shape3D.setCapability(shape3D.ALLOW_APPEARANCE_OVERRIDE_WRITE);
//shape3D.setCapability(shape3D.ALLOW_APPEARANCE_OVERRIDE_WRITE);
BoundingBox boundingBox = objBG1
.setOuterBoundingBox((BoundingBox) shape3D.getBounds());
Scenebounds.combine(boundingBox);
if (flagCollision) {
// 每个结点上添加碰撞检测行为
Colli_View_Entry colli_View_Entry = new Colli_View_Entry(
boundingBox);
colli_View_Entry.setSchedulingBounds(boundingBox);
objTG1.addChild(colli_View_Entry);
}
if (flagPicking) {
// 每个结点上添加点取行为
//创建点取旋转对象
shape3D.setCapability(shape3D.ALLOW_APPEARANCE_READ) ;
shape3D.setCapability(shape3D.ALLOW_APPEARANCE_WRITE) ;
shape3D.getAppearance().setCapability(Appearance.ALLOW_TEXTURE_READ);
shape3D.getAppearance().setCapability(Appearance.ALLOW_TEXTURE_WRITE);
objTG1 = new TransformGroup(new Transform3D());
objTG1.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
objTG1.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
objTG1.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
//PickRotateBehavior pickRotate = new PickRotateBehavior(sceneRoot, c, boundingBox);
//objTG1.addChild(pickRotate);
//设置回调类
//创建点取平移对象
PickTranslateBehavior pickTranslate = new PickTranslateBehavior(sceneRoot, c, new BoundingBox());
objTG1.addChild(pickTranslate);
TestPickBox testPickBox = new TestPickBox(shape3D, Ramble.this);
pickTranslate.setupCallback(testPickBox);
}
}
if (model.flagModelState) {
sceneRoot.addChild(objBG1);
}
else {
objTG1.addChild(objBG1);
sceneRoot.addChild(objTG1);
}
return objBG1 ;
}
public void remove(BranchGroup modelBranchGroup){
sceneRoot.removeChild(modelBranchGroup);
}
private void setKeyNavi(BranchGroup sceneRoot) {
KeyNavi keyNavi = new KeyNavi(vpTrans);
keyNavi.setSchedulingBounds(Scenebounds);
keyNavi.setTranslate(0.3); // 设置键盘速度
sceneRoot.addChild(keyNavi);
}
/**
* 观察者所处的TransformGroup对象,在此处一定要设定一下, 因为这是视野打开时的摄像机位置,场景切换全靠它了
*/
public void setView(Vector3f translateVector) {
if (translateVector == null) {
translateVector = new Vector3f();
translateVector.set(-.0f, 1.6f, 0f);
}
Transform3D T3D = new Transform3D();
T3D.setTranslation(translateVector);
vpTrans.setTransform(T3D);
}
/*
* 重新将视野设置在大门口
*/
public void reSetView() {
Vector3f resetVector3f = new Vector3f(-.0f, 1.8f, 0f);
Transform3D T3D = new Transform3D();
T3D.set(resetVector3f);
vpTrans.setTransform(T3D);
}
private void setBackGroud(Bounds bounds) {
Color3f bgColor = new Color3f(1f, 1f, 1f);
Background bg = new Background(bgColor);
bg.setApplicationBounds(bounds);
sceneRoot.addChild(bg);
}
/*
* public static void main(String[] args) {
*
* List models = new ArrayList();
*
* boolean flagCollisions = true; boolean flagPicking = false;
* models.add(new Model("4.obj", flagCollisions, flagPicking));
* models.add(new Model("tiankong.obj", false, false)); models.add(new
* Model("shinei.obj", false, false));
*
* Ramble ramble1 = new Ramble(models); ramble1.reSetView(); JFrame jFrame =
* new JFrame(); jFrame.setBounds(200, 200, 400, 400);
* jFrame.setVisible(true); jFrame.add(ramble1); }
*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -