zoukankan      html  css  js  c++  java
  • 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引擎比较,VRMLX3D的市场占有率都不高。这并不是因为技术本身的缺陷,而主要是VRML的制作工具和开发环境相对落后。以前的支持所见即所得的VRML实时开发环境Cosmo WorldsISAAvatar Studio都因为开发公司的转向而没有继续发展,而后面开发的BS EditorFlux Studio等还没有完善。另外VRML也没有提供完善的功能包,而Quest3DUnity3D3D 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最初只是一个模型格式,后来经过扩展和改写,行成了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]

    在线交谈

    热爱生活,热爱Coding,敢于挑战,用于探索 ...
  • 相关阅读:
    Installshield Basic msi 禁用控制面板中添加删除应用
    js location.search
    c# 中关于office引用释放 技巧
    Installshield2016 condition
    bat script 点滴
    Installshield 2015 实现检测某安装文件是否存在并运行安装
    (八)基本概念列表
    (七)PM法律法规、文档配置、需求管理知识
    (六)PM项目沟通、风险、采购管理
    (五)PM项目质量管理与人力资源管理
  • 原文地址:https://www.cnblogs.com/dennisit/p/3067190.html
Copyright © 2011-2022 走看看