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

📄 ramble.java

📁 本项目是用JAVA3D开发的一款图形界面的3D漫游的类似引擎.至所以这么说.是因为它的部分功能还不完全.说它是引擎是因为它可以完全脱离模型文件.本引擎实现了虚拟漫游,碰撞检测,动态添加模型,以及部分纹
💻 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 + -