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]

在线交谈

 

posted @ 2013-05-08 17:04  苏二  阅读(2969)  评论(0编辑  收藏  举报