JAVA3D
Java3D文档信息的可视化
Jv 3 文档信 息 的 可视 化 aa D
王 非 ,赵强 ,唐 定 勇
( 西南 科 技大 学 计 算 机科 学学 院 , 四川 绵 阳 6 1 1) 2 0 0 摘要 : 利用 Jv3 进 行 文档信 息三 维可视 化 ,其 场景 图可 含 多个 场 所 节点 。每 个 节点拥 有 一 到 多个 分 支节 点 , a aD 在 其下 面建 立一 个基 准 坐标 系 ,便 可相 对 谊 坐标 系摆放 所 需 形体 或其 他转 换 节点 ,构 造 出复 的 物体 。构 造三 维 场景
文档信息可视化将 文档数据信息和 知识 转化 为 视觉形式 ,从而可发现 隐藏 在信息 内部 的特 征和规 律…。典型的文档信息可视化模 型如 图 1 。
3 Jv 3 实现 三维 可 视 化 aaD
31 a a D 特 点 .Jv 3
Jv 3 a aD把 O e G pn L和 D rc i t e X底层 技术包装在 Jv a a接 口中。使 3 技术 变得不 再繁琐且可加入 到 D
Jv3 aaD应用程序须先创建一个虚拟空间对象并且至少把一个场所对 象附加之 上,再构建 出所需场景 图像 。 关键词:文档信息;三维可视化;Jv 3 ;虚拟 空间 aaD 中 圈分类 号 :T 32 T 372 文 献标 识码 #A P 1 ; P 1.
Viu l ai n o x c me t n o m ai n o a a D s a i to fTe t z Do u n sI f r to n J v 3
维普资讯
^ 工 ●. 化 I .
软件技m
S fwa eT c nq e o t r e h iu
O. . t ma i n I Au o to 2 0 。 o . 5 No 4 0 6 V 12 , .
Java3D类简单说明
Java3D类简单说明很长时间没有听到关于Java3D的消息了,好像Sun已经放弃了Java3D一样,不过Java3D 作为一门纯正的面向对象的3D技术,还是很值得我们学习和使用的。
不过话说回来Java3D 开发的真是比较粗糙。
下面介绍些Java3D常用的类吧。
Canvas3D 类Canvas3D 类继承自Abstract Windowing Toolkit (AWT)类的Canvas类.在场景图的视图分支图中,至少要引用一个 Canvas3D对象(注:有可能存在多个Canvas3D对象,为了使演示简单,在使用SimpleUniverse类时,在程序中仅有 Canvas3D类的一个实例)。
关于Canvas 类更多的信息,请参考AWT。
附录B中提供了一系列参考。
Canvas3D 类的构造函数Canvas3D(GraphicsConfiguration graphicsconfiguration) 构造并初始化一个新的Canvas3D对象,Java 3D可以在给定的GraphicsConfiguration对象条件下渲染这个对象。
这是 AWT Canvas类的扩展的类。
关于GraphicsConfiguration 对象的更多信息请参考Java 2D规范。
这也是JDK 1.2 AWT的一部分。
Transform3D 类Transform3D 对象用于进行3D几何形变比于平移和旋转。
这些对象一般仅仅用于创建一个TransformGroup对象。
首先, Transform3D对象可能基于一些Transform3D对象的组合而创建,然後就用这个Transform3D来构建一个] TransformGroup对象。
Transform3D默认的构造函数一个通常的变换对象就表示为一个4x4双精度浮点矩阵。
这种数学表示是以行为主的。
一个Transform3D对象不是在场景图中用到的,而是用于指定TransformGroup对象的图形变换的。
Java3D总结
Java3D介绍Java3d是适应与internet 环境下开发的三维图形开发包,它针对底层库openGL 和DirectX 的封装。
这样使得他们摆脱了单机三维束缚,面向与网络方向。
OpenGL :图形编程库。
(如坐标的变化,基本形体,关照效果等)DirectX :微软公司三维库传统下的Internet 图形处理,数据不是从本地硬盘中读取,运行环境也不是事先安装好的,如果用OpenGL 等传统的可视手段,只能在Web服务器端生成图像,在发到客户端显示。
但是当前的网络传输能力是不可能满足的。
(但是java3的是传输的不是图像本生,而是三维图像生成的程序和数据)当前下的Java3d是这样的:java3d是基于OpenGL或DirectX底层的API。
他和java 一样需要安装,jre(java虚拟机)一次编程,跨平台运行。
所以说他很好的运用了pc机的硬件加速器。
(当前我们现在用的是WebStart来下载java3d程序,他保证了如果服务器端没有升级变化时,只需要下载一次,以后就可以直接运行)。
Java3d 本质是一个交互式三维图形应用编程接口(api),他可以和java2d,swing,awt 结合。
其目标是:让用户在浏览器中观看或操作三维动画图形。
一次编程,到处运行。
适应不同的软件平台。
适应各种显示环境和输入设备。
Java3d的编程思想Java3d编程的空间采用场景图结构,是一种有向无环图。
如图:locale下有一到多个branchgroup节点,在他下有一个基准坐标系transformgroup,就可以相对此坐标系摆放所需的形体(shape3d)也可以给出形体的外观appearance及geometry。
所以:他就是将许多对象安放在这个虚拟空间的过程,在设置各个方面的属性,如:形状,位置,外观,贴图,透明效果等;再在三维环境下设置灯光,雾,背景,声音等。
最后定义我们自己的观察角度,最终达到效果。
基于Java3D技术的虚拟车辆仿真系统
图!
场景图结构
场景图基础是整个场景结构的构造基础, 为场景提供了三 , 并赋予了场景图精确的插入 维的虚拟空间( +568A’=D35(26>2 ) 点位置( , 从而实现对一个或多个场景图对象的连接和 .E7’=2 ) 以及数据对象( 控制。场景图中包含节点( FEB2 ) FEB2<EG1EH , 节点又分为组节点( 和叶节点( 。 组节点用于 3238) 46EA1 ) .2’I) 组织、 控制其下的子节点, 叶节点为末端节点, 包含了构成场景
&
引言
智能交通中信息的获取和处理是近十年来智能交通研究
图 & 所示。
的重要课题。在现代城市交通的管理和控制中, 利用各种科技 手段和现代化装置所获取的数据量日益庞大。 随着电子技术的 发展和计算机功能的日益强大, 交通信息的处理能力也不断加 强。特别是随着计算机图形处理能力的提高, 许多智能交通的 研究人员都致力于交通信息和交通数据的直观化显示, 做了大 量的工作。 智能交通系统的仿真能够将实时的交通数据通过计 算机系统和图形显示系统直观的显示出来, 从而使交通管理和 控制人员能够方便地获取城市交通的运行状况, 及时准确地发 出交通控制指令, 保证城市交通的安全和畅通。 虚拟车辆仿真是一种基于智能交通系统的微观交通仿真。 它以每个车辆为基本单元, 实时地获取城市交通管理和控制的 有关信息, 利用计算机系统模拟驾驶人员对各种实时交通信息 和交通控制的响应, 为驾驶人员提供对信息处理过程中各种判 断和决策的实时分析。 从微观角度对城市交通系统进行全面的 信息处理和显示, 为更好地疏导交通提供预案分析和方案选择。 该文所介绍的虚拟车辆仿真系统主要包括三维交通场景、 虚拟驾驶平台和驾驶者决策行为模拟几个部分。 系统从 ’() 信 息系统获得交通环境、 地理特征等地理信息, 从智能交通控制 仿真系统获得如交通灯控制等相应的道路交通控制信息、 其他 车辆状况和智能交通系统的控制状况等, 再结合系统本身的驾 驶者决策行为, 采用三维技术直观地表现出智能交通系统的运 行状况, 实现了车内视角的三维驾驶界面显示。其信息结构如
基于java3d的网球比赛场景的设计与实现
熙;塑蛆基于Java3D的网球比赛场景的设计与实现刘鹏程(绍兴文理学院元培学院,浙江绍兴312000)睛要]拳文先探讨了如何利用Java3D技术建立网球场景、三维几何形体以及设计交互功能等,研究了Java3D的技术在多媒体素材的处:理、三维动画的制作以及添加纹理等方面的综合应用。
/,瞎罐词]Ja va3D;网球场景;三雏,,:,.‘r,+j…一;r一虚拟现实技术(V i r t ua l R e al i t y),又称灵境技术,是从90年代起—项为科学界和工程界所粥主的技术。
它的兴起,为人机交互界面的发展开创了新的研究领域;为智能工程的应用提供了新的界面工具;为各类工程大规模的数据可视化提供了新的描述方法。
J ava3D是SU N公司最近几年发布的专为三维场景构建的软件包。
它继承了Java语言的优良特性,为虚拟现实技术的发展开辟了新的路径。
它的跨平台性,面向对象性与当前网络技术相结合,更为虚拟现实技术做出了巨大的推动作用。
Ja va3D给我们编写三维应用程序提供了—个非常完善的A PI,它可以帮助我们生成简单或复杂的形体(也可以直接调用现有的三维形体}:使形体具有颜色、透明效果、贴图;可以在二维环境中生成灯光、移动灯光;可以具有行为(Behavi or)的处理判断能力(键盘、鼠标、定时等);可以生成雾、背景、声音等:可以使形体变形、移动、生成三维动画;可以编写非常复杂的应用程序,用于各种领域如虚拟现实。
本文根据现实的网球球场的要求,利用J ava3D开发出用于虚拟现实场景的各种基本形体类,并用Ja va和J ava3D编写基本形体类生成各种基本形体对象来再现虚拟场景,实现J ava3D虚拟网球比赛场景。
1系统的构建要素分析标准的网球场地占地面积应不小于670m2(长3660米,宽1830米),其中双打场地标准尺寸为长23.77米、宽1097米。
如果是两片或两片以上相邻而建的并行网球场地,两片场地之间距离应不小于5爿∈o网球场的物体构建有以下几个要素:1)长方形的网球场再用球网横隔成两个等区。
JAVA3D安装小结(转)
JAVA3D安装⼩结(转)课题需要根据实验数据画出3d曲⾯图,来展⽰⼆维数据,所以使⽤java3d来实现。
这⾥是java3d的学习记录。
1.Java 3D简介Java 3D是Java语⾔在三维图形领域的扩展,是⼀组应⽤编程接⼝(API)。
利⽤Java 3D提供的API,可以编写出基于⽹页的三维动画、各种计算机辅助教学软件和三维游戏等等。
利⽤Java 3D编写的程序,只需要编程⼈员调⽤这些API进⾏编程,⽽客户端只需要使⽤标准的Java虚拟机就可以浏览,因此具有不需要安装插件的优点。
2.java3d的安装⽅法java3d-1_4_0_01-windows-i586.exe安装完后,打开C:\Program Files\Java\Java3D\1.4.0_01⽂件夹,拷贝bin和lib⽂件夹⾄D:\j2sdk14\jre。
3. ⼀个例⼦下⾯代码拷贝到记事本,存为Hello.java。
然后⽤javac Hello.java编译,java Hello.class运⾏。
import com.sun.j3d.utils.geometry.*;import com.sun.j3d.utils.universe.*;import javax.media.j3d.*;import javax.vecmath.*;public class Hello {public Hello(){// 创建⼀个虚拟空间SimpleUniverse universe = new SimpleUniverse();// 创建⼀个⽤来包含对象的数据结构BranchGroup group = new BranchGroup();// 创建⼀个球并把它加⼊到group中Sphere sphere = new Sphere(0.5f); // ⼩球的半径为0.5⽶group.addChild(sphere);Color3f light1Color = new Color3f(1.8f, 0.1f, 0.1f);// 设置光线的颜⾊BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);// 设置光线的作⽤范围Vector3f light1Direction = new Vector3f(4.0f, -7.0f, -12.0f);// 设置光线的⽅向DirectionalLight light1= new DirectionalLight(light1Color, light1Direction);// 指定颜⾊和⽅向,产⽣单向光源light1.setInfluencingBounds(bounds);// 把光线的作⽤范围加⼊光源中group.addChild(light1);// 将光源加⼊group组,安放观察点universe.getViewingPlatform().setNominalViewingTransform();// 把group加⼊到虚拟空间中universe.addBranchGraph(group);}public static void main(String[] args){new Hello();}}若出现以下错误,则必须更新电脑的显⽰驱动,使之⽀持OpenGl1.2朝上版本。
java3D
Java3d整理Java3d基础环境配置1.1安装JDK1.2安装官网下载最新版本简单实例2.1新建java项目2.2导入基本jar包,jar包下载2.3编写代码package measoft.java3d.base;import java.applet.Applet;import java.awt.BorderLayout;import java.awt.GraphicsConfiguration;import javax.media.j3d.Appearance;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.Material;import javax.media.j3d.TransformGroup;import javax.vecmath.Color3f;import javax.vecmath.Point3d;import javax.vecmath.Vector3f;import com.sun.j3d.utils.applet.MainFrame;import com.sun.j3d.utils.geometry.Cone;import com.sun.j3d.utils.universe.SimpleUniverse; /*** 使用了SimpleUniverse对象,使得基本步骤比较简单:* 1.创建一个Canvas3D对象。
* 2.创建并定制一个SimpleUniverse对象,该对象引用前一步创建的Canvas3D对象* 3.构建内容子图* 4.编译内容子图* 5.将内容子图插入SimpleUniverse的Locale中*** @author J_nan**/publicclass MyCone extends Applet {public BranchGroupcreateSceneGroup(){/*** 一、 1.创建一个包含对象的数据结构2.生成坐标系3.将坐标系添加到跟节点上4.设置场景的有效范围*/BranchGroupobjRoot = new BranchGroup();TransformGroupobjTrans = new TransformGroup();objRoot.addChild(objTrans);BoundingSphere bounds = new BoundingSphere(newPoint3d(0.0,0.0,0.0),100.0);/*** 二、1. 创建背景颜色 2.设置背景边界 3.添加背景到场景中*/Color3f bgColor = new Color3f(0.0f,0.0f,0.0f);Background bg = new Background(bgColor);bg.setApplicationBounds(bounds);objRoot.addChild(bg);/*** 三、1. 添加平行光 2.给指定的bounds设定光的范围界限*/Color3f directionalLightColor = new Color3f(1.f,1.f,1.f);Vector3f vec = new Vector3f(0.f,0.f,-1.0f);DirectionalLightdirectionalLight =new DirectionalLight(directionalLightColor,vec);directionalLight.setInfluencingBounds(bounds);objRoot.addChild(directionalLight);/*** 四、1.设置外观 2.设置材料 3.生成基本圆锥*/Appearance app = new Appearance();Material material = new Material();material.setDiffuseColor(new Color3f(10.f,1.0f,0.0f));app.setMaterial(material);Cone cone = new Cone(.5f,1.0f,1,app);objRoot.addChild(cone);/*** 五、返回objRoot*/return objRoot;}public MyCone(){setLayout(new BorderLayout());GraphicsConfigurationconfig =SimpleUniverse.getPreferredConfiguration();/*** 第一步:Canvas3D类提供了一个3D渲染绘图画布,构造并初始化一个新的Canvas3D对象*/Canvas3D c = new Canvas3D(config);/*** 第二步:创建虚拟空间*/SimpleUniverse u = new SimpleUniverse(c);/*** 第三步:构建内容子图*/BranchGroup scene = createSceneGroup();/*** 第四步:编译内容子图*/pile();/*** 第五步:将内容子图插入SimpleUniverse的Locale中*/u.addBranchGraph(scene);add("Center",c);//安放观察点u.getViewingPlatform().setNominalViewingTransform();}publicstaticvoid main(String[] args) {new MainFrame(new MyCone(),400,300);}}运行效果如图:编写JAVA3D程序的一般步骤:A.SceneGraphObject的子类是构建场景图的基石。
JAVA3D学习系列——面的生成(上)
JA V A3D学习系列(9)----- 面的生成(上)汕头大学机电系张杰(jzhang@)一. 生成平面的对象及其定义JA V A3D可通过编程显示出面来,面有两种:三角形和四边形,相应的对象为Triangle和Quad。
JA V A3D用于生成平面的对象有:1. TriangleArrayTriangleArray (int vertexCount, int vertexFormat )2. QuadArrayQuadArray (int vertexCount, int vertexFormat )3. TriangleStripArrayTriangleStripArray ( int vertexCount , int vertexFormat,int[] stripV ertexCounts )4. TriangleFanArrayTriangleFanArray ( int vertexCount ,int vetexFormat,int[] stripV ertexCounts )5. IndexedTriangleArrayIndexedTriangleArray (int vertexCount , int vertexFormat,int indexCount)6. IndexedQuadArrayIndexedQuadArray (int vertexCount , int vertexFormat,int indexCount )7. IndexedTriangleStripArrayIndexedTriangleStripArray( int vertexCount, int vertexFormat,int indexCount, int stripIndexCounts[])8. IndexedTriangleFanArrayIndexedTriangleFanArray ( int vertexCount, int vertexFormat,int indexCount, int stripIndexCounts[])二. TriangleArray生成的面TriangleArray来生成,利用它可以生成三角片面我们先看一下TriangleArray的定义:TriangleArray (int vertexCount, int vertexFormat )这里:vertexCount表示顶点的个数(必须为三的倍数)vertexFormat表示顶点的格式(第七讲有介绍)下面我们看一个利用TriangleArray的例子,例子里有九个点。
基于Java 3D与3DS MAX的虚拟校园设计
系统维护的开支 。 依靠 标准 的消息中间件 可以将现有 的应用 、 的 新 应用 和购买的商务 构件融合在一起 , 于对应 用进行 便 整合。
B u d g pee ) on i Sh r0; n
oj ot d C i (gt b o ad h d1 h ; R . l i )
∥ 定义_个 白色的背景
C l 3 C l =iwC l 3(O . ,.f o r b o r l o rf . 1 f1 ) o fg o e o 1L 0 0 ; B cgon nwB c gon ( C l ) akru d g e akru d g o r b b o; / g e p l ao B u d( u d) / . t pi t n on s o n s b sA c i b ; oj ot d C i (g b o ad h db) R . l ;
[ 阳菲.d a 00 2 】 3 sM x 21完全 学习手册 [] M. 北京: 科学
出版 社 , 0 1 21.
视化校园的效果 。 同时虚拟校 园也可结合其 他功能 , 例
如在关 联实际数据后 , 可以应用 到具体 的校 园导航上 面, 对展现校 园面貌和学校形象具有积极意义。 而在 导 航上 的应用 同时可以扩展 到外界终端, 也可用于旅游景 点和公共娱 乐场所等地方, 有实际的应用价值 。 另外结 合虚拟校园社交 , 实现3 社交, D 同样也具有 良好 的应用 前景。衄
bg. APP1 i Set i at C OnB OUndSf new
java3D安装教程
在Eclipse中运行Java3D的程序此页解释了如何在Eclipse中使用Java3D的库运行程序。
1.下载Java3D的。
访问此网页下载为您的系统Java3D的库。
2.下载用于Windows包含一个安装程序。
我发现最简单的安装在我的Java文件夹,包含在我的情况同一个标准的Java,jdk1.6.0_18下载Java3D的文件和目录。
在运行安装程序:3.启动Eclipse。
你可以创建一个Java3D的代码为您的新项目,或使用一个已经存在的项目。
我将创建一个新的名为3DExamples 项目4.下载HelloUniverse.java和添加项目,从第3步。
HelloUniverse.java有很多语法错误,因为它是指一些Java3D的非标准类。
我们需要告诉到哪里寻找这些类的项目。
5.在Eclipse菜单,选择“项目” - >“属性”6.在弹出窗口中选择 Java Build Path,然后单击 Add Library ...“按钮。
7.在下一个窗口中,选择用户库,点击“下一步”按钮。
8.在下一个窗口中单击“用户库”...“按钮9.在未来的点击新建...“按钮。
10.在窗口,弹出新的库名称。
使用名称Java3DLib。
然后单击“确定”按钮。
11.选择您刚才创建的库,然后单击“添加JAR文件...”按钮。
12.在弹出浏览文件夹,你在第2步安装Java3D的文件选择。
(Java3D的jar文件的路径在我的机器是用Java3D - > 1.5.2 - >库- >分机- >)选择所有三个jar文件(j3dcore.jar,j3dutils.jar,和vecmath.jar的)。
所有三个jar文件,选择后单击“打开”按钮13.后加入的罐子在首选项窗口点击的好吧按钮。
14.在弹出的窗口中单击 Finish按钮。
15.在构建路径“窗口中选择回到您刚才添加的Java3DLib,展开它,并选择本机库的位置属性。
java3D与计算机图形学期末复习
java3D与计算机图形学期末复习第一章绪论图片与定义摘自《Java 3D 与计算机三维动态图形网络编程设计》重点复习:1、线架模型英文:Wire Frame以线段、圆弧和一些简单的曲面来表示一个三维模型。
2、Brep英文:Boundary Representation中文含义:边界面表示将一个封闭的几何体模型所使用的多边形面称为该几何体的Brep边界面。
所有的多面体模型都是一种Brep边界面模型。
最常用的数据结构是翼边结构与半边结构3、NURBS曲面英文:Non Uniform Rational B-Spline中文含义:非均匀有理B样条曲面4、Solid实体Solid实体几何模型主要通过组成该几何体的边界面所形成的半空间来表示一个物体。
平面或曲面的半空间是指一个空间平面或曲面将空间分为两部分,如果一部分位于物体的内部则另一部分位于物体的外部。
5、CSG方法英文:Constructive Solid Geometry中文含义:构造实体几何实体造型(Solid Modeling)就是通过各种实体之间的并、交、差、布尔运算生成一个封闭实体的过程。
通过简单实体(如立方体﹑圆柱体、球体﹑圆锥体、扫描表示法产生的体等)之间的正则布尔运算生成比较复杂的体。
其中运用了二叉树来记录构造过程,这种表示也被称为实体的隐式模型(Unevaluted Model)或过程模型(Procedure Model)。
6、VOXEL(体素)含义:三维图形显示的最小单元规则体素空间是将一个立方体分别沿x、y、z轴进行等间距均匀分割所形成的,每一个体素都是一个小立方体。
其中每一个小体素所具有属性的定义分两种情况。
(1)用小体素8个角点的不同属性来定义,通过三次线性插值,可求出该体素内任一点的属性值,也可求出体素中心点的属性值,该中心点属性值,在体素足够小的情况下可用来代表整个体素的属性。
(2)直接定义小体素中心点的属性值﹐用该中心点属性值代表该体素的属性。
基于Java3D的太阳系仿真的原理与实现
基于Java3D的太阳系仿真的原理与实现李万万【摘要】提出一种基于Java3D平台的太阳系仿真的方法,此方法以递归的形式构造天体运行轨道的同时采用全场景的逆向运动补偿的方式跟踪定位某个天体.实验结果表明,此算法的视觉效果很好.【期刊名称】《哈尔滨师范大学自然科学学报》【年(卷),期】2013(029)006【总页数】4页(P53-56)【关键词】Java3D;太阳系仿真;全场景;逆向运动【作者】李万万【作者单位】哈尔滨工业大学【正文语种】中文0 引言随着计算机3D图形学和虚拟现实技术的飞速发展,除了可以精确描述宇宙运转机理的物理学公式之外,计算机仿真也是辅助人们对宇宙世界进行探索的重要工具.太阳系,作为人类研究过的第一个也是最透彻的星系,更是计算机虚拟现实技术热切关注的话题.不仅如此,精确的太阳系仿真模型还可以辅助于宇宙学研究.作为强大的3D图形学开发包,Java3D也适用于太阳系的模拟与仿真.1 Java3D平台简介Java3D是sun公司结合OpenGL图形功能所提出的一款3D图形开发平台.Java 3D是网络3D游戏的重要开发工具.目前,Java3D已经广泛地应用于科学计算可视化、教育、机械设计、地理信息、动画、医学等诸多领域.文献[2]指出,Java3D与 VRML97 Loader相结合可以实现3Ds Max场景的导入与导出.在机器人虚拟控制研究中[3],Java3D平台也具有广泛的应用价值.不仅如此,根据文献[4],Java3D在语音的合成与识别技术方面的不断进步促进了语音技术与虚拟现实技术的结合.2 基于Java3D的太阳系的3D建模方法2.1 太阳系背景的生成在Java3D中的背景生成通常用Background类来实现,此类的输入参数是ImageComponent2D类的实例,从而在背景生成图片,但是此方法产生的背景是固定的图片,与真实的银河系感觉不符.然而采用背景球的方法,即把背景图片纹理贴到球体的内表面(采用Sphere.GENERATE_NORMALS_INWARD参数构造球体),则可以产生逼真的银河系背景效果.2.2 太阳系星体纹理的建模太阳系中的主要星体包括太阳、八大行星和月球等.而不发光星体的建模方法很简单(如果不考虑凹凸纹理的话),只需在球体表面进行贴图.通过 SphereSphere1=new Sphere(r,Sphere.GENERATE_NORMALS|Sphere.GENERATE_TEXTURE_COORDS,100);生成可以进行纹理映射的球体的实例(r为球体半径,100为球体表面的光滑程度).获得球体表面后需要设置材质表面无光泽:Material1.setSpecularColor(new Color3f(0f,0f,0f));设置球体表面材质的纹理模式为“法线与材质相混合模式”TextureAttributes1.setTexture Mode(BIN E).但是,太阳是自发光星体,所以在上面的材质(material)里需要添加发光特性:material.setE-missiveColor(new Color3f(Color.white));让太阳发白光.太阳的仿真效果图如图1所示:图1 太阳的3D模形对于土星和天王星的建模较为复杂,因为要添加卫星环.此处需要生成带纹理但无厚度的3D环.这里采用QuadArra类来实现,由上下两片沿x-y平面完全对称的3D环构粘合而成,效果如图2所示.图2 土星的3D模形2.3 太阳系星体的自转与公转的建模对于任意太阳系星体的运动都可以用星体的公转和自转的合成来描述.而公转轨道可以用三个参数来描述:长半轴a,短半轴b,轨道倾角θ,从而可得行星的运动轨道方程为:根据开普勒第一定律,太阳位于轨道的一个焦点上.公转轨道如图3所示.行星的公转模型需要考虑到行星在运行时的线速度变化.根据角动量守恒定律,行星在任一点处的角动量守恒,即L=r×v=C,从而对于椭圆轨道,行星在长半轴的两端点处分别有最大的线速度vmax和vmin,并且满足:,对此过程分析可得:设行星的速度为v(t),行星的公转周期为 T,令,则有周长,通过数值方法可以近似地求出v(t)的函数.但是方便起见,这里采用了一种简化的数学模型,即由v(0)到v(t)的速度均匀地增加,从而得到如图4所示的速度v随时间t的函数图像(图中行星的周期T=10).图3 行星的公转轨道模型图4 星体运动的速度模型在Java3D三维动画程序设计中常用的类是Alpha类,此类是动画运行的驱动器,它和PositionPathInterpolator类以及 RotationInterpolator类(彗星需要RotPosInterpolator类)联合使用来产生物体的平移与旋转动画.自转模型只需要用RotationInterpolator驱动含有星体 Sphere的Transform3D节点在0~2π之间以周期t旋转即可.但是对于公转模型则非常复杂,因为需要考虑到线速度的变化.通过PositionPathInterpolator类,可以把物体位置坐标p(x,y,z)与alpha的关键帧位置坐标k(i)结合起来.例如,物体从p0位置移动到p1位置所对应的时间轴恰好从k0帧移动到k1帧.物体的移动速度越快,对应的帧的分布越密集.行星位点与帧节点的对用关系如图5.图5 位置与帧的关系由上面推理可知,速度vi与帧间隔di=ki+1- ki成负相关(其中 d0=dmax,d0.5T=dmin),由图4可得di与i之间的关系如图6所示.图6 帧间隔的等差数列表示Alpha类的帧节点区间为0~1,所以有:从而得到 dmax+dmin=2/T,又有dmax∶dmin=(a+c)∶(a - c),最终得到:根据dmax,dmin和Δd可以确定每个空间位置所对应的帧节点位置,从而实现天体公转的速度变化.2.4 彗星的3D形体与公转的建模作为一类特殊的星体,彗星的3D形体建模与运动建模最为复杂.因为彗星的周围有气体团,并且带有长长的彗尾,所以它既不能用球体或椭球体来代替也不能用图片作为贴图纹理.这里采用了如下方法来生成逼真的彗星3D图形:彗星头部为半径为r的球体,彗星尾部为短半轴为 r,长半轴为 length的椭球体,彗星颜色color(red,green,blue)为白色到 color再从color到黑色的渐变.彗星体方程如下,其中参数ω |[0,2π],当参数α ∈[0,0.5π]时是如下方程:当参数a∈[0.5π,π]时是如下方程:其中,R,G,B是彗星颜色的三分量.设彗星颜色为淡蓝色 (155,155,255),用TransparencyAttributes1.setTransparency(0.2f);设置彗星的透明度为0.2,最终产生如图7所示的效果.图7 彗星的3D模形彗星的公转模型需要考虑角度的变化,设彗星的初始方向为r=(1,0,0),彗星在空间中任意点的方向向量v由其公转轨道(见3.3)确定,得到:在Java3D中提供Quat4f类来实现动画中的旋转效果,Quat4f是四元数(quaternion),用旋转的角度α与转轴方向→d=(x,y,z)来表示三维旋转,四元数 Q(a,b,c,d)与α 和→d 的转换关系如下:从而确定任一点处的四元数,输入到RotPosPathInterpolator类中即可使得彗星方向始终沿着轨道切线方向(如图8所示).图8 彗星方向沿轨道方向3 用于跟踪太阳系星体位置的逆向运动补偿方法对于跟踪具体某个星体,可以采用全场景的逆向运动来补偿某个星体的运动,从而使此星体相对于观察者静止.全场景的运动方程为:4 实验结果及其分析图9 水星图10 金星图11 地球图12 火星图13 木星图14 土星图15 天王星图16 海王星图17 月球利用上面的跟踪原理,依此对星体进行跟踪,得到的图片如图9~17所示.仿真的结果比较理想.但是,若需要更精确地展示星体的具体细节,则需要更多的轨道数据与地形地貌资料.5 结论实验表明,Java3D是一个良好的太阳系仿真平台,可以真实地展现每一个星体的3D形体,纹理特征和运动方式.此平台经过大规模和专业级的开发这后,可以用于辅助宇宙学领域的研究.参考文献[1]都志辉,刘鹏,等.Java3D编程实践[M].北京:清华大学出版社,2002. [2]董鲁秦,何东健,宋喜芳.基于VRML和Java3D的虚拟漫游系统研究[J].软件时空,2009(4):247-249.[3]李凯里.机械臂虚拟控制中的Java3D设计技术[J].系统仿真学报,2008,18(1):117 -119.[4]金珠,马小平,阚宏伟.基于J SAPI与J ava3D的语音交互式场景漫游[J].微计算机信息,2007,23(12-3):178-179.。
一个简单的Java 3D源代码
这段源代码实现了在一个窗体中显示一个场景;以一个棋盘格做的地面,在地面上浮着一个蓝色的球体,在场景中有一个环境光和一个直射光,实现了用鼠标全角度的观察场景的功能。
从某种意义上来说这的确实现了一部3D游戏最原始的框架。
代码是照着《Killer Game Programming in Java》一书中关于3D游戏制作的那部分写的,由于此书是英文版的据说在国内也买不到中文翻译版的,看得很费力,本人英文不好。
只能慢慢的研究书中的源代码。
下面说明下源代码的文件功能GameMain.java - 程序的入口。
ScreenManager.Java - 实现一个很简单的窗体类从JFrame派生,目前只返回一个窗体,以后可能实现最复杂的功能。
WrapCheckers3D.Java - 实现一个简单的3D场景类,能实现一个简单的鼠标操作。
CheckerFloor.Java - 实现一个国际象棋般的棋盘格做来场景中的地面。
ColouredTile.Java - 派生自Shape3D类,能实现一个正方体平面,用来为CheckerFl oor类实现棋盘格GameMain.Java1.import java.awt.event.WindowAdapter;2.import java.awt.event.WindowEvent;3.4.import javax.swing.JFrame;5.import javax.swing.JOptionPane;6.7.8.public class GameMain {9. private static int scrWidth = 800;ScreenManager.Javaview plaincopy to clipboardprint?.........10........20........30........40........50........60........70........80.. (9)0........100.......110.......120.......130.......140. (150)1.import java.awt.Dimension;2.import java.awt.DisplayMode;3.import java.awt.GraphicsDevice;4.import java.awt.GraphicsEnvironment;5.import java.awt.Insets;6.import java.awt.Toolkit;7.import java.awt.event.WindowAdapter;8.import java.awt.event.WindowEvent;9.10.import javax.swing.JFrame;11.import javax.swing.JOptionPane;12.13.14.public class ScreenManager {15.16. private GraphicsDevice device;17. private JFrame frame;18. private String title;19. private boolean isResizable;20. private boolean isWindowMode;21. private int scrWidth;22. private int scrHeight;23. private int scrBitdepth;24.25. public ScreenManager(int scrWidth,int scrHeight,int scrBitdepth,String title)26. {27. this.scrWidth = scrWidth;28. this.scrHeight = scrHeight;29. this.scrBitdepth = scrBitdepth;30. this.title = title;31. }32.33. public void setWindowMode()34. {35. frame = new JFrame();36. frame.setResizable(false);//禁止窗体改变大小37. frame.setPreferredSize(new Dimension(scrWidth,scrHeight));38. frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);//响应窗体的关闭事件,但不关闭窗体39. frame.setVisible(true);40.// 侦听窗体事件并捕获窗体关闭中的事件,在用户确认后退出程序41. frame.addWindowListener(new WindowAdapter(){42. public void windowClosing(WindowEvent e)43. {44. int res = JOptionPane.showConfirmDialog(null, "是否退出!","退出",JOptionPane.YES_NO_OPTION);45. if(res == JOptionPane.YES_OPTION)46. closeFrame();47. }48. });49. this.setFrametoCenter();50. }51.52. public void setFullWindowMode()53. {54. if(frame != null)55. {56. device = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();57. DisplayMode displayMode = device.getDisplayMode();58. frame.setPreferredSize(new Dimension(displayMode.getWidth(),displayMode.getHeight()));59. }60. }61.62. public int getWidth()63. {64. return scrWidth;65. }66.67. public int getHeight()68. {69. return scrHeight;70. }71.72. public JFrame getFrame()73. {74. return frame;75. }76.77.// 将窗体在显示屏幕内居中显示78. public void setFrametoCenter()79. {80. if(device!=null)81. return;82. Insets inset = frame.getInsets();83. int scrx=0;84. int scry=0;85. Dimension scrSize = Toolkit.getDefaultToolkit().getScreenSize();86. if(scrSize.width > scrWidth)87. scrx = (scrSize.width-scrWidth)/2;88. if(scrSize.height > scrHeight)89. scry = (scrSize.height-scrHeight)/2;90. frame.setBounds(scrx-inset.left, scry-inset.top, scrWidth+inset.right+inset.left, scrHeight+inset.bottom+inset.top);91. }92.93.// 关闭窗体事件94. public void closeFrame()95. {96. frame.dispose();97. System.exit(0);98. }99.}1.import java.awt.BorderLayout;2.import java.awt.Color;3.import java.awt.GraphicsConfiguration;4.5.import javax.media.j3d.AmbientLight;6.import javax.media.j3d.Appearance;7.import javax.media.j3d.Background;8.import javax.media.j3d.BoundingSphere;9.import javax.media.j3d.BranchGroup;10.import javax.media.j3d.Canvas3D;11.import javax.media.j3d.DirectionalLight;12.import javax.media.j3d.Material;13.import javax.media.j3d.Transform3D;14.import javax.media.j3d.TransformGroup;15.import javax.swing.JPanel;16.import javax.vecmath.Color3f;17.import javax.vecmath.Point3d;18.import javax.vecmath.Vector3d;19.import javax.vecmath.Vector3f;20.21.import com.sun.j3d.utils.behaviors.vp.OrbitBehavior;22.import com.sun.j3d.utils.geometry.Sphere;23.import com.sun.j3d.utils.universe.SimpleUniverse;24.import com.sun.j3d.utils.universe.ViewingPlatform;25.26.27.public class WrapCheckers3D extends JPanel {28.29. private BranchGroup sceneBg;30. private SimpleUniverse su;31. private BoundingSphere bounds;32. private static final float BOUNDSIZE=100.0f;33.34. public WrapCheckers3D(int width,int height)35. {36. this.setLayout(new BorderLayout());37. GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();38. Canvas3D canvas = new Canvas3D(config);39. this.add("Center",canvas);40. canvas.setBounds(0, 0, width, height);41.42. su = new SimpleUniverse(canvas);43. createSceneGroup();44. initUserPosition();45. orbitControls(canvas);46. su.addBranchGraph(sceneBg);47. }48.49. public void createSceneGroup()50. {51. sceneBg = new BranchGroup();52. bounds = new BoundingSphere(new Point3d(0,0,0),BOUNDSIZE);53. lightScene();54. addBackground();55. sceneBg.addChild(new CheckerFloor().getBG());56. floatingSphere();57. pile();58. }59.60. private void lightScene()61. {62. Color3f white = new Color3f(1.0f,1.0f,1.0f);63. AmbientLight ambientLightNode = new AmbientLight(white);64. ambientLightNode.setInfluencingBounds(bounds);65. sceneBg.addChild(ambientLightNode);66.67. Vector3f lightDirection = new Vector3f(-1.0f,-1.0f,-1.0f);68. DirectionalLight light = new DirectionalLight(white,lightDirection);69. light.setInfluencingBounds(bounds);70. sceneBg.addChild(light);71. }72.73. private void addBackground()74. {75. Background back = new Background();76. back.setApplicationBounds(bounds);77. back.setColor(0.17f, 0.62f, 0.92f);78. sceneBg.addChild(back);79. }80.81. private void floatingSphere()82. {83. Color3f black = new Color3f(0.0f,0.0f,0.0f);84. Color3f blue = new Color3f(0.3f,0.3f,0.8f);85. Color3f specular = new Color3f(0.9f,0.9f,0.9f);86.87. Material blueMat = new Material(blue,black,blue,specular,25.0f);88. blueMat.setLightingEnable(true);89.90. Appearance blueApp = new Appearance();91. blueApp.setMaterial(blueMat);92.93. Transform3D t3d = new Transform3D();94. t3d.set(new Vector3f(0,4,0));95. TransformGroup tg = new TransformGroup(t3d);96. tg.addChild(new Sphere(2.0f,blueApp));97. sceneBg.addChild(tg);98. }99.100. private void initUserPosition()101. {102. ViewingPlatform vp = su.getViewingPlatform();103. TransformGroup steerTG = vp.getViewPlatformTransform(); 104.105. Transform3D t3d = new Transform3D();106. steerTG.getTransform(t3d);107.108. t3d.lookAt(new Point3d(0,5,20), new Point3d(0,0,0), new Vecto r3d(0,1,0));109. t3d.invert();110.111. steerTG.setTransform(t3d);112.113. }114.115. private void orbitControls(Canvas3D canvas)116. {117. OrbitBehavior orbit = new OrbitBehavior(canvas, OrbitBehavior.REVERSE_ALL);118. orbit.setSchedulingBounds(bounds);119. ViewingPlatform vp = su.getViewingPlatform( );120. vp.setViewPlatformBehavior(orbit);121. }122.}1.import java.awt.Font;2.import java.util.ArrayList;3.4.import javax.media.j3d.BranchGroup;5.import javax.media.j3d.Transform3D;6.import javax.media.j3d.TransformGroup;7.import javax.vecmath.Color3f;8.import javax.vecmath.Point3d;9.import javax.vecmath.Vector3f;10.11.import com.sun.j3d.utils.geometry.Text2D;12.13.public class CheckerFloor {14.15. private BranchGroup floor;16.17. public CheckerFloor() {18. floor = new BranchGroup();19. }20.21. public BranchGroup getBG() {22. Color3f blue = new Color3f(0, 0, 1);23. Color3f green = new Color3f(0, 1, 0);24.25. boolean isBlue = true;26. for (int j = -10; j < 9; j++) {27. for (int i = -10; i < 9; i++) {28. Point3d t1 = new Point3d(i, 0, j);29. Point3d t2 = new Point3d(i + 1, 0, j);30. Point3d t3 = new Point3d(i + 1, 0, j + 1);31. Point3d t4 = new Point3d(i, 0, j + 1);32. ArrayList<Point3d> tileCoord = new ArrayList<Point3d>();33. tileCoord.add(t1);34. tileCoord.add(t2);35. tileCoord.add(t3);36. tileCoord.add(t4);37. if (isBlue)38. floor.addChild(new ColouredTile(tileCoord, blue));39. else40. floor.addChild(new ColouredTile(tileCoord, green));41. isBlue = !isBlue;42. floor.addChild(makeText(new Vector3f(i,0,j),"("+i+","+j+")"));43. }44. }45. return floor;46. }1.import java.util.ArrayList;2.3.import javax.media.j3d.Appearance;4.import javax.media.j3d.BranchGroup;5.import javax.media.j3d.GeometryArray;6.import javax.media.j3d.PolygonAttributes;7.import javax.media.j3d.QuadArray;8.import javax.media.j3d.Shape3D;9.import javax.vecmath.Color3f;10.import javax.vecmath.Point3d;11.import javax.vecmath.Point3f;12.13.14.public class ColouredTile extends Shape3D {15.16. private ArrayList<Point3d> coord;17. private Color3f color;18. private QuadArray plane;19.20. public ColouredTile(ArrayList<Point3d> coord,Color3f color)21. {22. this.coord = coord;23. this.color = color;24. plane = new QuadArray(coord.size(),GeometryArray.COORDINATES | GeometryArray.COLOR_3);25. createGeometry();26. createAppearance();27. }28.29. public void createGeometry()30. {31. int numPoints = coord.size();32. Point3d[] points = new Point3d[numPoints];。
Java3D
三. 如何运行 JAVA3D 源程序 用 JAVAC 编译源程序,生成 class 文件。根据文件的类型,选择用 JAVA 或 APPLETVIEWER 运行程序。JAVA3D 程序可以为 APPLICATION 程序,也可以为 APPLET 程序,因而 JAVA3D 程序也可以摆放在网页上,当然这时候我们必须在浏览器上 做一些设置工作(以后再介绍)。
在运行 applet 程序时,我们需要编写一个 HTML 文件: 先用 javac 将 JAVA3D 源程序编译成 class 文件,再用 appletviewer 运行 HTML 文件。虽然程序是 applet 程序,但我们也可以将其变成 application 程序,这 时我们只需将程序头尾的四个注释行的注释符号去掉即可,这时我们可以用 java 来运行它: java SimpleCone
二。OPENGL、VRML、DIRECT3D、JAVA3D 的比较 由于 OPENGL 的跨平台特性,许多人利用 OPENGL 编写三维应用程序,不过对于一 个非计算专业的人员来说,利用 OPENGL 编写出复杂的三维应用程序是比较困难 的,且不说 C(C++)语言的掌握需要花费大量时间精力,当我们需要处理复杂 问题的时候,我们不得不自己完成大量非常繁琐的工作。当然,对于编程高手来 说,OPENGL 是他们发挥才能的非常好的工具。
PDF 文件使用 "pdfFactory Pro" 试用版本创建
Virtual Universe | |----------------------------------| || Locale Locale | | ----------------+----------------|||| |||| BG BG BG BG (BG--BranchGroup) |||| | | | | (S---Shape) S TG TG TG (TG--| ||||| A G S S View Platform || | | (A---Appearance) ----+---- ----+---- (G---Geometry) |||| |||| AGAG
如何搭建java3d环境 (图)
Netbeans下如何搭建java3D环境(图)摘要在Netbeans IDE 工具下搭建java3D的开发环境主要有三步:一是安装java3d需要的包,二是在netbeans导入java3d需要的包,三是运行java3d的测试程序;最终Netbeans能够运行显示出“Java ”的3D效果图像,如下图1所示:图1 Java 的3D效果图像1.搭建步骤:1.1下载java3d-1_5_1-windows-i586.exe安装包并安装到电脑;1)、下载地址:/file/c2k157vw#java3d-1-5-1-windows-i586.exe。
2)、安装java3d-1_5_1-windows-i586.exe,默认路径为:C:\ProgramFiles\Java\Java3D\1.5.1。
图2 java3d-1_5_1-windows-i586.exe默认安装路径1.2 新建工程,导入java3d的3个包j3dcore.jar、j3dutils.jar、vecmath.jar 1)、选择文件>新建项目>Java>Java 应用程序,如下图3填写项目名称“Java3D”,点击完成。
图3 新建Java 3 工程2)、导入java3d 的3个文件操作:如图4鼠标右击库>添加JAR/文件夹,如图5添加3个jar文件包图4图53)、如图6、图7,鼠标右击“java3d>新建>Java类”填写“Java3dTest”新建java 测试类Java3dTest.java,并将Java3dTest类中的源码全部替换为以下源码:图 6图7package java3d;/**** @author Administrator*/import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.media.j3d.*;import javax.vecmath.*;import com.sun.j3d.utils.universe.*;public class Java3dTest {public static void main(String[] args) {Java3dTest t = new Java3dTest();t.setUp();}public void setUp() {JFrame jf = new JFrame("Welcome");// kill the window on closejf.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent winEvent) { System.exit(0);}});JPanel panel = new JPanel();panel.setLayout(new GridLayout(1, 1, 2, 2));GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();Canvas3D canvas3D = new Canvas3D(config);canvas3D.setSize(360, 160);SimpleUniverse universe = new SimpleUniverse(canvas3D);BranchGroup group = new BranchGroup();addObjects(group);addLights(group);universe.getViewingPlatform().setNominalViewingTransform();universe.addBranchGraph(group);panel.add(canvas3D);jf.getContentPane().add(panel, BorderLayout.CENTER);jf.pack();jf.setVisible(true);}public void addLights(BranchGroup group) {BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0),1000.0);Color3f light1Color = new Color3f(1.0f, 1.0f, 1.0f);Vector3f light1Direction = new Vector3f(4.0f, -7.0f, -12.0f);DirectionalLight light1 = new DirectionalLight(light1Color, light1Direction);light1.setInfluencingBounds(bounds);group.addChild(light1);// Set up the ambient lightColor3f ambientColor = new Color3f(.1f, .1f, .1f);AmbientLight ambientLightNode = newAmbientLight(ambientColor);ambientLightNode.setInfluencingBounds(bounds);group.addChild(ambientLightNode);}private void addObjects(BranchGroup group) {Font3D f3d = new Font3D(new Font("TestFont", Font.PLAIN, 2), new FontExtrusion());Text3D text = new Text3D(f3d, new String(""), new Point3f(-3.5f, -.5f, -4.5f));text.setString("");Color3f white = new Color3f(1.0f, 1.0f, 1.0f);Color3f blue = new Color3f(.2f, 0.2f, 0.6f);Appearance a = new Appearance();Material m = new Material(blue, blue, blue, white, 80.0f);m.setLightingEnable(true);a.setMaterial(m);Shape3D sh = new Shape3D();sh.setGeometry(text);sh.setAppearance(a);TransformGroup tg = new TransformGroup();Transform3D t3d = new Transform3D();Transform3D tDown = new Transform3D();Transform3D rot = new Transform3D();Vector3f v3f = new Vector3f(-1.6f, -1.35f, -6.5f);t3d.setTranslation(v3f);rot.rotX(Math.PI / 5);t3d.mul(rot);v3f = new Vector3f(0, -1.4f, 0f);tDown.setTranslation(v3f);t3d.mul(tDown);tg.setTransform(t3d);tg.addChild(sh);group.addChild(tg);}}4)运行Java3dTest.java 文件,将会显示如下错误(注意以下黄色背景的文字,说在java的library路径中缺少了j3dcore-d3d 文件):2012-6-10 21:42:31 javax.media.j3d.NativePipeline getSupportedOglVendor严重: ng.UnsatisfiedLinkError: no j3dcore-ogl-chk in java.library.path Exception in thread "main" ng.UnsatisfiedLinkError: no j3dcore-d3d in java.library.pathat ng.ClassLoader.loadLibrary(ClassLoader.java:1734)at ng.Runtime.loadLibrary0(Runtime.java:823)at ng.System.loadLibrary(System.java:1028)at javax.media.j3d.NativePipeline$1.run(NativePipeline.java:189)at java.security.AccessController.doPrivileged(Native Method)at javax.media.j3d.NativePipeline.loadLibrary(NativePipeline.java:180)at javax.media.j3d.NativePipeline.loadLibraries(NativePipeline.java:137)at javax.media.j3d.MasterControl.loadLibraries(MasterControl.java:948)at javax.media.j3d.VirtualUniverse.<clinit>(VirtualUniverse.java:280)at java3d.Java3dTest.setUp(Java3dTest.java:36)at java3d.Java3dTest.main(Java3dTest.java:22)Java Result: 1成功生成(总时间:1 秒)解决方案:复制java3d-1_5_1-windows-i586.exe安装路径下的4个文件j3dcore-d3d.dll、j3dcore-ogl.dll、j3dcore-ogl-cg.dll和j3dcore-ogl-chk.dll到Netbeans默认的安装路径下,再运行程序即可,如图8图9、图10、图11红色圈的1,2,3,4步骤:图8图9 Netbeans默认的JDK路径图10 复制4个dll文件图11 把4个文件粘贴到Netbeans默认JDK路径下1.3 运行例子,测试java3D环境图12 运行文件解决方案参考:/blog/1153584小结:在Netbeans搭建java3D的前提是:可以在Netbeans运行一般的程序,此配置关键在于在Netbeans中添加3个包j3dcore.jar、j3dutils.jar、vecmath.jar 和在Netbeans下使用的默认JDK路径下添加4个库文件j3dcore-d3d.dll、j3dcore-ogl.dll、j3dcore-ogl-cg.dll和j3dcore-ogl-chk.dll,而这一共7个文件包在安装java3d-1_5_1-windows-i586.exe即可获得。
利用Java3D构建虚拟校园场景的方法
浅谈利用Java3D构建虚拟校园场景的方法摘要:本文指出了java3d技术特点,并对通过java3d如何构建虚拟校园场景的方法进行了一番论述。
关键词:java3d 虚拟校园场景构建随着互联网技术的迅猛发展,极大地促进了虚拟现实技术的普遍应用,比如,科学计算可视化、教育与训练、医学、娱乐等诸多方面。
而随着计算机网络和虚拟现实等各项技术的全面发展,实现了建立基于web的虚拟校园目标,用户只需要利用互联网就能够观察到校园的景观、诸多的设施以及服务等,彷如自己就身处在校园之中。
通过虚拟校园的构建,为广大的用户提供了良好的对校园信息访问的平台,很好地推动了校园建设步伐以及远程教学的发展步伐。
1 java3d技术特点实际使用最多的3d技术有opcncl、direct3d、vrml、java3d;从网络应用模式的角度上来看,opcncl和direct3d以开发c/s模式为主,vrml和java3d以开发b/s模式为主。
opcncl独立于硬件和窗口系统,其移植性较强,但其运行环境无法得到浏览器的支持。
direct3d主要是由microsoft公司研发的专业的3d程序接口,其具有较强的功能,但仅仅限制于在win平台上运行。
vrml是一种被普遍应用的web3d技术,其属于静态场景的描述性语言,存在着动态交互接口,但必须借助于其他编程语言方可实现。
java3d主要是java语言在三维图形领域中的拓展,可融入至j2se、j2ee的整体架构中,具有很好的拓展性及平台无关性,与此同时,由浏览器nctscape与ie提供了对jvm的支持,只需要在操作平台上进行jvm 的安装就能够有效运行applet小程序,如此一来,java3d构建的虚拟场景就完全能在浏览器上进行绘制。
java3d的应用编程接口很好地为我们提供了三维场景的构建体系,具有可产生出简单或者复杂的几何形体;支持形体变动与移动;有着较好的键盘、鼠标、定时等诸多行为的判断力;可实施动态建模等各项功能。
java3d 球
this.add(canvas3D);
SimpleUniverse universe = new SimpleUniverse(canvas3D);
universe.addBranchGraph(getBranchGroup());
MouseWheelZoom mouseZoom = new MouseWheelZoom();
mouseZoom.setTransformGroup(transformGroup);
mouseZoom.setSchedulingBounds(bounds);
cubePositionInterpolator.setSchedulingBounds(bounds);
cubeGroup.addChild(cubePositionInterpolator);
cubeGroup.addChild(cube);
Transform3D cubeTransform3D = new Transform3D();
cubeTransform3D.setTranslation(new Vector3d(-2, 2, 2));
cubeGroup.setTransform(cubeTransform3D);
ColorCube cube = new ColorCube(0.5f);
Alpha cubeapAlpha=new Alpha(-1, Alpha.INCREASING_ENABLE |
Alpha.DECREASING_ENABLE,
mouseRotate.setTransformGroup(transformGroup);
Java实现的3D计算机图形类库与引擎
跨平台三维图形开发工具包Java 3D官方主页:https:///Java 3D严格遵循“建模-绘制”泛型。
场景图(scene graph)的抽象模型被用来组织和维护虚拟场景中的可是对象及其行为。
场景图包含了虚拟图形世界的全部信息,Jav a 3D绘制引擎会对场景图进行自动绘制。
Java 3D is a scene graph-based 3D application programming interface (API) for the Java platform. It runs on top of either OpenGL or Direct3D. Since version 1.2, Java 3D is developed under the Java Community Proces s. JSR 926 specifies Java 3D 1.4; as of 2007, the current version is 1.5.1 (released in June 2007).Compared to other solutions, Java 3D is not only a wrapper around th ese graphics APIs, but an interface that encapsulates the graphics program ming using a real, object-oriented concept. Here a scene is constructed usi ng a scene graph that is a representation of the objects that have to be s hown. This scene graph is structured as a tree containing several elements that are necessary to display the objects. Additionally, Java 3D offers ext ensive spatialized sound support.Java 3D and its documentation are available for download separately. They are not part of the JDK 6. However,future versions of the JDK are e xpected to include an API package for Java 3D.Java 3D开源项目包含一组3D图形API,它提供的一组面向对象接口支持简单、高级编程模型,你可以用于构建、展示和控制3D对象的行为与可视化环境。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
JAVA 3dJava 3D是Java语言在三维图形领域的扩展,是一组应用编程接口(API)。
利用Java 3D提供的API,可以编写出基于网页的三维动画、各种计算机辅助教学软件和三维游戏等等。
利用Java 3D编写的程序,只需要编程人员调用这些API进行编程,而客户端只需要使用标准的Java虚拟机就可以浏览,因此具有不需要安装插件的优点。
目录JAVA 3D从高层次为开发者提供对三维实体的创建、操纵和着色,使开发工作变得极为简单。
同时,JAVA 3D的低级API是依赖于现有的三维图形系统的,如Direct 3D、OpenGL、QuickDraw 3D和XGL等,它可以帮助我们:A. 生成简单或复杂的形体(也可以直接调用现有的三维形体)B. 使形体具有颜色、透明效果、贴图。
C. 可以在三维环境中生成灯光、移动灯光。
D. 可以具有行为(Behavior)的处理判断能力(键盘、鼠标、定时等).E. 可以生成雾、背景、声音等。
F. 可以使形体变形、移动、生成三维动画。
G. 可以编写非常复杂的应用程序,用于各种领域如VR。
JAVA 3D的这种体系结构既可以使其开发的程序“到处运行”,又使其能充分利用系统的三维特性。
就因为JAVA 3D拥有如此的强大的三维能力,使得它在网络世界,特别是在游戏中能大展姿彩。
编辑本段JAVA3D功能应用JAVA3D可用在三维动画、三维游戏、机械CAD等领域。
可以用来编写三维形体,但和 VRML不同,JAVA3D没有基本形体,不过我们可以利用JAVA3D所带的UTILITY生成一些基本形体如立方体、球、圆锥等,我们也可以直接调用一些软件如ALIAS、LIGHTWARE、3DS MAX生成的形体,也可以直接调用VRML2.0生成的形体。
可以和VRML一样,使形体带有颜色、贴图。
可以产生形体的运动、变化,动态地改变观测点的位置及视角。
可以具有交互作用,如点击形体时会使程序发出一个信号从而产生一定的变化。
可以充分利用JAVA语言的强大功能,编写出复杂的三维应用程序。
JAVA3D具有VRML所没有的形体碰撞检查功能。
作为一个高级的三维图形编程API,JAVA3D给我们带来了极大的方便,它包含了VRML2.0所提供的所有功能。
这里有一段国内资深3d程序员的评论:GL4Java、VRML、JAVA3D的比较由于 OPENGL的跨平台特性,许多人利用OPENGL编写三维应用程序,不过对于一个非计算专业的人员来说,利用OPENGL编写出复杂的三维应用程序是比较困难的,且不说C/C++语言和java的掌握需要花费大量时间精力,当我们需要处理复杂问题的时候,我们不得不自己完成大量非常繁琐的工作。
当然,对于编程高手来说,OPENGL是他们发挥才能的非常好的工具。
VRML2.0(VRML97)自1997年12月正式成为国际标准之后,在网络上得到了广泛的应用,编写VRML程序非常方法(VRML语言可以说比BASIC、JAVASCRIPT等语言还要简单),同时可以编写三维动画片、三维游戏、用于计算机辅助教学,因而其应用前景非常广阔尤其适合在中国推广应用。
不过由于VRML语言功能目前还不是很强(如目前没有形体之间的碰撞检查功能),与 JAVA语言等其它高级语言的连接较难掌握,因而失去了一些计算机高手的宠爱。
但我们认为,我们可以让大学里的文理科学生利用VRML编写多媒体应用程序,让学生很快地对编写程序感兴趣,从而使国内的计算机水平得到提高。
DIRECT3D是Microsoft公司推出的三维图形编程API,它主要应用于三维游戏的编程,目前相关的学习资料难于获得,由于它一般需要VC等编程工具进行编程,需要编程人员具有较高的C++等高级语言的编程功底,因而难以普及。
JAVA3D是建立在 JAVA2(JAVA1.2)基础之上的,JAVA语言的简单性使JAVA3D的推广有了可能。
OPENGL和JAVA3D之间的比较可以看成汇编语言与 C 语言之间的比较,一个是低级的,一个是高级的(也许这样比较不太恰当)。
JAVA3D给我们编写三维应用程序提供了一个非常完善的API,它可以帮助我们:生成简单或复杂的形体(也可以直接调用现有的三维形体)使形体具有颜色、透明效果、贴图。
可以在三维环境中生成灯光、移动灯光。
可以具有行为(Behavior)的处理判断能力(键盘、鼠标、定时等)可以生成雾、背景、声音等。
可以使形体变形、移动、生成三维动画。
可以编写非常复杂的应用程序,用于各种领域如VR。
编辑本段Java3D总体介绍Java3DAPI是用来开发三维图形和开发基于Web的3D应用程序(applet)的编程接口.目前用于开发三维图形软件的3DAPI(OpenGL、Direct3D)都是基于摄像机模型的思想,即通过调整摄像机的参数来控制场景中的显示对象,而Java3D则提出了一种新的基于视平台的视模型和输入设备模型的技术实现方案,即通过改变视平台的位置、方向来浏览整个虚拟场景.它不仅提供了建造和操作三维几何物体的高层构造函数,而且利用这些构造函数还可以建造复杂程度各异的虚拟场景,这些虚拟场景大到宇宙天体,小到微观粒子.Java3D是JavaMediaAPIs中的一部分,可广泛地应用于各种平台,而且用Java3DAPI开发的应用程序和基于Web的3D小应用程序(applet),还可以访问整个Java类,且可以与Internet很好地集成,即如果在浏览器中安装了Java3D的浏览插件,在网上也可浏览Java3D所创建的虚拟场景.Java3DAPI还汲取了已有图形APIs的优点,即 Java3D的底层图形构造函数不仅综合了底层APIs(Direcrt3D、OpenGL)最好的绘制思想,而且它的高层图形绘制还综合了基于场景图的思想,同时,它又引入了一些通用的图形环境所未考虑的新概念(如3D立体声),这样将有助于提高用户在虚拟场景的沉浸感.本文将着重介绍Java3D针对 VR应用所提出的基于视模型和输入设备模型的新思想,在此基础上又讨论了如何利用Java3D来开发VR应用程序及其实现方法,并设计实现了一个应用实例.1.适于VR应用开发的Java3DAPI众所周知,开发VR应用程序是一件很繁琐的工作,其开发人员必须编写应用程序可能遇到的各种输入和显示设备的接口程序,或者依赖专为VR应用开发而设计的应用程序编程接口(API),且典型的VR应用必须跟踪用户的头部位置和方向,以生成与头部位置方向相一致的虚拟场景图.另外,还需要先跟踪身体的其它部位(手、臂或腿部),然后通过身体各部位在虚拟场景中的虚拟视点与场景中的对象进行交互,而应用程序也必须具有能够利用跟踪输入设备在视点内放置物体,并标明其在生成的三维图象中的位置和方向的功能.同时,面向VR 的应用程序开发接口(API)必须能支持3D图形生成、处理跟踪器的输入,并能将跟踪信息反馈到图形绘制中.Java3DAPI可自动将头部跟踪器的输入集成到图形生成中,并具有通过访问其它跟踪器信息来控制其它特征的功能,但它是通过一种新的视模型(viewmodel)技术来实现的.该视模型是将用户真实的物质环境与计算机生成的虚拟环境相互独立, 并建立它们之间的通信桥梁.该API也明确定义了用来探测Java3D物体六自由度(6DOF)传感器的返回值,并将其应用于显示场景图中.总之,这种新的视模型和输入设备模型可以很方便地将交互式的3D图形应用程序转化为VR应用程序.Java3D视模型2.1 新的视模型概念(viewmodel)基于摄像机的视模型是模仿虚拟环境中的摄像机, 而不是虚拟环境中人的“替身”,而且它是通过控制摄像机与视点的相关参数来控制所显示的场景,但这种方法,在用户物质环境确定某些视参数的系统中是不合理的,例如在头盔显示器(HMD)系统中,HMD的光学性能就直接确定了应用程序所显示的视域.由于不同的HMD有不同的光学特性,因此如果允许终端用户随意改变光学参数显然是不合理的.这里视参数的值将随终端用户物质环境的不同而不同,而影响视参数的主要因素有显示器大小、显示器的位置(戴在头上,还是放在桌子上)、三维空间中用户的头部位置、头盔显示器的实际显示视域、每英寸的显示象素等.由于Java3D的视模型直接提供了头部跟踪的功能,因而使用户产生了真实存在于虚拟环境中的错觉.Java3D不仅提出了新的基于视平台的视模型概念,同时将其推广到包括显示设备和6DOF外围输入设备(如头部跟踪器等)的接口支持中,而且新的视模型继承了Java的“writeonce,vieweverywhere”本质.这意味着由Java3D视模型开发的应用程序或applet可广泛地应用于各种显示环境.这种显示环境可以是标准的计算机显示屏、多元显示空间,也可以是头盔显示器.Java3D视模型是通过将虚拟环境和物质环境完全独立的方式来实现上述功能的,且该视模型可将虚拟环境中视平台的位置、方向和大小,与Java3D 绘制的与视平台位置、方向相一致的虚拟场景相区分.一般应用程序控制视平台的位置和方向,而绘制着色系统则依据终端用户的物质环境以及用户在物质环境中的位置和方向来确定显示场景.2.2 视模型的组成Java3D视模型由虚拟环境和物质环境两部分组成,其中,虚拟环境由ViewPlatform对象来表示,它是虚拟对象存在的空间;而物质环境则由View对象以及和它相关的对象来表示.这里,View对象和它的相关对象就描述了用户所处的显示和操纵输入设备环境.虽然视模型将虚拟环境和物质环境相互独立,但可通过一一对应关系来建立两种世界之间相互通信的桥梁,这样将使得终端用户的行为会影响虚拟环境中的对象,同时虚拟环境中的对象行为也会影响终端用户的视点.Java3D可通过几个对象来定义视模型参数.这些对象包括View对象及其相关对象、 PhysicalBody对象、Canvas3D对象、PhysicalEnvironment对象、Screen3D对象.视模型相关的对象(如图1所示)其作用如下:ViewPlatform用来标志场景图中视点位置的节点.其父节点则指明了视平台在虚拟环境中的位置、方向和大小.View用于指定需要处理场景图的信息.Canvas3D定义了Java3D绘制图象的窗口,它提供了Canvas3D在Screen3D 对象中的大小、形状和位置信息.Screen3D用于描述显示屏幕的物理属性.PhysicalBody用于封装那些与物质体相关的参视模型的组成及其相互关系数(如左、右眼的位置等).PhysicalEnvironment用于封装那些与物质体环境相关的参数(如,用于头状物体或头盔式跟踪器的校验信息).2.3 虚拟环境中的视平台(ViewPlatform)鉴于视平台定义了一坐标系统,于是虚拟环境中的原始点和参考点就有了一参考坐标系.这里视平台代表与视对象相关的一个点,并充当确定绘制图象的基础.图2显示了包括视平台节点场景图的一部分.由图2可见,视平台的父节点确定了视平台在虚拟环境中的位置和方向.若通过修改与TransformGroup节点相关的Transform3D对象,就可以在虚拟场景中随意移动视平台.虽然虚拟环境中可以有许多不同的视平台,但特定的视对象只能与一个视平台相关联,于是在Canvas3D对象中所绘制的场景均来自于一个视平台的视点.这样应用程序就可通过修改视平台的TransformGroup节点,在虚拟环境中漫游.图2 包括视平台的局部场景图3 Java3D的输入设备模型Java3D除了支持通用的键盘、鼠标输入外,还能给各种不间断的输入设备,如6DOF跟踪设备和操纵杆提供支持.由于不同的跟踪输入设备其工作原理不同,因而计算机与其交互的方式也不同.为了给不同的6DOF输入设备提供支持,Java3D还提供了一个输入设备接口, 而且该输入设备接口还定义了一个抽象的输入设备,虽然用其可以实现对一特定设备的驱动,但输入设备接口的实现必须实现接口所定义的所有方法(如设备开、关、读取操作、状态设置及查询等).Java3D的输入设备列表就用这些方法同特定的设备进行交互.一般Java3D环境中,可能包括许多输入设备,而且这些输入设备不一定是实际的物理设备,也可能是虚拟设备,例如通过软件的方法将鼠标的运动参数转化为6DOF虚拟跟踪球的参数,来模拟虚拟跟踪球的输入.由于所有的输入设备都由许多传感器对象组成,因此每一种输入设备都与一定数量的传感器对象相关,且每一种传感器都与其传感器设备6DOF数据的一个数据源相关.当输入设备驱动的数据改变时,传感器对象的数据也会相应改变,而且传感器对象由读取传感器对象组成.由于缓冲区中记录了各传感器最近N个读取传感器对象的值,因此可以对传感器数据进行平均,以及对传感器输入值的趋势进行预测等处理,但应用程序的开发并不直接使用输入设备.Java3D是通过一个传感器数组将输入设备抽象化,传感器对象数组是物质环境对象的一个子类,该数组是由与输入设备相关的对象指针组成.Java程序可以直接从传感器数组中获取传感器的值,并将其用到场景图中,或按任意方式对其进行处理。