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模型文件

效果:

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:[email protected]">发送邮件</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:[email protected]">发送邮件</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]

在线交谈

 

你可能感兴趣的:(java)