资源描述
基于JAVA3D的复杂曲面创意设计 毕 业 论 文(设计)题 目: 基于Java 3D的复杂曲面创意设计 摘 要三维复杂曲面造型技术主要是研究在计算机图像系统的环境下对曲面的表示、设计、显示和分析。在设计中,往往给出的型值点以及由此产生的样条曲线有时不能满足美观上的要求。该设计模型中采用了复杂曲线Bezier提出的参数曲线表示方法,即Bezier曲线。在此基础上生成Bezier曲面,并进行拼接生成复杂曲面。本文主要着眼于3D曲面技术的实现与应用,并完成基于Java 3D实现复杂曲面造型,多曲面拼接,3D坐标变换技术和3D纹理映射。通过利用Bezier曲面的设计和拼接技术,实现鸟巢和五环的外形塑造和模拟运动效果。首先,定义了16*27个控制顶点,来控制27个Bezier曲面的形状,将曲面拼接生成鸟巢和五环造型。 其中,在定义相邻两个曲面的控制顶点时,对曲面保持G0连续,将相邻两个曲面进行拼接。然后,把所定义的其中19个Bezier曲面全部拼接,形成五环,同时把8个Bezier曲面全部拼接,形成鸟巢。然后运用Alpha类和插值器PositionInterpolator类实现运动效果,最后生成3D场景。 本文重点研究三维复杂曲面造型,并完成基于Java 3D技术实现鸟巢和五环外形设计。其目的是对三维复杂曲面造型的实现,本文编写的Java 3D程序成功地通过了编译和运行过程,最后显示结果,成功的应用JAVA及JAVA 3D完成了鸟巢和五环的造型设计和展示效果。关键字:计算机图形学;Java 3D;复杂曲面;Bezier曲面;鸟巢和五环; AbstractThree-dimensional complex surface modeling techniques is to study the environment in the computer graphics system that under the surface, design, display and analysis.In the design, are often given data points and the resulting spline curve sometimes can not meet the esthetic requirements.The design model using the parameters of complex curve Bezier curves proposed method, which Bezier curve.On this basis, generated Bezier surfaces and complex surfaces generated by splicing.This article focuses on the realization of 3D surface technology and applications, and complete based on Java 3D surface modeling of complex, multi-surface blending, 3D technology and 3D coordinate transformation, texture mapping.Bezier surfaces through the use of the design and stitching technology, the shape of the nest and the rings to shape and motion simulation results.First, the definition of 16 * 27 control points to control the shape of 27 Bezier surfaces, the blending surface generation form the nest, and rings.Which, in the definition of the control points of two adjacent surfaces when the G0 to the surface to keep a continuous, spliced the two adjacent surfaces.Then, 19 of which are defined by all the stitching Bezier surfaces to form rings, while all of the eight Bezier surfaces splicing, the formation of the nest.Alpha class and then use interpolation for motion control PositionInterpolator class effect, the last generation 3D scenes.This paper focuses on complex three-dimensional surface modeling, and complete technology based on Java 3D shape of the nest and the rings design.The aim is to achieve three-dimensional complex surface modeling, this article written in Java 3D programs successfully compile and run through the process, and finally display the results, successful application of JAVA and JAVA 3D completed the nest and the design of rings and the display.Keywords: computer graphics; Java 3D; complex surface; Bezier surface; Birds Nest and the rings目 录1 绪论11.1计算机图形技术的发展与应用11.2 Java3D技术的简介11.3 Java3D与其他三维技术的比较21.4 Java3D的场景图结构31.5 Java 3D的场景式组织42 Java 3D基本图形元素52.1Java 3D的虚拟场景空间设计52.2 Java 3D的坐标系统72.3 场景(Locale)72.4 Java 3D的点、线绘制82.4.1 GeometryArray类82.4.2点的生成102.4.3线的生成102.4.4 Java 3D程序Shape 3D类对象中几何元素的定义112.5 Appearance类122.6 Material类132.7 Light类133 基本形体143.1长方体Box类143.2圆柱体Cylinder类143.3圆锥体Cone类143.4球体Sphere类144 坐标变换144.1Transform3D类144.2 TransformGroup类与Transform3D类之间的关系155 动画编程基础介绍165.1鼠标交互165.2键盘交互165.3 Alpha165.4自定义行为175.5 Morph类186 Bezier曲线介绍187 开发环境208 创意设计应用218.1创意设计内容简介218.2曲面设计五环和鸟巢218.3文字248.4主类Main.java269 总结30致 谢30参考文献31V1 绪论1.1计算机图形技术的发展与应用计算机图形学是研究如何用计算机表示、生成、处理和显示图形的一门学科。计算机图形学包括计算机图形处理与计算机图像处理。计算机图形处理主要研究三维空间型体二维空间几何图形的表示与显示技术,包括几何模型的计算机表示、几何模型的坐标变换与显示等。高级语言从C语言、C+语言发展到Java语言,计算机图形系统的开发平台也从早期的GKS、PHIGS等发展到OpenGL等,在发展到现在的Java 3D等。在早期的图形系统开发平台上,对几何元素的管理采用图层或图段的方式,绝大多数的算法都需要程序设计人员用高级语言编写,而Java 3D集成了底层的图形库OpenGL与DirectX功能,对几何形体采用场景式管理。计算机图形学广泛应用于以下领域:计算机辅助设计与制造、地形地貌与自然资源图、计算机动画、广告制作与艺术、科学计算可视化、虚拟现实技术以及游戏开发等。Java 3D封装了底层的图形库OpenGL与DirectX等功能,并且Java语言对网络应用有很好的支持,因此Java 3D也是适合开发网络游戏的三维图形系统。1.2 Java3D技术的简介1997年,SUN公司继Java之后有推出了适用于Internet环境的跨平台三维图形开发工具包Java 3D。Java 3D是Java 2 SDK的标准扩展,它对底层的图形库OpenGL与DirectX进行了封装。Java本身具有的强大网络功能通过浏览器在Internet上显示。目前Java 3D以广泛应用于科学计算可视化、机械设计、地理信息、动画制作、医学三维重建、教育等领域。Java 3D的功能与可编程性得到进一步扩展,并且Java 3D与Java一样,一次编程可跨平台运行。用Java 3D生成的代码具有可传输性,即从服务器端到客户端传输的是生成三维图像的程序与数据,而不是图像本身。这样,就可大大减少网络传输数据量。客户端从服务器端下载相应的Applet,由Java 3D运行环境解释运行,并在执行过程中不断从服务器端获取控制图像变换的数据,可生成动态的三维图形。Java 3D也是一个交互式三维图形应用编程接口API。与Java 2D、AWT、Swing包等的功能相互补充。Java 3D也集成了Java API的功能,如图像处理、文字显示与处理、绘制二维图形、交互式用户界面设计等。Java 3D能够对场景的可视化进行并行计算与优化,能够自动应用计算机硬件的加速功能,并且提高图形显示的效率,能够对场景进行预编译。Java3D用其自己定义的场景图和观察模式等技术构造了3D的上层结构,实现了在Java平台使用三维技术。本章将介绍Java3D特有的两个重要概念:场景图(Scene Graph)、观察模式(View Model)。在接口使用上的介绍分为两部分:说明如何使用Java3D接口;说明如何将Java3D技术与Java原有的Web技术(JSP、Serverlet)相结合,在网页上实现三维显示。Java3D API是Sun定义的用于实现3D显示的接口。3D技术是底层的显示技术,Java3D提供了基于Java的上层接口。Java3D把OpenGL和DirectX这些底层技术包装在Java接口中。这种全新的设计使3D技术变得不再繁琐并且可以加入到J2SE、J2EE的整套架构,这些特性保证了Java3D技术强大的扩展性。 JAVA3D建立在JAVA2(JAVA1.2)基础之上,JAVA语言的简单性使JAVA3D的推广有了可能。它实现了以下三维显示能够用到的功能: 1. 生成简单或复杂的形体(也可以调用现有的三维形体) 2. 使形体具有颜色、透明效果、贴图 3. 在三维环境中生成灯光、移动灯光4. 具有行为的处理判断能力(键盘、鼠标、定时等) 5. 生成雾、背景、声音6. 使形体变形、移动、生成三维动画7. 编写非常复杂的应用程序,用于各种领域如VR(虚拟现实)1.3 Java3D与其他三维技术的比较JAVA3D可应用在三维动画、三维游戏、机械CAD等多个领域。但作为三维显示实现技术,它并不是唯一选择而且是一个新面孔。在Java3D之前已经存在很多三维技术,这些三维技术在实现的技术、使用的语言以及适用的情况上各有不同,我主要介绍与Java3D又密切关系的三种技术:OpenGL、DIRECT3D、VRML OpenGLOpenGL是业界最为流行也是支持最广泛的一个底层3D技术,几乎所有的显卡厂商都在底层实现了对OpenGL的支持和优化。OpenGL同时也定义了一系列接口用于编程实现三维应用程序,但是这些接口使用C(C+)语言实现并且很复杂。掌握针对OpenGL的编程技术需要花费大量时间精力。 DIRECT3DDIRECT3D是Microsoft公司推出的三维图形编程API,它主要应用于三维游戏的编程。众多优秀的三维游戏都是由这个接口实现。与OpenGL一样,Direct3D的实现主要使用C+语言。VRML2.0(VRML97)自1997年12月正式成为国际标准之后,在网络上得到了广泛的应用,这是一种比BASIC、JAVASCRIPT等还要简单的语言。脚本化的语句可以编写三维动画片、三维游戏、计算机三维辅助教学。它最大的优势在于可以嵌在网页中显示,但这种简单的语言功能较弱(如目前没有形体之间的碰撞检查功能),与JAVA语言等其它高级语言的连接较难掌握,因而逐渐被淹没在竞争激烈的网络三维技术中。 1.4 Java3D的场景图结构 Java3D实际上是Java语言在三维图形领域的扩展,与Java一样,Java3D有纯粹的面向对象结构。Java3D的数据结构采用的是Scene Graphs Structure(场景图),就是一些具有方向性的不对称图形组成的树状结构(图1)。 实际由Java3D定义的一系列的对象,这些对象不是杂乱无序,对象之间也不是毫无关系。如果想让三维图像正常显示,必须在这两点上遵循Java3D场景图的规定。观察图1,Java3D场景图的树结构由各种各样的对象组成: 1.5 Java 3D的场景式组织在Java 3D中,将场景中的所有元素组织在一起,形成虚拟的整体,这个整体就称为Java 3D的一个虚拟场景或虚拟世界空间。在这个虚拟场景中包括了几何体的定义信息、光源及其位置与方向、视点的位置与观察方向、几何体的颜色、材质、透明度等属性、场景中的声音等元素。Java语言是以类、父类、子类、对象等方式组织一个软件中的相关功能,Java 3D是对Java语言功能的扩展,同样通过类、父类、子类、对象等方式组织一个场景。因此,Java 3D场景中的功能与组织结构条理清楚,也是一个倒立的树状结构,每个子类同样只具有一个父类,符合面向对象技术的思想。2 Java 3D基本图形元素2.1Java 3D的虚拟场景空间设计Java 3D是一种面向对象的API。通过场景图来管理场景中的各种图形元素。场景图是一个树状结构,在该树状结构的各级节点表示该场景中的各种图形元素。将由各种图形元素形成的一个场景的整体称为一个虚拟空间。在这个虚拟空间中的图形元素包括:几何体的定义数据,几何体显示时的颜色、材质、透明度等属性,背景颜色,光线类型,场景的作用范围,视点、投影面即投影类型,对几何体的坐标变换等。Java 3D虚拟场景空间的一般结构如图1所示。图中实线表示父子关系,虚线表示引用关系。Shape 3DTransformGroupVirtual UniverseLocalBranchGroupAppearanceShape 3DGeometryViewCavas 3DScreen 3D 图1 Java 3D虚拟场景空间结构图Java 3D与Java一样对各种功能的组织同样采用父类、子类、对象实例的方式。Java 3D中规定了在一个虚拟场景空间中各种图形元素的表示符号及虚拟场景空间的组织结构。在一个虚拟空间中可以包含多个Local节点。一个Local节点表示一个子场景的根节点。多个Local节点表示在该虚拟场景中有多个场景的根节点。但是,在实际应用中最常使用的是在一个虚拟空间中只包含一个子场景,也就是只包含一个Local节点。在一个Local节点之下,可包含一到多个Branch Group节点。每个Branch Group节点表示一种图形元素的集合。这种图形元素的集合主要有俩种:(1)定义几何体的数据与定义该几何体的颜色、材质、透明度等外观属性;(2)定义该几何体在显示的时候在该场景中的其他元素,如背景颜色、光源类型、光源颜色、视点位置与观察方向、投影平面的位置、坐标变换等。在实际应用中,最常用的是一个Local节点下只含有一个Branch Group节点,在一个Local节点下只含有一个Branch Group节点情况下,必须定义一个Shape 3D对象,在该对象中定义几何体的数据与几何体的颜色、材质、透明度等外观显示特性,该Shape 3D对象一般加入在一个Transform Group类节点中。在一个Branch Group节点之下,可包含多个Transform Group节点。每个Transform Group节点表示一种即包含有几何元素定义,有包含有坐标变换的节点。每个Transform Group可包含一种或多种几何体的定义,也可不包含有几何体的定义信息。但是一个Transform Group节点必须包含一个或多个Transform3D对象,表示对Transform Group节点中定义的几何体所进行的坐标变换。一个Transform3D对象表示对几何体进行旋转、平移和变比等坐标变换中的一种,多个Transform3D对象的组合形成一个总的坐标变换矩阵,这个总的坐标变换矩阵就属于包含这些Transform3D对象的Transform Group节点。如果该Transform Group节点中没有定义几何体,则这种坐标变换是针对第一次定义的几何体。如果在一个Transform Group节点中没有定义任何的坐标变换,则该Transform Group节点拥有默认的坐标变换矩阵,但该矩阵为单位矩阵,表示对几何体不进行任何变换。View的功能主要是实现在虚拟场景中设置视点与观察方向。Cavas 3D主要用来定义一种能够显示三维物体投影的画布。Screen 3D主要将画布上三维物体的投影显示在显示器上。2.2 Java 3D的坐标系统 Java 3D中用的是显示器坐标系,显示的物体是在观察坐标系的投影平面上三维物体的投影。在Java 3D中,几何体定义也采用该坐标系,所有的坐标变换也是针对该坐标系的。O表示坐标原点,在显示器的正中间。Z轴指向屏幕之外,也就是指向观察者。X轴的正向沿水平方向向右,Y轴的正向沿垂直方向向上。观察(图2)Y轴X轴Z轴O(图2.2)Java 3D 中所采用的而坐标系2.3 场景(Locale) 构造一个三维场景,程序员必须运行一个Java 3D程序。这个Java 3D应用程序必须首先创建一个虚拟宇宙对象并且至少把一个Locale对象附加之上。然后,构建出需要的场景图像,它由一个分支组结点开始并且包括至少一个观察平台对象,而场景图就是附加于这个观察平台。当一个包含场景图的观察对象被附加于一个虚拟宇宙,Java 3D的渲染循环就开始工作。这样,场景就会和它的观察对象一起被绘制在画布上。Java 3D虚拟空间的创建过程框图如下:创建简单虚拟空间Simple Universe定义虚拟空间中的球形范围BoundingSphere定义虚拟空间中的背景颜色定义虚拟空间中的光源类型、颜色定义鼠标对物体的平移、旋转、放大功能定义虚拟空间中的坐标变换节点TransformGroup,并设置TransformGroup的读/写属性定义三维物体的几何属性定义三维物体的颜色、材质等外观属性设置系统自动选取改虚拟空间的视点位置u.getViewingPlatform().setNominalViewingTransform();并在投影面上对三维物体进行透视投影将投影平面上的三维物体的透视投影显示izai画布Canvas上创建BranchGroup节点对象,并将该对象加入虚拟空间中2.4 Java 3D的点、线绘制2.4.1 GeometryArray类Java 3D最优秀的特点就是通过数组方式对各种几何元素进行定义,并且通过类的方式对各种几何图形元素进行定义与管理,这是面向对象的设计思想的体现。GeometryArray类是一个抽象类。定义点、线的数组类PointArray类、LineArray类都是该类的子类。GeometryArray类包含有位置坐标数组、颜色数组、法向量数组、纹理坐标数组和定点属性数组。所有的颜色值必须在0.01.0,所有的法向量都必须是单位向量。public GeometryArray(int vertexCount,int vertexFormat)构造函数:通过给定的定点数和定点格式创建一个空的GeometryArray类的对象。vertexCount:在GeometryArray中表示几何体所包含的定点数。vertexFormat:表示这些定点的格式,是一个多选项。其中,(1)COORDINATES:表示在该GeometryArray数组中包含点的坐标,并且该项是一个必选项;(2)NORMALS:表示包含每个顶点的法向量;(3)COLOR_3或COLOR_4:表示每个顶点颜色,COLOR_3表示没有Alpha信息,也就是指顶点数组包括没有透明度的颜色;COLOR_4表示有Alpha信息,也就是指定点数组包括含有透明度颜色;当不指定COLOR_3或COLOR_4顶点格式颜色是,则GeometryArray对象中的每个顶点的默认颜色都是白色;当指定了COLOR_3或COLOR_4顶点格式颜色,则GeometryArray对象中的每个顶点的默认颜色都是黑色;(4)TEXTURE_COORDINATE_2,TEXTURE_COORDINATE_3或TEXTURE_COORDINATE_4:分别表示每个顶点的2D、3D或4D纹理坐标。GeometryArray类中定义了多种方法,这些方法用来向GeometryArray类的对象中增加几何元素。1) setCoordinate、setCoordinates方法用setCoordinate(int index,float coordinate)方法:改变一个点的三个坐标值,index为点的编号。float coordinate是一个一维数组,分别表示一个点的x、y和z坐标,也就是coordinate0、coordinate1 、coordinate2分别表示该点的x、y和z坐标值。Point3f是javax.vecmath.Tuple3f包中定义的一个类,用该类的构造函数Point3f(float x,float y,float z)设置一个Point3f对象的x、y和z坐标分量值,是点坐标表示的一种很方便的形式。setCoordinates(int index,float coordinates)方法:从index指定的序号开始设置点的坐标值,index一般取0。2) setColor、setColors方法用setColor、setColors方法向GeometryArray类的对象中添加颜色值。public Color3f(float x,float y,float z)方法是Color3f类的一个构造函数,该构造函数通过设置R、G和B三个分量的值表示一种颜色。三个分量的值都必须在0.01.0之间。Color3f类对象的创建:Color3f color=new Color3f(0.2f,0.5f,1.0f),则color.x=0.2f,color.y=0.5f,color.z=1.0fcolor.x表示红颜色值,color.y表示绿颜色值,color.z表示蓝颜色值。setColor(int index,Color3f color)方法设置在index处点的颜色值,Color3f与Point3f类似,用三个浮点表示一种颜色组合,每个浮点数的值都在0.01.0。setColors(int index,float colors)方法对从index开始到index+length个点赋新值。2.4.2点的生成点由javax.media.j3d.Geometry包中的PointArray类来定义。PointArray的第一个构造函数:public PointArray(int vertexCount,int vertexFormat)。PointArray类是GeometryArray类的子类,因此,它继承了GeometryArray类中定义的方法与变量。vertexCount与vertexFormat参数的含义与GeometryArray类中含义相同。PointAttributes类的对象用来点的各种属性。点的属性包括:(1)Size:定义点的大小(2)Antialiasing:英文含义是反走样,当设置一个点的大小大于一个像素单位时,为了使点在显示时接近于一个圆形,则需要设置该参数。2.4.3线的生成LineArray(int vertexCount,int vertexFormat)构造函数:应用相关参数创建一个空的LineArray类的对象。vertexCount:表示生成多段直线段的点的总数。vertexFormat:表示这些点的格式。与 GeometryArray类中的参数相同。用这种方式定义的线段是不连续的。LineAttributes类的对象定义所有与线的显示相关的属性域状态。构造函数如下LineAttributes(float lineWidth,int linePattern,booleanlineAntialiasing),lineWidth:线宽。linePattern:线型,如:PATTERN_SOLID,PATTERN_DASH,PATTERN_DOT,PATTERN_DASHOT 。lineAntialiasing:是否打开反走样标志。setLineWidth(float lineWidth):改变线宽setLinePattern(intlinePattern):改变线型setLineAntialiasingEnable(boolean state):打开或关闭反走样1) 线类型定义它能够定义线条的线型。Pattern的线类型包含如下几种:PATTERN_SOLID:用序号0表示,定义线类型为实线。PATTERN_DASH:用序号1表示,定义线类型为虚线。PATTERN_DOT:用序号2表示,定义线类型为点线。PATTERN_DASH_DOT: 用序号3表示,定义线类型为点划线。PATTERN_USER_DEFINED: 定义用户自定义的线类型。setLinePattern(int linePattern)设置LineAttributes 类的对象中的线型参数。2) 反走样属性定义setLineAntialiasingEnable(boolean state)设置LineAttributes类的对象中的反走样变量。 参数state 的取值为true或false。 True表示打开反走样开关, false表示关闭。3) 线宽设计setLineWidth(float lineWidth)设置lineAttributes类的对象中的线宽。2.4.4 Java 3D程序Shape 3D类对象中几何元素的定义Shape 3D是一种叶子节点类。在该节点中定义了一个几何对象元素的列表和一个唯一的外观属性元素对象,该几何对象元素列表包含了在Shape 3D中定义的所有几何对象元素,这些几何对象元素在该列表中的排列顺序为:0、1、2 。一个Shape 3D的对象包含了一个或多个几何元素对象和唯一的外观元素对象。几何对象定义形状节点的几何数据。外观定义几何对象的外观属性,如颜色、材质和纹理等。Shape 3D类的重要方法如下:addGeometry(Geometry geometry):向Shape 3D节点的几何元素列表中增加参数指定的几何元素。setAppearance(Appearance appearance):设置整个Shape 3D节点的外观属性元素。setGeometry(Geometry geometry):用参数指定的几何元素替换Shape 3D节点的几何元素列表中index=0处的几何元素。2.5 Appearance类Appearance类的对象定义所有的显示状态。所有的这些状态都分别作为一个Shape 3D节点的元素对象。显示状态包含的内容如下:(1)颜色属性:用一个ColoringAttributes类的对象定义颜色。(2)线的属性:定义与线相关的属性如线型、线宽、是否使用反走样。用一LineAttributes类的对象定义。(3)点的属性:定义点大小及是否应用反走样。用PointAttributes类的对象定义。(4)材质:定义一个物体在光照情况下的外观,如环境光颜色,散射光颜色、镜面反射光颜色、发射光颜色和光亮度。用Material类的对象定义。(5)纹理:定义纹理图像和过滤参数。通过Texture类的对象定义。纹理属性:定义与纹理影射有关的参数。用TextureAttributes类的对象定义。Appearance类的构造函数与方法Appearance app=new Appearance();1.setColoringAttributes(ColoringAttributes coloringAttributes)设置ColoringAttributes的对象到Appearance类的对象中。2.setLineAttributes(LineAttributes lineAttributes) 设置LineAttributes的对象到Appearance类的对象中。3.setMaterial(Material material) 设置Material的对象到Appearance类的对象中。4. setPointAttributes(PointAttributes pointAttributes) 设置PointAttributes的对象到Appearance类的对象中。5. setTexture(Texture texture) 设置Texture的对象到Appearance类的对象中。6. setTextureAttributes(TextureAttributes textureAttributes) 设置TextureAttributes的对象到Appearance类的对象中。2.6 Material类Material类的对象定义一个三维物体在光照情况下的外观。如果在一个Appearance类的对象中Material类的对象为null,则光照效果对所有包含该Appearance类的对象的节点不起作用。在Material类中设置的属性如下:环境光颜色:包含红绿蓝三色,颜色取值范围为0.01.0。散射光颜色:当光照射时,物体材质表现出的红绿蓝颜色,颜色取值范围为0.01.0。镜面反射光颜色:在光照下,物体的镜面反射的红绿蓝颜色,颜色取值范围为0.01.0。物体的发亮特性:表示物体的光亮程度,取值范围1.0,128.0。 Material类的相关方法如下:setEmissiveColor(float r,float g,float b)方法设置放射光,用r,g,b为红绿蓝颜色分量设置环境光颜色。setDiffuseColor(float r,float g,float b)方法设置放射光,用r,g,b为红绿蓝颜色分量设置散射光颜色。setShininess(float shininess),设置发亮值。2.7 Light类Light类叶子节点是一个抽象类,其中定义的一组参数属于所有类型的光。这些参数包括光颜色,光照开关标志,和一个光的作用范围。在一个场景中的光可能包含有多个独立定义的光源。光源的类型包括:平行光源DirectionalLight,点光源PointLight和AmbientLight。相关方法(1)setEnable(boolean state)设置光的开关。state为true时表示光开。(2)setColor(Color3f color)设置光的颜色(3)setInfluencingBounds(Bounds bounds)设置光照范围3 基本形体Java 3D在com.sun.j3d.utils包中定义好的基本形体包括:长方体、圆柱体、圆锥体和球体。这些定义好的形体在某些应用中可直接使用。3.1长方体Box类Box(float xdim,float ydim,float zdim,Appearance app)构造函数,用指定的外观属性app创建一个中心位于坐标原点的三维长方体。长方体的长宽高分别为2*xdim,2*ydim,2*zdim.3.2圆柱体Cylinder类Cylinder(float radius,float height,Appearance app)生成底面半径为radius,高位height的圆柱体。圆柱体的中心位于原点,圆柱体的中心轴与y轴重合3.3圆锥体Cone类Cone(float radius,float height,int primflags,Appearance app)用指定的primflags参数与app外观属性生成底面半径为radius,高位height的圆锥体。圆锥体的中心位于原点,中心轴与y轴重合3.4球体Sphere类Sphere(float radius,int primflags,int divisions,Appearance app) 用指定的primflags参数与app外观属性生成半径为radius的球。球的中心位于原点4 坐标变换4.1Transform3D类Transform3D类主要功能是实现对几何元素的坐标变换。1.构造函数Transform3D t=new Transform3D();创建一个新的Transform3D类的对象,该对象表示一个4*4的坐标变换矩阵,该坐标变换矩阵是一个单位矩阵。2.方法rotX(double angle)使图形绕X轴逆时针旋转一个角度.rotY(double angle)使图形绕Y轴逆时针旋转一个角度.rotZ(double angle)使图形绕Z轴逆时针旋转一个角度.setScale(double scale)设置变比变换系数,在X、Y、Z轴三个方向相同setScale(Vector3d scale) 设置变比变换系数,分别设置在X、Y、Z轴三个方向的变比变换系数。setTranslation(Vector3f trans)用trans中的三个分量设置对图形的一种平移变换。 4.2 TransformGroup类与Transform3D类之间的关系一个Transform3D对象表示对几何体的坐标平移、旋转、变比等坐标中的一种,多个Transform3D对象的组合形成一个总的坐标变换矩阵。所有表示各种几何变换的Transform3D对象包含在一个Transform类的对象中,表示对空间三维物体所进行的各种坐标变换的组合,如果表示一种几何变换Transform3D的对象没有加入到该TransformGroup类的对象中,则该变换对三维物体不起作用。也可一次定义一个总的坐标变换矩阵,并创建一个Transform3D对象,将该Transform3D对象加入到TransformGroup类的对象中也可以分步定义多个不同类型的坐标变换矩阵,然后依次创建多个Transform3D对象,将这些Transform3D对象一次加入TransformGroup类对象中,则以Transform3D的加入次序一次对物体进行变换。如果在一个TransformGroup节点中没有定义任何的坐标变换,也就是没有加入任何的Transform3D对象,则该TransformGroup节点拥有默认的4*4坐标变换矩阵,但该矩阵为单位矩阵,表示对几何体不进行任何几何变换。5 动画编程基础介绍5.1鼠标交互Java 3D中提供了鼠标交互的工具类com.sun.j3d.util.behaviors.MouseBehavior,利用这个工具类,可以方便的实现对鼠标事件的响应。MouseBehavior是Behavior的子类,是一个抽象类,包括MouseRotate,MouseZoom,MouseTranslate3各子类,分别可以通过鼠标的左中右键实现对几何形体的旋转,缩放,平移。与鼠标行为交互相关的还有一个接口MouseBehaviorCallback,这个接口提供了一个TransformChanged方法,当鼠标交互改变了坐标系时,将会调用这个方法。而MouseRotate,MouseZoom,MouseTranslate都实现了这个接口,因此可以重载这个方法来实现一些效果。5.2键盘交互Java 3D中提供了键盘交互的工具类com.sun.j3d.util.behaviors.Keyboard.KeyNavigatorBehavior,它也是Behavior的子类。 5.3 Alpha动画研究的核心内容之一就是研究几何形体如何在空间和时间中运动。Java 3D中给出了一系列的内插器,可以方便的用于动画制作。各种内插器的使用和Alpha类密不可分,内插器定义了几何形体如何在空间做运动,而Alpha定义了几何形体运动的时间控制,它们结合起来就可以编写简单的三维动画。(1)Alpha对象提供了动画的时间控制,一个循环周期分为5段,包括:1.起始延时时段:phaseDelay Duration2.上升时段:increasingAlphaDuration3.高位时段alphaAtOneDuration4.下降时段decreasingAlphaDuration5.底位时段alphaAtZeroDuration可以对每个时段指定所占用的时间,例如上升时段占用了一个周期的时间,那么几何形体将从初始位置变化到终点位置,然后跳回初始位置,重复上述动作。用不同的组合方式,还可以产生多种不同的运动,Alpha的构造函数:Alpha(int loopCount,int mode,long tiggerTime,long phaseDelayDuration,long increasingAlphaDuration,long increasingAlphaRampDuration,long alphaAtOneDuration,long decreasingAlphaDuration,long decreasingAlphaRampDuration,long alphaAtZeroDuration),其中,表示循环次数;表示对象每一周期的运行方式,参数phaseDelay Duration,increasingAlphaDuration,alphaAtOneDuration,decreasingAlphaDuration,alphaAtZeroDuration与Alpha的循环周期的5段一一对应,increasingAlphaRampDuration,decreasingAlphaRampDuration为变化的加速度和反加速度,可以控制变化的速度。 5.4自定义行为自定义行为也必须是Behavior类的子类。扩展Behavior类,在构造器中指明要变幻的对象,还需要覆盖initialize()方法和processStimulus()方法。在initialize()方法中设置行为的触发条件,例如定时器鼠标事件和键盘按键事件等。具体的行为内容在方法processStimulus()中,例如可以修改几何形体坐标系或触发其他行为等。5.5 Morph类Java3D中Morph类可以将GeometryArray类型的几何形体的顶点在多个顶点数组之间变形。从本质上说,Morph并不是一个内插器,而是一个行为。因此它需要扩展Behavior类,并且覆盖initialize方法和processStimulus方法。Morph类有以下两种构造器:Morph(GeometryArray geometry Arrays)Morph(GeometryArray geometry Arrays , Appearance appearance)其中,geometryArrays为GeometryArray类型的数组,这个数组可以是GeometryArrays类型的也可以是它的子类例如TrangleArray, QuadStripArray和IndexedLineStripArray等,但是在同一个数组中,元素的类型必须相同。Appearance 为这个几何形体的外观。Morph中几何形体的变化是通过weight数组来控制的,weight中数组的元素对应顶点数组,例如weight0表示其实点的顶点数组,weightn表示变化终点的顶点数组。Weight中元素的数值在01之间变化,其意义就是变化的程度。6 Bezier曲线介绍6.1. Bezier曲线定义 给定n+1个控制顶点Pi(i=0n) ,则Bezier曲线定义为: P(t)=Bi,n(t)Pi ,t0,1 其中:Bi,n(t)称为基函数。 Bi,n(t)=Ci,nti*(1-t)n-i Ci,n=n!/(i!*(n-i)!) 6.2. Bezier曲线性质(1)端点性质: a)P(0)=P0, P(1)=Pn, 即:曲线过二端点。 b)P(0)=n(P1-P0), P(1)=n(Pn-Pn-1) 即:在二端点与控制多边形相切。 (2)凸包性:Bezier曲线完成落在控制多边形的凸包内。 (3)对称性:由Pi与Pn-i组成的曲线,位置一致,方向相反。 (4)包络性:Pn(t)=(1-t)Pn-1(t)+tPn-1(t) 在CAD/CAM中,常采用Bezier曲线曲面,这样便于理解曲线/曲面。但采用Bezier形式的曲线曲面不能精确的表示二次曲线和二次曲面,如球体和圆。将多项式改为有理形式,不仅能精确表示二次曲线和二次曲面,且增加了设计的自由度。重复的进行两点线性插值,可以构造Bezier Curve。重复的进行两点有理插值,可以构造有理Bezier Curve。 与控制顶点类似,有理Bezter曲线上的点可映射为Bezter曲线上的点或对应的控制多边形上的点。在透视投影使用理形式与非有理形式产生相同投影时,有理Besier曲线曲面和有理B样条曲线曲面继承了Bezier曲线曲面和B样条曲线曲面的简单、优美的特性。这种形式,数学上的分析及几何特性的掌握了解都比其他4D空间(wx、wy、wz、w)方法和单纯的3D空间有理形式要简单和容易。 现在,有理曲线曲面不仅仅用于表示和构造二次曲线曲面。对有理曲线曲面的权因子该如何选取往往不很清楚,而且有理形式的计算比非有理形式复杂,但是,由于其构造特性,现在人们已经开始考虑有理Bezter和有理B样条曲线曲面的应用。6.3. Bezier曲线、曲面的拼接要设计复杂的Bezier曲线,就要将单段的Bezier曲线拼接起来。同样,要设计复杂的Bezier曲面,需要将多个单片Bezier曲面拼接起来。这里首先介绍曲线、曲面在拼接时的连续性问题。(1) 曲线、曲面拼接的连续性C0连续(零阶参数连续):第一段曲线的终点与第二段曲线的起点位置重合。C1连续(一阶参数连续):两相拼接的曲线在拼接点处重合,在拼接点处有相同的一阶导数。C2连续(二阶参数连续):两相拼接的曲线在拼接点处重合,在拼接点处有相同的一阶导数和二阶导数。G0连续(零阶几何连续):第一段曲线的终点与第二段曲线的起点位置重合,称为G0连续,同时也是C0连续。G1连续(一阶几何连续):两相拼接的曲线段在拼接点处重合,切线方向相同,但大小不等,则这种连续称为G1连续。G2连续(二阶几何连续):两相拼接的曲线段在拼接点处重合,在拼接点处G0连续,G1连续,在拼接点处二阶导数方向相同,但大小不等,将这种连续称为G2连续。6.4. Bezier曲面的性质1) 端点性质Bezier曲面的四个角点与控制多边形网格的四个角控制顶点重合: P0,0=S(0.0), P0,m=S(0,1) Pn,0=S(1.0), Pn,m=P(1.1)2) Bezier曲面的边界线 Bezier曲面S(u,v)的四边界线S(O,v)、S(1,.),S(u,1)分别由对应控制网格的四条边界控制多边形形成。3) 曲面端点的切平面 由通过该端点的两个控制多边形的边形成的平面和Bezier曲面在该端点处的切平面重合。4) 凸包性 Bezier曲面位于其控制网格形成的凸包之内。5) 变差递减性空间任意条直线与Bezier曲面交点的个数不多于该直线与其控制多边形网格的交点个数7 开发环境操作系统: WINDOWS XP硬件配置: CPU:2.80GHz,内存:512M,硬盘:120G,显卡:7300GS开发工具包:jdk-1_5_0_15-windows-i586-p.exeJava 3D-1_5_1-windows-i586(1).exe开发工具: Jcreator 1运行工具: Jcreator 1 或 jar文件直接运行 或命令行运行8 创意设计应用8.1创意设计内容简介 奥运会五环旗是在顾拜旦主持下制定的。五环分别为蓝、黑、红、黄、绿色,三环在上,两环在下,环环相扣,紧紧联在一起。同时也代表五大洲会聚在一起,也象征着世界和平!在这个画面中五环缓缓降落在一个用树枝般的钢网把一个可容10万人的体育场编织成的一个温馨鸟巢!用来孕育与呵护生命的“巢”,寄托着人类对未来的希望。 在五环降落的同时鸟巢的下方将出来“海南欢迎您的到来”,这象征着海南旅游事实的蓬勃发展,同时也象征着海南人民准备好了迎接国
展开阅读全文