Java3D实例应用-载入VRML模型
相关文档
Java3D 创建三维几何模型:[ http://www.cnblogs.com/dennisit/archive/2013/05/06/3063042.html ]
Java3D 加载外部Obj模型:[ http://www.cnblogs.com/dennisit/archive/2013/05/07/3065126.html ]
Java3D 加载外部vml模型:[ http://www.cnblogs.com/dennisit/archive/2013/05/07/3065479.html ]
VRML和其它实时三维引擎的比较
和最流行Web3D引擎比较,VRML和X3D的市场占有率都不高。这并不是因为技术本身的缺陷,而主要是VRML的制作工具和开发环境相对落后。以前的支持所见即所得的VRML实时开发环境Cosmo Worlds、ISA、Avatar Studio都因为开发公司的转向而没有继续发展,而后面开发的BS Editor、Flux Studio等还没有完善。另外VRML也没有提供完善的功能包,而Quest3D、Unity3D、3D VIA Virtools都提供了完善的功能包。
需要用到vrml驱动包,下载地址: http://ishare.iask.sina.com.cn/f/18353873.html?from=like
实例应用: Java3D中载入VRML模型文件
效果:
代码:
读物vml格式模型文件
package com.java3d.dennist.loader; import javax.media.j3d.BranchGroup; import com.sun.j3d.loaders.Scene; import com.sun.j3d.loaders.vrml97.VrmlLoader; /** * * * @version : 1.1 * * @author : 苏若年 <a href="mailto:DennisIT@163.com">发送邮件</a> * * @since : 1.0 创建时间: 2013-5-8 下午03:53:37 * * TODO : 读取VML格式模型文件 * */ public class WrlFileReader extends BranchGroup{ /** * * 读取VMLModel文件 * * @param filePath 3ds文件路径 * */ public WrlFileReader(String filePath){ BranchGroup branchGroup = new BranchGroup(); VrmlLoader vrmlLoader = new VrmlLoader(); Scene scene = null; try { scene = vrmlLoader.load(filePath); } catch (Exception e) { e.printStackTrace(); System.out.println("VML模型加载失败" + e.getMessage()); } branchGroup.addChild(scene.getSceneGroup()); this.addChild(branchGroup); } }
加载VML模型到场景,实现鼠标触控三维空间旋转
package com.java3d.dennist.loader; import java.applet.Applet; import java.awt.BorderLayout; import javax.media.j3d.Background; import javax.media.j3d.BoundingSphere; import javax.media.j3d.BranchGroup; import javax.media.j3d.Canvas3D; import javax.media.j3d.DirectionalLight; import javax.media.j3d.Transform3D; import javax.media.j3d.TransformGroup; import javax.vecmath.Color3f; import javax.vecmath.Point3d; import javax.vecmath.Vector3d; import javax.vecmath.Vector3f; import com.sun.j3d.utils.applet.MainFrame; import com.sun.j3d.utils.behaviors.mouse.MouseRotate; import com.sun.j3d.utils.behaviors.mouse.MouseTranslate; import com.sun.j3d.utils.behaviors.mouse.MouseWheelZoom; import com.sun.j3d.utils.universe.SimpleUniverse; import com.sun.j3d.utils.universe.ViewingPlatform; /** * * * @version : 1.1 * * @author : 苏若年 <a href="mailto:DennisIT@163.com">发送邮件</a> * * @since : 1.0 创建时间: 2013-5-8 下午03:54:07 * * TODO : 加载VML模型文件到场景 * */ public class JavaModelWrlLoaderApp extends Applet{ /** * */ private static final long serialVersionUID = 5841679659336190804L; public BranchGroup createSceneGraph(){ // 创建场景图分支 BranchGroup group = new BranchGroup(); // 几何变换组节点 TransformGroup transGroup = new TransformGroup(); // 几何变换 Transform3D trans3d = new Transform3D(); // 缩放变换 trans3d.setScale(0.3); //将几何变换节点对象添加到节点组 transGroup.setTransform(trans3d); //将几何变化组添加到场景 group.addChild(transGroup); // 球体作用范围边界对象 BoundingSphere bound= new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0); Color3f bgColor = new Color3f(0.05f,0.05f,0.2f); Background bg = new Background(bgColor); bg.setApplicationBounds(bound); group.addChild(bg); // 设置光源 Color3f lightColor = new Color3f(1.0f,1.0f,0.9f); Vector3f lightDirection = new Vector3f(4.0f,-7.0f,-12.0f); //设置定向光的颜色和影响范围 DirectionalLight light = new DirectionalLight(lightColor, lightDirection); light.setInfluencingBounds(bound); //将光源添加到场景 group.addChild(light); //几何变换组节点 - 加载外部模型 TransformGroup objTrans = new TransformGroup(); objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); //加载Obj格式的模型文件 objTrans.addChild(new WrlFileReader("F:/MANY.WRL")); //将模型添加到变换组节点 transGroup.addChild(objTrans); //设置几何变化,绕Y轴中心旋转 // 添加通过鼠标左键控制3D物体旋转的对象 MouseRotate behavior = new MouseRotate(); behavior.setTransformGroup(objTrans); objTrans.addChild(behavior); behavior.setSchedulingBounds(bound); // 添加鼠标右键的拖拉运动控制3D物体(X,Y)平移 MouseTranslate tr = new MouseTranslate(); tr.setTransformGroup(objTrans); objTrans.addChild(tr); tr.setSchedulingBounds(bound); // 添加鼠标滚轮控制3D物体沿Z轴 MouseWheelZoom tr1 = new MouseWheelZoom(); tr1.setTransformGroup(objTrans); objTrans.addChild(tr1); tr1.setSchedulingBounds(bound); group.compile(); return group; } //初始化用户视角 private void initUserPosition(SimpleUniverse universe,Point3d userPosition){ ViewingPlatform vp = universe.getViewingPlatform(); TransformGroup steerTG = vp.getViewPlatformTransform(); Transform3D t3d = new Transform3D(); steerTG.getTransform(t3d); t3d.lookAt(userPosition, new Point3d(0,0,0), new Vector3d(0,1,0)); t3d.invert(); steerTG.setTransform(t3d); } public JavaModelWrlLoaderApp(){ setLayout(new BorderLayout()); // 创建3D场景绘制画布Canvas3D对象 Canvas3D canvas = new Canvas3D(null); add("Center",canvas); BranchGroup scene = createSceneGraph(); SimpleUniverse universe = new SimpleUniverse(canvas); //设定用户视角 Point3d userPosition = new Point3d(0,-3,60); initUserPosition(universe,userPosition); //universe.getViewingPlatform().setNominalViewingTransform(); universe.addBranchGraph(scene); } public static void main(String[] args) { new MainFrame(new JavaModelWrlLoaderApp(), 360,360); } }
附录:
VRML是一种专为WWW(万维网)而设计的三维图像置标语言。全称是虚拟现实建模语言,是由VRML协会设计的。VRML标准中既定义了描述三维模型的编码格式,也定义了描述交互或脚本的编码及行为模式。VRML协会现已更名为Web3D联盟,VRML标准现在也已经升级为X3D标准。
VRML的最初版为1994年的VRML 1.0,然后是VRML97,最近新版为X3D标准,三者都是ISO认可的国际标准。VRML 1.0最初只是一个模型格式,后来经过扩展和改写,行成了VRML97。VRML97通过原型定义、路由、javascript和一系列的传感器节点完成动画和交互。在VRML97上又发展了骨骼动画和地理坐标等功能扩展。
VRML 有数次跟随显卡硬件发展的升级,现阶段多数的Direct3D 9.0c和OpenGL 2.0 GLSL的功能特效都可以实现。VRML 规格为支持显卡硬件的功能,添加了从底层的渲染节点,比如支持三角形、三角形扇、三角形条带等基本渲染元素;比如支持设置显卡的混合模式和设置帧缓存、深度缓存、模板缓存的功能;还有节点能支持多纹理和多遍绘制、支持Shader着色、支持多渲染目标(MRT)、支持几何实例(Geometry Instance)、支持粒子系统。2010年已经可以在X3D和VRML中使用延迟着色技术。现在的特效包括SSAO和CSM阴影、实时环境反射和折射、基于实时环境和天光的光照、HDR、运动模糊、景深。VRML 导出插件支持对应3ds MAX标准材质的多种贴图/多纹理。
VRML 通过H-anim组件支持骨骼动画和蒙皮,也可以通过原型扩展支持角色AI和动作混合。
VRML 通过DIS组件或Networking组件多支持多用户场景和事件共享。
现阶段有几个 VRML 引擎能支持ODE物理引擎或PhysX物理引擎。
VRML 浏览器可以通过插件的形式支持Wii控制器、Kinect体感识别、DirectInput、XInput等外设。
VRML 浏览器可以通过插件的支持 语音识别和 TTS 文本朗读。
大多数三维软件都能够导入或导出VRML格式,部分三维引擎能够直接载入VRML格式的模型,浏览器可以调用Java applet来提供简单的VRML体验。要体验完整的视觉和交互效果,一般需要单独安装浏览器插件或独立程序。
转载请注明出处:[http://www.cnblogs.com/dennisit/archive/2013/05/08/3067190.html]