Java3D实例应用-载入VRML模型
添加时间:2013-5-9 点击量:
相干文档
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?=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]
原来,再大的房子,再大的床,没有相爱的人陪伴,都只是冰冷的物质。而如果身边有爱人陪伴,即使房子小,床小,也觉得无关紧要,因为这些物质上面有了爱的温度,成了家的元素。—— 何珞《婚房》#书摘#
相干文档
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?=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]
原来,再大的房子,再大的床,没有相爱的人陪伴,都只是冰冷的物质。而如果身边有爱人陪伴,即使房子小,床小,也觉得无关紧要,因为这些物质上面有了爱的温度,成了家的元素。—— 何珞《婚房》#书摘#