Java3D实例应用-载入VRML模型
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 格式模型文件
进群:697699179可以获取Java各类入门学习资料!
这是我的微信公众号【编程study】各位大佬有空可以关注下,每天更新Java学习方法,感谢!
学习中遇到问题有不明白的地方,推荐加小编Java学习群:697699179内有视频教程 ,直播课程 ,等学习资料,期待你的加入
package com.java3d.dennist.loader;importjavax.media.j3d.BranchGroup;importcom.sun.j3d.loaders.Scene;importcom.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格式模型文件
*
*/publicclassWrlFileReaderextendsBranchGroup{/** *
* 读取VMLModel文件
*
* @param filePath 3ds文件路径
*
*/publicWrlFileReader(StringfilePath){BranchGroupbranchGroup=newBranchGroup();VrmlLoadervrmlLoader=newVrmlLoader();Scenescene=null;
try {
scene = vrmlLoader.load(filePath);
} catch(Exceptione) { 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模型文件到场景
*
*/publicclassJavaModelWrlLoaderAppextendsApplet{/** *
*/privatestaticfinallongserialVersionUID =5841679659336190804L;
publicBranchGroupcreateSceneGraph(){// 创建场景图分支BranchGroup group =new BranchGroup();
// 几何变换组节点TransformGroup transGroup =new TransformGroup();
// 几何变换Transform3D trans3d =new Transform3D();
// 缩放变换trans3d.setScale(0.3);
//将几何变换节点对象添加到节点组 transGroup.setTransform(trans3d);
//将几何变化组添加到场景 group.addChild(transGroup);
// 球体作用范围边界对象BoundingSphere bound=newBoundingSphere(newPoint3d(0.0,0.0,0.0),100.0);
Color3f bgColor =newColor3f(0.05f,0.05f,0.2f);
Background bg =new Background(bgColor);
bg.setApplicationBounds(bound);
group.addChild(bg);
// 设置光源Color3f lightColor =newColor3f(1.0f,1.0f,0.9f);
Vector3f lightDirection =newVector3f(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(newWrlFileReader("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 voidinitUserPosition(SimpleUniverse universe,Point3d userPosition){ ViewingPlatform vp= universe.getViewingPlatform();
TransformGroup steerTG = vp.getViewPlatformTransform();
Transform3D t3d =new Transform3D();
steerTG.getTransform(t3d);
t3d.lookAt(userPosition, newPoint3d(0,0,0),newVector3d(0,1,0));
t3d.invert();
steerTG.setTransform(t3d);
}
publicJavaModelWrlLoaderApp(){ setLayout(new BorderLayout());
// 创建3D场景绘制画布Canvas3D对象Canvas3D canvas =newCanvas3D(null);
add("Center",canvas);
BranchGroup scene = createSceneGraph();
SimpleUniverse universe =new SimpleUniverse(canvas);
//设定用户视角Point3d userPosition =newPoint3d(0,-3,60);
initUserPosition(universe,userPosition);
//universe.getViewingPlatform().setNominalViewingTransform(); universe.addBranchGraph(scene);
}
public static voidmain(String[] args){newMainFrame(newJavaModelWrlLoaderApp(),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 体验。要体验完整的视觉和交互效果,一般需要单独安装浏览器插件或独立程序。