java教程中文版第二章.docx
- 文档编号:23897397
- 上传时间:2023-05-22
- 格式:DOCX
- 页数:48
- 大小:158.64KB
java教程中文版第二章.docx
《java教程中文版第二章.docx》由会员分享,可在线阅读,更多相关《java教程中文版第二章.docx(48页珍藏版)》请在冰豆网上搜索。
java教程中文版第二章
2创建几何图形
本章目标
阅读了本章,你将获得如下能力:
"运用基本的几何图形工具类
"编写类来定义可视对象
"利用核心类来设置几何图形属性
"指定可视对象的表面和其它可选的表面属性.
"通过引用来运用几何图形
"利用裁剪和模块裁剪节点来改变视图
2.1节虚拟空间坐标系统
第一章讲述了集中在指定变换和简单行为方面来构建Java3D虚拟世界的一些基本概念.,
第一章中HelloJava3D例子在唯一的可视对象中运用了ColorCube类。
而ColorCube,程序员也并没有指定特定形状和颜色,ColorCube类是很容易使用但是却不能用来构造其它的可视对象。
有三种主要的途径来构建新的几何图形,一个途径是利用几何图形类,比如方框,圆柱,圆锥和球体。
另一种方式是程序员指定几何图形点的顶点坐标,线段,和/或者多边形表面。
第三种方式是运用几何图形加载器。
本章展示前两种方式来创建几何图形内容的方法。
本章的焦点是创建几何图形,也就是,可视对象的形状。
与几何图形相关的一些主题也涉及到了,包括数学类和表面。
在描述如何构造几何图形之前,关于虚拟世界坐标系统的更多内容,也在2.1中作了说明。
如第1章所讲的,在Java3D程序中,VirtualUniverse类的实例都在场景图中作为根结点。
术语virtualuniverse通常是指Java3D对象所在的三维虚拟空间。
虚拟空间中的每一个Locale对象建立起一个虚拟世界的Cartesian坐标系统。
一个Locale对象则是可视对象在虚拟空间中的参考点。
一个SimpleUniverse实例中也有一个Locale对象,也就是说,一个虚拟空间中有一个坐标系统。
Java3D虚拟空间的坐标系统是右手坐标系的。
X轴在右边是正向,Y轴则上面是正向,Z轴正向指向观察者,所有的坐标均以米为单位,图2-1展示了从虚拟空间中观察者的角度来看的位置情况。
2.2可视对象定义基础
第2.2.1节说明了Shape3D类.关于NodeComponent类的一个一般的讨论在第2.2.2节中讨论了。
在讨论了工具包中定义的基本几何图形之后,本章节的其余内容则讨论了结点组件中的几何图形和表面属性设置。
2.2.1定义可视对象的Shape3D实例
一个Shape3D场景图结点定义了一个可视对象[注1、Shape3D对象定义了虚拟空间中最常用的可视对象。
]。
Shape3D类是Leaf类的子类之一。
因此,Shape3D对象在场景图中只能做为叶子结点。
Shape3D对象没有包含可视对象的形状或颜色信息。
这些由Shape3D对象引用的信息保存在NodeComponent对象中。
一个Shape3D对象可以引用一个Geometry对象和一个Appearance结点对象[2、Java3DAPI1.2的Shape3D对象可以引用多个Geometry结点对象。
第2.8.1节解释了API的这个特性。
]
在第一章的HelloJava3D场景图中,用一般的对象标记(矩形)来代表ColorCube对象,而在图2-2所示的简单场景图中,展示了作为Shape3D叶子结点的一个可视对象(三角形所示)和两个NodeComponent(椭圆所示)来代替一般矩形[注:
这个场景图是不能用来表示ColorCube对象的,因ColorCube并没有外表结点组件。
这是一个关于典型可视对象的例子]。
一个可视对象可以仅由Shape3D对象和几何结点组件来定义,而Shape3D对象引用一个Apperance结点组件也是可以的。
Shape3D对构造函数(下面的参考框所示)说明了一个Shape3D对象可以没有引用任何组件,仅仅引用一个图形结点而创建,当然,也可以拥有两种结点组件的引用。
.
Shape3D构造函数
Shape3D()
构造并且初始化一个Shape3D对象,在这个对象中,没有Geometry和Appearance结点组件。
Shape3D(Geometrygeometry)
利用指定的图形来构造并且初始化一个Shape3D对象,不持有对表面组件的引用。
Shape3D(Geometrygeometry,Appearanceappearance)
用指定的图形和表面组件来构造并初始化一个Shape3D对象。
只要Shape3D对象没有被激活和编译,结点组件的引用是可以通过在下一节参考框中的的方法来修改的,如果Shape3D的能力位置进行了相关的设定,那么这些方法也可以在对象激活或者编译了之后操作Shape3D对象的。
下面的另一个参考框列出了这些能力。
请一定要阅读“阅读参考块”部分。
这里面所说的将应用于将来的一些参考块。
Shape3D方法(列出部分)
这里的设置方法(setter),一个Shape3D对象可以引用Geometry和/或者Appearance结点组件对象。
也有附加的获取方法(getter)
voidsetGeometry(Geometrygeometry)
voidsetAppearance(Appearanceappearance)
阅读参考块
本教程的参考框并没有列出所有每一个Java3DAPI类的构造函数、方法和能务。
比如,上面Shape3D方法参考框中并没有列出Shape3D类的所有方法。
与列出的两个设置方法(setter)对应的两个获取方法(getter)就没有列出。
也就是说Shape3D类也有getGeometry()和getAppearance()方法。
每一个方法都返回对应的结点组件的引用。
因为许多Java3DAPI类都有很多方法,所以,并不是所有的方法都列了出来,本教程中参考框中列出来的方法都是与教程相关的话题对应的。
同时,很多类的获取方法都有对应的设置方法,而获取方法不在参考框中列出是为了减短参考框的长度。
下面的参考框显示了Shape3D对象的能务,这个参考框引入了一种列能力的快捷手段。
这个参考框中的每一行都列出了两个能力而不是一个。
对于每一个Shape3D对象,都有一个ALLOW_GEOMETRY_READ和
ALLOW_GEOMETRY_WRITE能力.而有读写能力对也是很平常的。
为了减少参考框的大小,能力参考框中,相匹配的读写能力都用快捷标记的手段被写到了一起。
如需全部的构造函数、方法和能力,请参考API规范。
Shape3D能力(列出部分)
Shape3D对象继承了来自SceneGraphObject,Node,和Leaf类的能力.这些没有列出。
更多关于能力的信息请参考1.8.2节。
ALLOW_GEOMETRY_READ|WRITE
ALLOW_APPEARANCE_READ|WRITE
ALLOW_COLLISION_BOUNDS_READ|WRITE
2.2.2NodeComponents
NodeComponentobjectscontaintheexactspecificationoftheattributesofavisualobject.EachoftheseveralsubclassesofNodeComponentdefinescertainvisualattributes.Figure2-3showspartoftheJava3DAPIhierarchycontainingtheNodeComponentclassanditsdescendants.Section2.5presentstheGeometryNodeComponent.Section2.6presentstheAppearanceNodeComponent.
2.2.3定义可视对象类
同一个可视对象可能在同一个虚拟环境中出现很多次。
这好像需要定义一个类来构造这些可视对象,而不是从开始就构造每一个可视对象。
有几种方式设计一个类来定义一个可视对象。
代码段2-1,就显示了一个例子中可能的组织一个通过的可视对象类VisualObject类的代码基本架构。
代码中的方法是空的。
VisualObject的代码没有在例子的发布中出现,因为它不是特别有实际用处。
1.publicclassVisualObjectextendsShape3D{
2.
3.privateGeometryvoGeometry;
4.privateAppearancevoAppearance;
5.
6.//运用图形和表面属性来构造Shape3D
7.//图形是在createGeometry方法中构造的。
8.//表面属性是在createAppearance方法中设置的。
9.publicVisualObject(){
10.
11.voGeometry=createGeometry();
12.voAppearance=createAppearance();
13.this.setGeometry(voGeometry);
14.this.setAppearance(voAppearance);
15.}
16.
17.privateGeometrycreateGeometry(){
18.//创建可视对象默认的图形的代码
19.}
20.
21.privateAppearancecreateAppearance(){
22.//创建可视对象默认的表面属性的代码
23.}
24.
25.}//VisualObject为结束
代码段2-1VisualObject类代码基本结构
在代码段中2-1中VisualObject类的组织与ColorCube工具类提高扩展Shape3D对象有点类似。
VisualObject类中中建议场景图中构建过程中要从定义定制的内容子图开始。
每一个Java3D程序几乎都会为自己的目的来定制VisualObject类。
为了对这个例子的类的结构有一个更完整的了解,可以阅读包com.sun.j3d.utils.geometry中ColorCube类的源代码。
这在Java3DAPI的发布包中可以找到。
利用Shape3D为作为创建可视对象的基类使得其更易于在Java3D程序中使用。
那么这个可视对象类就如第一章的HelloJava3D例子中的ColorCube类那样易于使用。
构造函数也很容易调用,而新创建的对象添加到某些组中作为子结点也只需一行代码就够了。
在下面例子中的一行代码,objRoot就是Group的一个实例。
这个代码创建了一个VisualObject,并把其加入到场景图中作objRoot的子结点。
objRoot.addChild(newVisualObject());
VisualObject构造函数创建VisualObject,即创建一个Shape3D对象,引用了方法createGeometry()和createAppearance()方法创建的结点组件。
方法createGeometry()构造了可视对象中图形结点组件。
方法createAppearance()则是负责构造定义可视对象表面属性的结点组件。
另一个可能的组织可视对象的方法是定义一个不是继承自Java3DAPI类的容器类。
在这种设计中,可视对象中可能包含一个组结点或者一个Shape3D对象作为其定义的子图的根结点。
这个类必须定义方法来返回这个根结点引用的方法。
这个方法做起来可能多费点事,但是却是易于理解。
本章中后面用到的一些示例程序供了独立可视对象类定义的例子。
第三种组织可视对象的方法跟com.sun.j3d.utils.geometry包中的Box类,Cone类,Cylinder类和Sphere类有些类似。
这每一个类都扩展了Primitive类,而Primitive类则扩展了Group类。
Primitive类的设计细节和其子类在教程中没有讨论,但是这些类所有的源代码都可以在Java3DAPI发布中找到。
通过Primitive类的源代码和其它工具类的源代码,读者可以了解到这些类设计的更多方法。
2.3几何图形工具类
这部分讲述了构造长方体,圆锥,圆柱和球体这些基本的几何图形.
这些基本几何图形是通过在虚拟环境中创建内容子图的第二种最易于创建的方式创建的.最简单的方式是用ColorCube类.
这些基本类提供了程序员创建几何图形比创建ColorCube类更灵活的方式。
ColorCube对象定义了图形结点组件中的图形和颜色。
从而,除了尺寸,ColorCube的每一个属性都定了下来,ColorCube的尺寸是唯一一个在其对象创建了之后,仍然可以改变的对象。
而基本对象通过指定了特定的图形而没有指定颜色,从而提供了更多的灵活性。
在一个基本几何图形工具类中,程序员不能改变图形,但是可以改变外表属性。
这些基本类使得程序员有对同一个基本几何图形构建多个实例的灵活性,而对这些不同的实例,通过对不同表面属性结点组件提供一个引用,就可以有不同的表面属性。
Box,Cone,Cylinder和Sphere工具类在包com.sun.j3d.utils.geometry中定义。
Box,Cone,Cylinder,和Sphere类在第2.3.1节到2.3.4节中分别进行了介绍。
这些类的超类是Primitive,也在2.3.5节中得到了了讨论。
com.sun.j3d.utils.geometry包中的层次关系在图2-4中得到了说明。
2.3.1Box[长方体]
Box几何图形基本类构造3D长方体可视对象。
默认的长宽高都是2米。
而中心在圆点。
这样,就构造了一个立方体,顶点在(-1,-1,-1)和(1,1,1)。
对象的长、宽、高都可以在创建时设定。
当然,被ColorCube对象引用的图形结点组件TransformGroup也是可以改变的。
当是这样看起来就不像是ColorCube.如ColorCube一样,基本对象引用的图形结点组件也是可以改变的,但是看起来就是像是基本类。
从技术上讲,一个长方体是一个有着矩形表面的六面体。
到一个长方体的场景图路径可用于改变Box实例或其它对象的位置和方向。
Box构造函数(部分列出)
包:
com.sun.j3d.utils.geometry
Box类扩展了Primitive类,如在com.sun.j3d.utils.geometry包中的其它类一样。
Box()
构造一个默认的长方体,其长宽高为2米,圆点在中心。
Box(floatxdim,floatydim,floatzdim,Appearanceappearance)
用给定的尺寸和表面属性来构造长方体,中心位于原点.
构造函数的名字因类的不同而不同,Box,Cone,Cylinder类都共用了如下参考框中的方法.
Box,Cone,和Cylinder方法
所在包:
com.sun.j3d.utils.geometry
这些方法在每一个Box,Cone,Cylinder基本类中都有定义了.这些基本的类可以组成组中更复杂的Shape3D对象.
Shape3DgetShape(intid)
获得基本图形的一个包含了图形结点组件和表面属性结点组件的面(作为Shape3D).Box,Cone,和Cylinder对象由多于一个Shape3D对象组成,每一个都有其自身的图形结点组件.方法中的id参数指明了要取得哪个图形结点组件.
voidsetAppearance(Appearanceappearance)
设置基本图形对象的表面属性.(所有的Shape3D对象都有这个方法.)
2.3.2Cone[圆锥]
Cone类定义了中心在圆心的,中心轴沿着Y轴的一个圆锥对象.默认的底部圆的半径是1米,高2米.圆柱的中心就是其外接长方体的中心而不是其底部圆的中心.
Cone构造函数(部分列出)
所在包:
com.sun.j3d.utils.geometry
Cone类扩展了Primitive类,Primitive类也是包com.sun.j3d.utils.geometry中的类。
Cone()
构造了默认的底部圆为1.0高为2.0的圆锥.
Cone(floatradius,floatheight)
由指定的底部圆半径和高度来定义一个圆锥对象.
2.3.3Cylinder圆柱
圆柱类构造了一个有顶的,圆柱状对象,其中心位于原点,其中心轴沿着Y轴向上。
默认的半径是1.0米而是2.0米。
Cylinder构造函数(部分列出)
包:
com.sun.j3d.utils.geometry
Cylinder类扩展了Primitive类,Primitive类也是包com.sun.j3d.utils.geometry中的类。
Cylinder()
构造了默认的底部圆为1.0米高为2.0米的圆柱。
Cylinder(floatradius,floatheight)
由指定的底部圆半径和高度来定义一个圆柱对象。
.
Cylinder(floatradius,floatheight,Appearanceappearance)
由指定的底部圆半径和高度来定义一个圆柱对象。
并指定圆柱的表面属性。
2.3.4Sphere(球体)
Sphere类创建中心位于原点的球形可视对象,默认的半径是1.0米。
Sphere构造函数(部分列出)
包:
com.sun.j3d.utils.geometry
Sphere类扩展了Primitive类,Primitive类也是包com.sun.j3d.utils.geometry中的类。
Sphere()
构造了一个默认半径为1.0米的球体。
Sphere(floatradius)
构造了一个默认半径为指定半径的球体。
Sphere(floatradius,Appearanceappearance)
构造了一个半径为指定半径,表面属性为指定属性的球体。
Sphere方法
所在包:
com.sun.j3d.utils.geometry
作为对Primitive类的一个扩展,一个球体是一个组对象,其拥有一个Shape3D对象作为其子结点。
Shape3DgetShape()
获得包含图形和表面属性的Shape3D对象。
Shape3DgetShape(intid)
这个方法在其它几何图形基本类如Box,Cone,Cylinder中也有。
但是,由于Sphere只一个Shape3D对象,所以指定的id只能是1。
voidsetAppearance(Appearanceappearance)
设置球体的表面属性。
2.3.5更多的关于图形基本类的说明
(Primitive)基本图形工具类没有对图形的颜色做出定义。
图形没有定义颜色意味着将颜色从表面结点组件中分离了出来。
如果没有对表面结点组件的引用,可视对象将是面的。
关于颜色的问题在2.4.2节中得到了讨论。
并在2.5.1节中加到了图形之中。
而2.6节则说明了表面结点组件的详细信息。
Primitive类定义了Box,Cone,Cylinder和Sphere类一些公共的属性。
比如,Primitive定义了表示表面所需要用到的多边形数。
第2.3.8节Primitive类的一些细节。
因为Primitive类所定义的值对于大部分应用程序都适用,即使没有用到Primitive类也可以写出Java3D程序。
正由于这个原因,描述Primitive类的那一节可以看成是高级话题(可以略过)。
在下文对高级话题会特别指出。
2.3.6ColorCube(彩色立方体)
ColorCube类放在这里来讨论是为了对照基本几何图形类Box,Cone,Cylinder和Sphere而设的。
ColorCube类扩展了一个不同于基本图形类的层次的类。
它是Shape3D类的子类,ColorCube类的类层次如图2-5所示。
而在第一章中,我们已经列出了ColorCube的参考框。
ColorCube类是在Java3DAPI的发布包中唯一一个允许程序员不考虑颜色和光照问题的类。
正由于这个原因,ColorCube类对于快速集成图形做测试和原型是很有用的。
2.3.7例子:
用两个圆锥创建一个简单的Yo-Yo程序
[译者著:
Yo-Yo,译为悠悠,是玩具,为木制或塑料制两厚圆盘,中间有一深沟连接一绳,用手指抻绳可使之沿绳上下移动,据牛津高阶英汉双解词典,1771页]
本节讲述了一个运用Cone类实现的简单例子:
ConeYoyoApp.java.这个例子的目的是渲染一个yo-yo,yo-yo由两个圆锥组成,而Java3DAPI的行为类则用于使yo-yo可以上下移动.但这并不是本章讨论的重点.这个程序定位了yo-yo,以使图形能够看到.图2-5展示了场景图,这是ConeYoyoApp例子中ConeYoyo和ConeYoyo类的设计.
圆锥对象的默认位置是中心位于圆点,默认的面向是Cone对象的顶尖沿着向Y轴正向.yo-yo由两个圆锥组成,围绕z轴旋转,并且沿X轴变换而把两个圆锥的尖从起始位置拉到一块.而其它对旋转和变换的组合也能把Cone对象的尖拉到一起。
[注:
实际上,Cone基本类自动地就有Primitive类的一个特性,这个特性在2.3.8节讨论了。
]
ConeYoyo对象所创建的分支图以BranchGroup为开始(为根结点),而对每一个圆锥对象的场景图路径则以指定变换的TransformGroup为根结点,在其后就是指定旋转和终止圆锥对象的TrahsformGroup。
几个场景图可能代表同一个虚拟世界。
以图2-6所示场景图为例,可以做一些很明显的改变,一个改变是删除孩子结点为ConeYoyo对象的BranchGroup,并把ConeYoyo对象直接插入Locale作为Locale的子结点。
BranchGroup放在这是为了将来在虚拟世界中加入可视对象而定的。
另一个改变是可以组合ConeYoyo对象中的两个TransformGroup对象,这些变换对象,就如例子中所示的那么简单。
Cone对象的Shape3D结点引用了图形结点组件,这些都是在Cone对象内部实现的,圆锥的Shape3D对象是圆锥对象的Group对象的孩子。
由于Cone对象继承自Group对象,所以同一Cone(或者其它Primitive对象)不能在场景图中多次使用。
图2-7显示了试图在同一单个场景图中重用同一个Cone对象所产生的错误消息。
这个错误在本教程的例子程序中是不会存在的。
—————————————————————————————————————————
Exceptioninthread"main"javax.media.j3d.MultipleParentException:
Group.addChild:
childalreadyhasaparent
atjavax.media.j3d.GroupRetained.addChild(GroupRetained.java:
246)
atjavax.media.j3d.Group.addChild(Group.java:
241)
atConeYoyoA
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 教程 中文版 第二