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引擎斗劲,VRMLX3D的市场占领率都不高。这并不是因为技巧本身的缺点,而主如果VRML的建造对象和开辟景象相对掉队。以前的支撑所见即所得的VRML及时开辟景象Cosmo WorldsISAAvatar Studio都因为开辟公司的转向而没有持续成长,而后面开辟的BS EditorFlux Studio等还没有完美。别的VRML也没有供给完美的功能包,而Quest3DUnity3D3D 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最初只是一个模型格局,后来经过扩大和改写,行成了VRML97VRML97经由过程原型定义、路由、javascript和一系列的传感器节点完成动画和交互。在VRML97上又成长了骨骼动画和地理坐标等功能扩大。



    VRML 稀有次跟从显卡硬件成长的进级,现阶段多半的Direct3D 9.0cOpenGL 2.0 GLSL的功能殊效都可以实现。VRML 规格为支撑显卡硬件的功能,添加了从底层的衬着节点,比如支撑三角形、三角形扇、三角形条带等根蒂根基衬着元素;比如支撑设置显卡的混淆模式和设置帧缓存、深度缓存、模板缓存的功能;还有节点能支撑多纹理和多遍绘制、支撑Shader着色、支撑多衬着目标(MRT)、支撑几何实例(Geometry Instance)、支撑粒子体系。2010年已经可以在X3DVRML中应用延迟着色技巧。如今的殊效包含SSAOCSM暗影、及时景象反射和折射、基于及时景象和天光的光照、HDR、活动模糊、景深。VRML 导出插件支撑对应3ds MAX标准材质的多种贴图/多纹理。


     


    VRML 经由过程H-anim组件支撑骨骼动画和蒙皮,也可以经由过程原型扩大支撑角色AI和动作混淆。


    VRML 经由过程DIS组件或Networking组件多支撑多用户场景和事务共享。


     


    现阶段有几个 VRML 引擎能支撑ODE物理引擎或PhysX物理引擎。


    VRML 浏览器可以经由过程插件的情势支撑Wii把握器、Kinect体感辨认、DirectInputXInput等外设。


    VRML 浏览器可以经由过程插件的支撑 语音辨认和 TTS 文本朗读。


    大多半三维软件都可以或许导入或导出VRML格局,项目组三维引擎可以或许直接载入VRML格局的模型,浏览器可以调用Java applet来供给简单的VRML体验。要体验完全的视觉和交互结果,一般须要零丁安装浏览器插件或自力法度。



    转载请注明出处:[http://www.cnblogs.com/dennisit/archive/2013/05/08/3067190.html]






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