Java3D实现三维显示

合集下载

基于JAVA3D的数据结构可视化技术研究

基于JAVA3D的数据结构可视化技术研究
L c l上现
基于Jv 3 a a D的数 据 结 构 可 视 化 的一 般 设 计 方 法如 图 1
所 示。
据结构 ( 如: 图中有树 ,树 中有图等 )对于这 些数据结构
是 需 要特 定 的 可 视 化 算 法 来 实 现 。 数 据 结 构 可 视 化 最 重 要 的 作 用 是 用 在 教 学 上 , 通 过
数 据 库 。不 管是 在 物 理 空 间 还 是 逻 辑 内容 , 虚 拟 宇 宙 都 可 以很 大 。一 个 L c lg 与 它 结 合 的高 分 辨 率 坐 标 一 起 组 成 o ae E ]
了在虚拟宇 宙之 下的一个表现层 。所 有虚 拟宇宙包含一个 或多个高分辨率 L c l,所有其他的对象都是 附加 在一个 o ae
3 J a av 3D
Jv 3 a a D由于其 简单易学 而备受三维 编程者 的欢迎 。
3 D技 术 是 底 层 的显 示 技 术 , J v 3 提 供 了基 于 J v 的 上 aa D aa 层 接 口。J v 3 B e GL ̄Di cX 些 底 层 技 术 包 装 a a D} Op n Yl r t 这 : l e 在 J v 接 口中 。J v 3 aa a a D技 术 强 大 的扩 展 性 使 得 J v 3 也 aa D 可 以 编 写 非 常 复 杂 的应 用 程 序 , 用 于 各 种 领 域 如 VR ( 虚 拟 现 实 )等 。 Jv3 a a D实 际 上 是J v 语 言 在 三 维 图形 领 域 的扩 展 , aa 与JV 一样,J v 3 aa a a D有纯 粹 的 面 向对 象 结 构 。J v 3 a a D的 数 据 结 构 采 用 的 是 S e eGr p sSrcue ( 景 图 ), c n a h tu tr 场 就 是 一 些 具 有 方 向 性 的 不 对称 图形 组 成 的 树 状 结 构 。 对 于 J v 3 至 少 需 要 了 解 3 概 念 : 虚 拟 宇 宙 ( ru l aa D 个 Vi a t Unv e) 、 场 景 ( o ae) 、 坐 标 系 统 。在 J v 3 ie s r L cl aa D 中 , 虚 拟 宇 宙 被 定 义 为 结 合 一 系列 对 象 的 三 维 空 间 。虚 拟 初 始 化J v 3 a a D世 界 包 括 创 建 画 布 、创 建 有 效 三 维

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介绍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。

所以:他就是将许多对象安放在这个虚拟空间的过程,在设置各个方面的属性,如:形状,位置,外观,贴图,透明效果等;再在三维环境下设置灯光,雾,背景,声音等。

最后定义我们自己的观察角度,最终达到效果。

java开发assimp案例

java开发assimp案例

java开发assimp案例在当今的软件开发领域,Java作为一种广泛应用的编程语言,被众多开发者所喜爱和采用。

而Assimp,全称为Open Asset Import Library,是一个功能强大的开源库,用于读取和处理三维模型文件。

在本文中,我们将探讨Java开发中使用Assimp的案例,并且展示如何利用该库来处理三维模型文件。

一、Assimp简介及安装Assimp是一个跨平台的库,可以在多个操作系统上运行,如Windows、Linux和Mac OS。

它支持多种格式的三维模型文件,包括常见的3DS、FBX、OBJ等。

在Java开发中使用Assimp之前,我们首先需要安装Assimp库。

安装步骤如下:1. 下载Assimp库文件,并解压缩到任意目录。

2. 在Java项目中添加Assimp库的依赖。

可以通过Maven或手动导入jar文件的方式添加依赖。

3. 配置环境变量,将Assimp库所在目录添加到系统的PATH变量中。

安装完成后,我们就可以开始使用Assimp库进行Java开发了。

二、使用Assimp加载模型文件Assimp库提供了一系列的API,可以方便地加载和处理三维模型文件。

下面是一个简单的Java代码示例,展示了如何使用Assimp加载一个模型文件:```javaimport assimp.*;public class ModelLoader {public static void main(String[] args) {// 创建一个Assimp对象Assimp ai = new Assimp();// 加载模型文件AIScene scene = ai.aiImportFile("model.obj",ai.aiProcess_Triangulate);// 检查模型文件加载是否成功if (scene != null) {// 处理模型数据// ...// 释放资源ai.aiReleaseImport(scene);} else {System.out.println("模型文件加载失败!");}}}```上述代码中,我们首先创建了一个Assimp对象,然后使用`aiImportFile`方法加载模型文件,该方法接受两个参数:模型文件的路径和加载选项。

计算机图形学实验-实验七--三维立方体的旋转

计算机图形学实验-实验七--三维立方体的旋转

贵州大学实验报告
学院:计算机科学与信息学院专业:软件工程班级: 102班姓名学号实验组实验时间指导教师成绩实验项目名称实验七三维立方体的旋转

验目的了解并掌握三维立方体的绘制和显示并通过按键控制其旋转,每次旋转150

验要求根据本实验的特点、要求和具体条件,了解并掌握三维立方体的绘制和显示,并通过按键控制其旋转,每次旋转150,成功编写测试代码进行实验。

绘制一个三维立方体。

实验原理Java3D
在java3D中坐标轴的显示如下所示:Java3D的编程思想显示如下:。

java3D

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的坦克游戏的设计和实现

基于Java3D的坦克游戏的设计和实现

Gemc y r y的子 类或孙 类 , o tAr r a 凶而 都继 承 了它所有 的方 法 。 形体 ” 。因此 , 用Jv3 利 aa D设 计一个具有瓦动性的坦 克射击游 Jv3 aa D程 序 中的面有多个 属性 , 可通过 P 1g n t ue 对象 oy 0 A t ts 戏, 对于三维技术的探索和研究 , 具有实际意义 设 定具 体 的属 性 。
De i a d sgn n Re l a i o a i ton f Tan Game z k Ba e o J va s d n a 3D
YI W a — h n nce g
(co lo nomain E gneig atC iaIstt o eh o g, F zo,Jag i3 4 0 ,C ia Sho f I r t nier ,E s hn ntu Tcnl ) uhu inx 4 0 0 hn ) f o n i ef o
e p rme t r v h t t e a h s g o n e a tv t n i u l e f c . x e i n s p o e t a h g me a o d i t r c i i a d v s a fe t y
Ke r s t r e i nso v so y wo d : h e d me i n ii n; J v 3 ;t n g me; i t r c i i aa D ak a n e a tv t v s a e e t y; iu l f c
占到 了 重 要 的 地 位 , 应 用 在 三 维 动 画 、 维 游 戏 、 械 C D 可 三 机 A
外部其他格式 的三维 图形文件 , 生成复杂的三维形体对象 。
fJ面 的 生成 】

基于JavaJava+3D的地层3维建模与可视化

基于JavaJava+3D的地层3维建模与可视化
[!] 形 ( !16%& ;G %F) 建模为基础的 ! 维技术 。
随着计算 机 硬 件 和 0 T3F. I 、 1DR3O4C 等 技 术 的不断进步, 地学 ! 维 可 视 化 研 究 取 得 了 很 多 重 大的成果, 并 在 生 产 实 践 中 获 得 了 应 用。 目 前 常 见的系统普遍 只 能 在 单 机 平 台 运 行, 或者只能在 网络上发布简单的图片, 不具有交互性和实时性; 在 2F43RF34 网 络 环 境 下 实 现 远 程、 实时交互的 ! 维可视化系统, 技术仍不成熟, 但目前已经有许多 学者致力于这 方 面 的 研 究, 如加拿大卡尔加里大 学陶 闯 博 士 利 用 Z:S: ] Z:S: !1 技 术 开 发 的 .3%= / ; 3 !1
!
数据来源与数据预处理
本文研究的数据来源于某地区地下水资源调
查评价中实际 勘 测 的 地 质 钻 孔 数 据, 其数据格式 为武汉中地公司 ) $/ D>6 的离散 ?63 ! 明码格式
[ GG ] 数据 。
! "#
数据格式
) $/ D>6 离散 ?63 ! 格式数据 文 件 的 数 据 格 式如下: !, " G ,# G , $ G , % G … … " & ,# & , $ & , % & … … " ! ,# ! , $ ! , % ! 其中, ! 为 数 据 点 的 总 数; " & , #& , $ & 分 别 为 第 & 个数据点的坐标值; %& 为第 & 个数据点的专业值 (即地层的类型, 一般用整数表示, 如 GA 代表亚粘
以某地区地下水资源调查评价中采集的地质钻孔数 据 为 例, 验 证 该 系 统 的 有 效 性。 该 系 统 将 不 仅 为 地 下 水 模 型的 ! 维实体建模提供理论支持, 而且将推动 M3X.28 在地下水模型中的应用。 关键词: 地层; 可视化 Z:S:; Z:S: !1 ; ! 维建模;

java3d官方教程

java3d官方教程

Java 3D API官方教程[翻译一]开始学习Java3D API1第一章、入门本章目标:学习了本章之后,你能:•能用一些基本术语解释什么是Java3D•能描述出Java3D程序的基本结构。

•能识别出Java3D API中的许多类。

•能编写出简单的Java3D动画程序。

Java 3D API是一个用于编写显示和交互操作三维图形对象的程序的接口。

Java 3D也是在Java2 Java开发包(JDK)上的标准扩展。

这个API提供了用于创建和操纵3D图形的高端构成方法以及渲染该图形的一些数据结构。

Java3D 提供了创建图片、可视化、动画以及3D交互图形应用程序的函数。

1.1 什么是Java 3D API?Javae 3D API是作为复杂三维图形和声音渲染系统的接口的一系列层次的JAVA类的统称。

程序员可以用Java3D开发创建和操纵3D图形对象的高端应用。

这个图形对象处于一个被渲染了的虚拟世界(Virtual Universe)中。

这个API就是用设计来用于灵活方便地创建精确的各种大小的虚拟环境,可以大到大空物体,小到比原子还小。

除了这些功能之外,API的使用也很直接,API能自动处理渲染的细节,由于利用了Java线程机制的优势,所以Java3D的渲染器的工作是并行进行的。

并且渲染器也能自动地优化并提高渲染性能。

一个Java3D程序创建了Java3D对象的实际,并将其置之于场景图数据结构中。

在这个场景图中,所有3D对象用完全指定了虚拟世界内容和其如何被渲染的树形结构存储,Java3D程序能写成能独立运行的应用程序,或者写成能嵌入在浏览器中运行的Applets,或者二者兼备。

1.2 Java 3D API每一个Java3D程序至少部分地集成了来自Java类层次中的对象,这些对象的集合称做虚拟世界(virtual universe),这就是将要被渲染的对象。

此API在javax.media.j3d包中定义了超过100多个类,这些类我们平常称做Java3D 核心类。

基于开源Web 3D引擎的三维系统的开发

基于开源Web 3D引擎的三维系统的开发

基于开源Web 3D引擎的三维系统的开发摘要:应用Web3D引擎开发的计算机仿真系统或虚拟现实系统均需在Web浏览器上运行,需要其能快速下载和运行,并且尽量不需下载特定插件。

采用基于JA V A技术的开源Web3D引擎开发的三维系统可以满足上述要求,开发的展示系统可以实现三维图形的旋转、缩放等交互功能。

此外,在系统开发过程中对引擎中不完善的部分进行了必要的修正。

关键词:计算机应用;Web3D引擎;三维系统;交互;JA V A 技术本文提出了基于开源代码的Web3D引擎,开发交互式产品展示系统的方法,并以陶瓷产品为例,开发了一款基于开源Web3D引擎idx3D,具有交互功能的三维陶瓷产品展示系统,该系统的运行无需下载特定的插件。

1开发步骤根据Web3D引擎idx3D中经修改后的各类的属性和方法,总结了以下的开发步骤:(1)为所开发的系统建模。

系统需要先建立模型,才能对相应对象进行交互式处理。

由于idx3D引擎中没有建模的功能,需要借助其他建模工具实现建模。

(2)构造场景。

系统中,摄像机、光源以及物体等各类对象都要置于场景中予以管理和操作,因此首先要构造场景。

(3)加入材质和灯光。

在场景中需要加入相应的材质和灯光。

(4)将模型文件导入程序中。

导入的物体模型添加到场景中。

(5)重构场景,以及场景规格化。

由于场景中添加了材质、灯光以及物体模型等内容,需要将这些对象重构成新的场景,并对场景进行规格化操作。

(6)初始化渲染状态。

对重构后的场景进行渲染,此时是静止状态,并没有交互式的操作。

(7)设置旋转和缩放矩阵,实现旋转和缩放。

对步骤(6)的场景进行旋转和缩放的交互式操作的实现。

(8)进行渲染得到具有三维效果的交互式系统。

将步骤(7)所完成的能缩放和旋转的场景进行渲染最终实现交互式三维展示系统。

2应用案例开发2.1开发系统的简介应用基于JA V A技术的Web3D开源引擎idx3D,开发了一款陶瓷产品——茶壶的三维展示系统。

java3D与计算机图形学期末复习

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)直接定义小体素中心点的属性值﹐用该中心点属性值代表该体素的属性。

3d编程基本原理

3d编程基本原理

3d编程基本原理
3D编程基本原理是指在计算机中实现三维图形渲染和动画效果的技术原理。

以下是一些常见的基本原理:
1. 三维坐标系统:在三维空间中,使用三个坐标轴(通常是x、y 和z轴)来确定物体的位置和方向。

2. 三角形绘制:三维图形通常使用三角形作为基本的图元进行绘制。

通过确定三角形的顶点位置和颜色来绘制复杂的三维图形。

3. 光照模型:光照模型用于模拟光照对物体的影响。

常见的光照模型包括环境光、漫反射光和镜面反射光等。

4. 投影变换:在将三维物体渲染到二维屏幕上时,需要进行投影变换。

常见的投影方式包括透视投影和正交投影。

5. 纹理映射:纹理映射用于将二维图像(纹理)贴到三维物体上,以增加细节和真实感。

6. 三维变换:通过平移、旋转和缩放等变换操作,可以改变物体在三维空间中的位置、方向和大小。

7. 可见性检测:在渲染三维场景时,需要确定哪些物体是可见的,哪些是被遮挡的。

常见的可见性检测算法包括深度缓冲和剔除算法等。

8. 动画效果:通过改变物体的属性(如位置、颜色等)来实现动画效果。

常见的动画技术包括关键帧动画、骨骼动画和物理模拟等。

以上是一些常见的基本原理,实际的3D编程还涉及到更多的细节和技术,如着色器编程、阴影算法、碰撞检测等。

基于JAVA3D的大型锻压机三维仿真训练系统的开发

基于JAVA3D的大型锻压机三维仿真训练系统的开发

境的一项高科技技术. 它以计算机系统为核心 , 以
操纵 控制 台为基 础 , 实际工作 场 合采集 数据 , 从 建
3 锻件在 锻压 生产 过程 中变形 的模 拟 )

作者简介 : 由颖 (9 7一) 女 , 15 , 辽宁海城人 , 工程师 , 主要从事计算机 图形学等方面的研究. 基金项 目: 沈阳市科技局计划资助项 目(0 2 3 13 0 5—1— 3 0) 收 稿 日期 :00— 1 4 2 1 0 —0
局 限性 , 此外 在锻压节 奏 紧张 的情况下 , 操作工 新 更 是鲜 有上操 作 台操 作 的机 会 , 而 导 致操 作 技 从 能难 以快速提高. 这些都给学 习和操作此类 大 型机 械设 备带来 了很 多不 便 J因此 , . 搭建 一 个实 时模 拟训 练锻压操作工 的仿真平 台 , 操作工在 不影 响 使
大 型锻压机 是 一个 复 杂 的机 械设 备 , 目前 我
立数 据模 型 , 与实 物操作 相结合 , 们在 实验 并 使人 室 的特定环 境 内就 能 够获 得 真 实 环境 的感受 ] . 通过 计算机 仿真 技术建 立 的仿真 训练 系统越来 越 受 到人们 的重视 和 青 睐. 内已经 开 发 了一 些针 国
中更 显得力不 从心 . 运用 这 些三 维 开发 技术 直 接
来 建立机 械设 备 的 三 维模 型 不 仅 工 作 量 会 相 当 大, 而且难 以实现精确 地建模 , 在尺 寸上和真实机 械设备存 在很大 的差 异 , 对模 型表面添 加纹理 、 材

质等效果更不如建模工具建立出来机械模型效果
锻压机 的三维场 景 .
对 于大型锻 压机 训练 系统 来 说 , 严格 按 照机

基于Java3D的三维图形数据的动态刷新

基于Java3D的三维图形数据的动态刷新

A sr c b ta t
I hs p p r wed a i h e eo me t f r e—dme so a rp y tm a e n te I tme . h c t n a d d s  ̄y c nr l n t i a e , e lw t t ed v lp n e h ot h i n in l a h s s g e b s d o ne tT e l a o n p o t h o i i o
维普资讯
基 于 J v 3 的 三 维 图 形 数 据 的 动 态 刷 新 aaD
张宜生 林恩德 梁书云 李德群
( 中 科 技 大 学 模 具 技 术 国 家 重 点 实 验 室 武汉 40 7 ) 华 3 04


本文就 开发基 于互联 网 的三维注 塑成 型流 动模 拟 系统 中的三维 图形定 位 、 显示控制 以及在 浏览器 环境 下 的动态模 拟 显
Jv3 P (aaT re — i es nA pi tn Po aaD A IJv he —D m ni p l a o r. o ci .
舯 m n t f e 是 用 于实 现基 于 We mi I e a ) g n rc b的 三维 图 形显
示 和应用 程 序 开 发 的 Jv 程 接 口 , 具 备 了从 网 络 aa编 它
o r e—d me s n l rp , swe ste p o lm f y a cd t e s ig u d rte b w e n i n n y ic se T e tc n lg a e n fhe t i n i a a h a l a r be o n mi aa r矗e ln n e r s re vr me t ed s u s d. h h oo y h sb e o g l h d l h o o a e

一个简单的Java 3D源代码

一个简单的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];。

计算机图形学习题参考答案(完整版)

计算机图形学习题参考答案(完整版)

计算机图形学习题参考答案第1章绪论1、第一届ACM SIGGRAPH会议是哪一年在哪里召开的?解:1974年,在Colorado大学召开了第一届SIGGRAPH年会。

2、计算机图形学之父是谁?解:Sutherland3、列举一些计算机图形学的应用领域(至少5个)。

解:计算机辅助设计、图示图形学、计算机艺术、娱乐、教学与培训、可视化、图像处理、图形用户界面等。

4、简要介绍计算机图形学的研究内容。

解:(1)图形的输入。

如何开发和利用图形输入设备及相关软件把图形输入到计算机中,以便进行各种处理。

(2)图形的处理。

包括对图形进行变换(如几何变换、投影变换)和运算(如图形的并、交、差运算)等处理。

(3)图形的生成和输出。

如何将图形的特定表示形式转换成图形输出系统便于接受的表示形式,并将图形在显示器或打印机等输出设备上输出。

5、简要说明计算机图形学与相关学科的关系。

解:与计算机图形学密切相关的学科主要有图像处理、计算几何、计算机视觉和模式识别等。

计算机图形学着重讨论怎样将数据模型变成数字图像。

图像处理着重研究图像的压缩存储和去除噪音等问题。

模式识别重点讨论如何从图像中提取数据和模型。

计算几何着重研究数据模型的建立、存储和管理。

随着技术的发展和应用的深入,这些学科的界限变得模糊起来,各学科相互渗透、融合。

一个较完善的应用系统通常综合利用了各个学科的技术。

6、简要介绍几种计算机图形学的相关开发技术。

解:(1)OpenGL。

OpenGL是一套三维图形处理库,也是该领域事实上的工业标准。

OpenGL独立于硬件、操作系统和窗口系统,能运行于不同操作系统的各种计算机,并能在网络环境下以客户/服务器模式工作,是专业图形处理、科学计算等高端应用领域的标准图形库。

以OpenGL为基础开发的应用程序可以十分方便地在各种平台间移植;OpenGL与C/C++紧密接合,便于实现图形的相关算法,并可保证算法的正确性和可靠性;OpenGL使用简便,效率高。

Java3D

Java3D
二. 如何编写 JAVA3D 源程序 用文本编辑工具编辑源程序,和其它 JAVA 程序一样,程序后缀为 JAVA。
三. 如何运行 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

Java实现的3D计算机图形类库与引擎

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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Java3D用其自己定义的场景图和观察模式等技术构造了3D的上层结构,实现了在Java平台使用三维技术。

本文在原理上着重介绍Java3D特有的两个重要概念:场景图(Scene Graph)、观察模式(View Model)。

在接口使用上的介绍分为两部分:实例说明如何使用Java3D接口;说明如何将Java3D技术与Java原有的Web技术(JSP、Serverlet)相结合,在网页上实现三维显示。

关于Java3D1.1 Java3D简介Java3D API是Sun定义的用于实现3D显示的接口。

3D技术是底层的显示技术,Java3D提供了基于Java的上层接口。

Java3D把OpenGL和DirectX这些底层技术包装在Java接口中。

这种全新的设计使3D技术变得不再繁琐并且可以加入到J2SE、J2EE的整套架构,这些特性保证了Java3D技术强大的扩展性。

JAVA3D建立在JAVA2(JAVA1.2)基础之上,JAVA语言的简单性使JAVA3D的推广有了可能。

它实现了以下三维显示能够用到的功能:∙生成简单或复杂的形体(也可以调用现有的三维形体)∙使形体具有颜色、透明效果、贴图。

∙在三维环境中生成灯光、移动灯光。

∙具有行为的处理判断能力(键盘、鼠标、定时等)。

∙生成雾、背景、声音。

∙使形体变形、移动、生成三维动画。

∙编写非常复杂的应用程序,用于各种领域如VR(虚拟现实)。

J2SE在其标准开发包中并不提供Java3D的API,Java3D是一个独立的可选组件,可以单独下载。

Java3D现在(截止到2003年5月)提供的正式版本是1.3.0,可以在/products/java-media/3D/download.html 下载该开发工具包。

Java3D 1.3有7个不同的可下载版本:Java3D for Windows(DirectX version)SDK for JDK(include Runtime);Java3D for Windows(OpenGL version)SDK for JDK(include Runtime);Java3D for Solaris/SPARC Runtime for JDK(include Runtime);Java3D for Windows(DirectX version)Runtime for JRE;Java3D for Windows(OpenGL version)Runtime for JRE;Java3D for Solaris/SPARC SDK for JRE;Java3D for Solaris Runtime 64 bit support;其中前三个版本是开发包。

第4、5、6个版本是Java3D运行期支持程序包。

最后一个是支持Solaris 64 bit操作平台运行Java3D的程序包。

前三个的开发包包含了各自对应的运行期支持包。

Java语言本身具有跨平台特性,无论使用上述哪个版本的开发包,概念和实现代码都会保持完全一致。

这里我们使用Java3D for Windows(OpenGL version)SDK for JDK(include Runtime);版本作为我们讨论、实现Java3D的工具包。

注意在安装此版本SDK前要保证下列环境:Java 2 (Runtime or SDK) version 1.3.1 或更后的版本OpenGL 1.1 或更后的版本,并且是Microsoft支持的显卡厂商Windows NT 4.0 only: Service Pack 3 或更后的版本(Window2000、WindowXP)1.2 Java3D与其他三维技术的比较JAVA3D可应用在三维动画、三维游戏、机械CAD等多个领域。

但作为三维显示实现技术,它并不是唯一选择而且是一个新面孔。

在Java3D之前已经存在很多三维技术,这些三维技术在实现的技术、使用的语言以及适用的情况上各有不同,我们主要介绍与Java3D 又密切关系的三种技术:OpenGL、DIRECT3D、VRMLOpenGL是业界最为流行也是支持最广泛的一个底层3D技术,几乎所有的显卡厂商都在底层实现了对OpenGL的支持和优化。

OpenGL同时也定义了一系列接口用于编程实现三维应用程序,但是这些接口使用C(C++)语言实现并且很复杂。

掌握针对OpenGL 的编程技术需要花费大量时间精力。

DIRECT3D是Microsoft公司推出的三维图形编程API,它主要应用于三维游戏的编程。

众多优秀的三维游戏都是由这个接口实现。

与OpenGL一样,Direct3D的实现主要使用C++语言。

VRML2.0(VRML97)自1997年12月正式成为国际标准之后,在网络上得到了广泛的应用,这是一种比BASIC、JAVASCRIPT等还要简单的语言。

脚本化的语句可以编写三维动画片、三维游戏、计算机三维辅助教学。

它最大的优势在于可以嵌在网页中显示,但这种简单的语言功能较弱(如目前没有形体之间的碰撞检查功能),与JAVA 语言等其它高级语言的连接较难掌握,因而逐渐被淹没在竞争激烈的网络三维技术中。

表1是Java3D 与其它三维技术的比较图,可以从中直观的看出他们相互间的区别: 表1:3D 技术对招表技术 实现层次 开发技术(难度) 扩展性 最适合应用领域Java3D 中层(JVM ) Java (较易) J2SE 标准扩展(好) 网上三维显示实现…OpenGL 底层(显卡) C\C++(难) 各大厂商支持(较好)三维设计软件… Direct3D 底层(操作系统) C++(较难) Windows 平台(差) 三维游戏…VRML 上层(网页) 标记语言(容易) 安装插件支持(一般)网上虚拟现实… Java3D 的场景图结构Java3D 实际上是Java 语言在三维图形领域的扩展,与Java 一样,Java3D 有纯粹的面向对象结构。

Java3D 的数据结构采用的是Scene Graphs Structure (场景图),就是一些具有方向性的不对称图形组成的树状结构(图1)。

我们在一个Java3D 应用程序看到的逼真三维场景从程序的角度看来,实际就是由Java3D 定义的一系列的对象,这些对象不是杂乱无序,对象之间也不是毫无关系。

如果想让三维图像正常显示,必须在这两点上遵循Java3D 场景图的规定。

观察图1,Java3D 场景图的树结构由各种各样的对象组成:在图中出现的这些对象都实现了Java3D 中有重要的意义的类,从逻辑上我们将它们分为三类:∙根节点(Root ):Virtual Universe Object ∙ 节点(Node ):Local Object 、Branch Group Nodes 、Behavior Node 、Shape3DNode…∙ 叶子节点(Leaf ):Appearance 、Geomery..图1:在应用中的Java3D 场景图场景图中线和线的交汇点称为节点(Node),这些节点都是Java3D类的实例(Instance of Class),节点之间的线表示各个实例之间的关系。

∙Virtual Universe是根节点,每一个场景图的Virtual Universe是唯一的。

∙在Virtual Universe下面是Locale节点,每个程序可以有一个或多个Locale,但同时只能有一个Locale处于显示状态,就好象一个三维世界非常大,有很多个景点,但我们同时只能在一个景点进行观察。

Java3D允许从一个Locale跳到另一个Locale,不过绝大多数程序只有一个Locale。

∙每一个Locale可以拥有多个BranchGroup节点。

所有三维形体的其位置信息(Transform Group Nodes)都建立在BranchGroup节点之上。

∙TransformGroup Node用来设定Shape3D在Virtual Universe中的位置。

∙Spape3D Node是三维图形节点,这个节点的实体放映在最后的显示画面中,就是三维世界中的每个形体。

包括正方体、球体以及任何形状和外观的三维形体。

∙位于场景图最下层的是两个叶子节点:三维体的外观(Appearance)和几何信息(Geometry),这两个节点定义了一个三维体的显示效果。

∙View Platform位于图1的另一个分枝上,与前面所有描述三维体的性质的概念不同,View Platform和View都是用来定义观察者的信息。

上面所列的概念很多,但是对于建立一个简单的Java3D程序,我们至少需要了解三个概念:虚拟宇宙(Virtual Universe)、场景(Locale)、坐标系统。

2.1 虚拟宇宙(Virtual Universe)在Java3D中,虚拟宇宙被定义为结合一系列对象的三维空间。

虚拟宇宙被用作最大的聚集体表现单位,同时也可被看作一个数据库。

不管是在物理空间还是逻辑内容,虚拟宇宙都可以很大。

实际上在大多数情况下,一个虚拟宇宙就可以满足一个应用程序所有的需求。

虚拟宇宙是各自独立的个体,原因是在任何时候一个结点对象都不能在超过一个的虚拟宇宙中存在。

同样的,在一个虚拟宇宙中的结点对象也不能在其他的虚拟宇宙中可见或者与其他的对象结合。

对于一个Java3D应用程序,必须定义一个虚拟宇宙才可以在这个"宇宙"中显示三维图像。

2.2 Java3D的坐标系统默认情况下,Java3D的坐标系统是右旋的,用方位语义学来解释就是:正y方向是本地重力的上,正x方向是水平的右,正z是这对着观察者的方向。

默认的单位是米。

双精度浮点、单精度浮点甚至是定点来表示的三维坐标都足够来表示和显示丰富的3D场景。

不幸的是,场景不是真实世界,更不必说整个宇宙了。

如果使用单精度坐标,有可能出现下列情景:1. 离原点仅有一百公里的距离,被描绘得相当量子化,所能达到的最好效果就是三分之一英寸,在实际应用中这样的精度比要求的粗糙的多。

2. 如果要缩小到一个很小的尺寸(例如表现集成电路的大小),甚至在离原点很近的地方就会出现同坐标问题。

为了支持一个大型的邻接虚拟宇宙,Java3D选择了有256位的高分辨率坐标:Java3D高分辨率坐标由三个256位的定点数组成,分别表示x、y、z。

定点被固定在第128位,并且值1.0被定义为真实的1米。

这个坐标系统足够用来描述一个超过几百万光年距离的宇宙,也可以定义小于一质子大小(小于一普朗克长度)的对象。

在Java3D中,高分辨率坐标仅仅用于将更加传统的浮点坐标系统嵌入更高分辨率的底层系统。

用这种方法,可以创造出一个具有任意大小和规模的在视觉上无缝的虚拟宇宙,而且可以不必担心数字上的精度。

相关文档
最新文档