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]
原来,再大的房子,再大的床,没有相爱的人陪伴,都只是冰冷的物质。而如果身边有爱人陪伴,即使房子小,床小,也觉得无关紧要,因为这些物质上面有了爱的温度,成了家的元素。—— 何珞《婚房》#书摘#




