JAVA3D学习系列(11)---外部复杂形体的调用
java类中方法调用的过程

java类中方法调用的过程The process of method invocation in a Java class involves several steps. When a method is called, the Java Virtual Machine (JVM) identifies the class in which the method is defined and locates the appropriate method definition. Then, the JVM pushes the method arguments onto the stack and creates a new frame for the method on the call stack. The method's code is then executed, and when the method completes, the frame is removed from the call stack. This process can be complex and understanding it is essential for anyone working with Java programming.在Java类中方法调用的过程涉及几个步骤。
当调用一个方法时,Java虚拟机(JVM)会识别方法所在的类,并找到适当的方法定义。
然后,JVM将方法参数推送到栈上,并在调用堆栈上为方法创建一个新的帧。
然后执行方法的代码,当方法完成时,将删除调用堆栈上的帧。
这个过程可能很复杂,了解它对于任何与Java编程工作的人来说都是至关重要的。
One key aspect of method invocation in Java is understanding the difference between static and dynamic binding. Static binding occurs when the method to be invoked is determined at compile time basedon the type of reference used to call the method. In contrast, dynamic binding determines the method to be invoked at runtime, based on the type of object that the reference refers to. This distinction is important for understanding polymorphism and the behavior of overridden methods in Java.Java中方法调用的一个关键方面是理解静态绑定和动态绑定之间的区别。
在Java 3D中载入外部3D模型文件

在Java 3D中载入外部3DJava 3D虽然能支持众多的外部3D模型文件,但能支持被Java 3D使用的外部模型文件仅为.obj和.lwd两种;分别对应ObjectFile类和Lw3dLoader类。
相比之下几款主流的3D建模软件都能生成.obj格式的文件,因此本文主要介绍使用ObjectFile类载入.obj文件的方法。
ObjectFile类有三个构造方法,分别为:ObjectFile()ObjectFile(int flags)ObjectFile(int flags, float radians)其中flags为一个整型的常量参数,用于决定载入的3D模型以什么方式生成。
参数radians用于决定载入模型的可显示半径。
flags参数可在以下四个值之间任取一个或者用逻辑或("|")将几个参数组合使用。
ObjectFile.RESIZE:忽略被载入的模型大小,直接把载入的模型放在一个范围在(1,1,1)到(-1,-1,-1)之间的立方体空间内,并把坐标原点设为(0,0,0)。
ObjectFile.REVERSE:反转载入的外部模型,即可能看模型的后面。
ObjectFile.TRIANGULATE:将模型的面以三角形方式显示,此参数主要便于观察模型凹凸面。
ObjectFile.STRIPIFY:以模型文件内模型的实际情况显示,此参数也是默认参数。
当初始化了ObjectFile对象后就可以用load方法载入.obj格式的文件,如果模型中已包含了贴图和光照的话也将一起被载入。
load方法需要一个参数用于指出.obj格式文件所在的路径,load方法有多个重载方法可以使参数即可以接受String类的值也可以接受Url类的值或者从输入法流读入,如果模型载入成功将返回一个Scene类的对象,如果载入失败将抛异常。
Java 3D针对load方法定义了三个异常类:FileNotFoundException类:表示文件未找到。
Java3D总结五篇

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。
所以:他就是将许多对象安放在这个虚拟空间的过程,在设置各个方面的属性,如:形状,位置,外观,贴图,透明效果等;再在三维环境下设置灯光,雾,背景,声音等。
Java3D毕业设计---基于JAVA3D的复杂曲面创意设计

Java3D毕业设计---基于JAVA3D的复杂曲面创意设计基于JAVA3D的复杂曲面创意设计毕业论文(设计)题目: 基于Java 3D的复杂曲面创意设计I基于JAVA3D的复杂曲面创意设计摘要三维复杂曲面造型技术主要是研究在计算机图像系统的环境下对曲面的表示、设计、显示和分析。
在设计中,往往给出的型值点以及由此产生的样条曲线有时不能满足美观上的要求。
该设计模型中采用了复杂曲线Bezier提出的参数曲线表示方法,即Bezier曲线。
在此基础上生成Bezier曲面,并进行拼接生成复杂曲面。
本文主要着眼于3D曲面技术的实现与应用,并完成基于Java 3D实现复杂曲面造型,多曲面拼接,3D坐标变换技术和3D纹理映射。
通过利用Bezier曲面的设计和拼接技术,实现鸟巢和五环的外形塑造和模拟运动效果。
首先,定义了16*27个控制顶点,来控制27个Bezier曲面的形状,将曲面拼接生成鸟巢0其中,在定义相邻两个曲面的控制顶点时,对曲面保持G连续,和五环造型。
将相邻两个曲面进行拼接。
然后,把所定义的其中19个Bezier曲面全部拼接,形成五环,同时把8个Bezier曲面全部拼接,形成鸟巢。
然后运用Alpha类和插值器PositionInterpolator类实现运动效果,最后生成3D场景。
本文重点研究三维复杂曲面造型,并完成基于Java 3D技术实现鸟巢和五环外形设计。
其目的是对三维复杂曲面造型的实现,本文编写的Java 3D程序成功地通过了编译和运行过程,最后显示结果,成功的应用JAVA及JAVA 3D完成了鸟巢和五环的造型设计和展示效果。
关键字:计算机图形学;Java 3D;复杂曲面;Bezier曲面;鸟巢和五环;II基于JAVA3D的复杂曲面创意设计AbstractThree-dimensional complex surface modeling techniques is to studythe 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, whileall of the eight Bezier surfaces splicing, the formation of thenest.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.computer graphics; Java 3D; complex surface; Bezier surface; Keywords:Bird's Nest and the ringsIII基于JAVA3D的复杂曲面创意设计目录1 绪论 ..................................................................... ................................................. 1 1.1计算机图形技术的发展与应用 ..................................................................... ..... 1 1.2 Java3D技术的简介 ..................................................................... ..................... 1 1.3 Java3D与其他三维技术的比较 ..................................................................... .. 2 1.4 Java3D的场景图结构 ..................................................................... ................. 3 1.5 Java 3D的场景式组织...................................................................... ............... 4 2 Java 3D基本图形元素 ..................................................................... ..................... 5 2.1Java 3D的虚拟场景空间设计 ..................................................................... ...... 5 2.2 Java 3D的坐标系统 ..................................................................... ................... 7 2.3 场景(Locale) ............................................................... ................................ 7 2.4 Java 3D的点、线绘制...................................................................... (8)2.4.1 GeometryArray类 ..................................................................... . (8)2.4.2点的生成 ..................................................................... ................................. 10 2.4.3线的生成 ..................................................................... ................................. 10 2.4.4 Java 3D程序Shape 3D类对象中几何元素的定义 .................................. 11 2.5 Appearance类 ..................................................................... ........................... 12 2.6 Material类 ..................................................................... ............................... 13 2.7 Light类 ..................................................................... ..................................... 13 3 基本形体 ..................................................................... ....................................... 14 3.1长方体Box类 ..................................................................... ............................. 14 3.2圆柱体Cylinder类 ..................................................................... ................... 14 3.3圆锥体Cone类 ..................................................................... ........................... 14 3.4球体Sphere类 ..................................................................... ........................... 14 4 坐标变换 ..................................................................... ....................................... 14 4.1Transform3D类 ..................................................................... ........................... 14 4.2 TransformGroup类与Transform3D类之间的关系 ...................................... 15 5 动画编程基础介绍 ..................................................................... ........................ 16 5.1鼠标交互 ..................................................................... ..................................... 16 5.2键盘交互 ..................................................................... ..................................... 16 5.3Alpha .................................................................. ............................................ 16 5.4自定义行为 ..................................................................... ................................. 17 5.5 Morph类 ..................................................................... ..................................... 18 6 Bezier曲线介绍 ..................................................................... ............................ 18 7 开发环境 ..................................................................... ....................................... 20 8 创意设计应用 ..................................................................... ................................ 21 8.1创意设计内容简介 ..................................................................... ...................... 21 8.2曲面设计五环和鸟巢 ..................................................................... .................. 21 8.3文字 ..................................................................... ............................................. 24 8.4主类Main.java .............................................................. ................................. 26 9 总结 ..................................................................... ............................................... 30 致谢 ..................................................................... ........... 错误~未定义书签。
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 核心类。
java中方法的定义和调用

java中方法的定义和调用在Java编程语言中,方法(Method)是一种用于执行特定任务的可重用代码块。
它是面向对象编程的基本组成部分之一,用于封装某些功能并提供代码重用的机制。
方法的定义和调用是使用Java语言开发应用程序的重要概念之一。
一、方法的定义方法由方法名、参数列表、返回类型和方法体组成。
方法名是用来唯一标识方法的名字,参数列表是方法接收的参数,返回类型是方法执行完毕后返回的值的类型。
方法体是一条或多条语句的集合,用来定义方法要执行的具体操作。
方法定义的语法如下:访问修饰符返回类型方法名(参数列表) {方法体具体实现逻辑}在上面的代码中,访问修饰符可以是public、protected、private或无修饰符。
返回类型可以是任意Java数据类型或void(表示方法没有返回值)。
方法名可以根据需求进行自定义,参数列表是用来接收传递给方法的值。
例如,下面是一个计算两个整数之和的方法的定义:javapublic int sum(int num1, int num2) {return num1 + num2;}在上面的代码中,方法名为sum,参数列表为两个int类型的参数num1和num2,返回类型为int。
二、方法的调用方法的调用是指通过方法名和参数来执行方法体中的代码。
方法在调用时,可以传递参数给方法,方法可以根据接收到的参数执行相应的操作,并返回一个结果。
方法调用的语法如下:方法名(参数列表);在调用方法时,需要提供与定义方法时相匹配的参数。
方法的返回值可以被存储在一个变量中,也可以直接使用。
例如,下面是调用之前定义的sum方法的示例:javaint result = sum(3, 5);System.out.println(result);上面的代码会打印出8,因为调用sum方法时,传递了参数3和5,方法执行后返回的结果被赋值给result变量,并输出到控制台。
三、方法的重载Java允许方法重载(Overloading),即定义多个相同名字但参数列表不同的方法。
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)直接定义小体素中心点的属性值﹐用该中心点属性值代表该体素的属性。
java方法调用原理
java方法调用原理Java方法调用是Java程序的基础,理解方法调用原理可以帮助我们更好地编写和调试Java程序。
本文将介绍Java方法调用的原理及其相关概念。
1. 方法调用概述方法调用是指程序执行时通过方法名称来调用相应的代码块。
在Java中,方法调用可以通过两种方式来实现:静态方法调用和动态方法调用。
2. 静态方法调用原理静态方法调用是通过类名直接调用的方式,不需要创建类的实例对象。
在Java中,静态方法属于类本身而不是类的实例对象。
通过类名和方法名可以直接调用静态方法。
在编译阶段,编译器就能确定静态方法的调用关系,因此静态方法调用是在编译阶段就被解析的。
编译器会在方法调用处将方法调用指令替换为具体的方法代码,从而在运行时直接执行指定的代码块。
3. 动态方法调用原理动态方法调用是通过对象实例来调用的方式,需要先创建对象实例,然后通过对象实例来调用相应的方法。
动态方法调用是在运行时才能确定方法的调用关系。
在编译阶段,编译器只能确定对象的类型,但无法确定具体调用的方法。
只有在运行时,JVM 才能根据对象的实际类型来动态找到具体调用的方法。
这就是所谓的“多态”特性。
JVM 通过一个称为“方法表”(Method Table)的内部数据结构来实现动态方法调用。
方法表中保存了对象类型的所有方法的入口地址。
在运行时,JVM 根据对象的实际类型查找方法表,然后通过方法表确定需要调用的具体方法。
4. 方法调用的参数传递在方法调用过程中,参数的传递是通过“值传递”(Pass by Value)方式实现的。
无论是基本类型还是引用类型,参数传递的本质都是将参数的值进行拷贝传递。
对于基本类型的参数,直接传递参数的值。
而对于引用类型的参数,传递的是引用值的拷贝。
因此,在方法内部修改引用类型参数的值,并不会改变原始对象的值,但是可以修改原始对象的内容。
5. 方法重载与方法重写在Java中,方法重载(Overloading)和方法重写(Overriding)是两个重要的概念。
Java ME 程序设计第11章Java ME中的3D程序开发
外部建模导入3D模型
在Mobile 3D Graphics中提供了一个Loader类,它可以载入M3G格
式的文件。除了支持M3G格式的文件之外,Loader类还可以装载 PNG格式的图像文件, Loader类有如下两个静态方法: public static Object3D[ ] load(String name) public static Object3D[ ] load(byte[ ] data, int offset) 其中,参数name代表要装载的文件名,参数data是一个字节数组, 包含了要被装载的二进制对象,参数offset代表字节数组中开始读取 数据的起始位置索引。如果装载成功,该方法将返回一个Object3D 对象数组,该数组中将包含场景中全部的节点。
3D场景的创建
世界World类:在Mobile 3D中,场景树的根节点必须是World类的实
例对象,其中只有摄像机Camera类和光线Light类比较特殊,可以 不被放置在这个树中,而是直接通过Graphics3D类的对象来设置。 摄像机Camera类:在设备显示屏幕上,Mobile 3D中所有的三维物体 都是以二维平面的形式表现出来的,因此为了能在二维平面中显示 三维物体,必须把三维物体投影到二维平面上。在Mobile 3D中摄像 机Camera类负责完成这个工作。 光线Light类:把光线加进3D场景中可以给最终的外观带来一个巨大 的变化。Mobile 3D中的光源用Light类表示 背景Background类: Background作为3D场景的背景,通常是一幅可 操作的二维图片。默认情况下,不设置裁减区域,背景所采用的内 容将是整张图片。背景图像必须首先被转换成Image2D对象,然后 再调用setImage()方法设置成背景图像。如果不使用背景图像,也 可以采用setColor()方法来设置背景颜色。
在JAVA中如何调用方法
在JAVA中如何调用方法在JAVA中,调用方法是通过对象或类来执行的。
调用方法的过程可以分为以下几个步骤:1. 创建对象:如果要调用的方法是非静态方法,则需要创建一个对象。
对象可以由类创建,也可以由其他方法返回。
2. 方法命名:根据方法的定义,找出需要调用的方法名。
3. 传递参数:如果方法需要传递参数,则需要根据方法定义的参数类型和数量,将参数传递给方法。
4. 调用方法:使用对象或类名,以及方法名和参数列表,来调用方法。
5. 获取返回值:如果方法有返回值,则可以将返回值赋给一个变量,以便后续使用。
在下面的代码示例中,我们将详细介绍如何调用方法。
javapublic class Calculator {private int result;public Calculator() {result = 0;}public void add(int num1, int num2) {result = num1 + num2;}public int subtract(int num1, int num2) {return num1 - num2;}public static int multiply(int num1, int num2) { return num1 * num2;}public int getResult() {return result;}}public class Main {public static void main(String[] args) {创建对象Calculator calculator = new Calculator();调用非静态方法calculator.add(5, 3);调用有返回值的非静态方法int difference = calculator.subtract(10, 7);System.out.println("Difference: " + difference);调用静态方法int product = Calculator.multiply(4, 6);System.out.println("Product: " + product);获取结果int sum = calculator.getResult();System.out.println("Sum: " + sum);}}在上面的示例中,我们首先定义了一个名为Calculator的类,其中包含了一个私有的实例变量result和若干方法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
JAVA3D学习系列(11)---外部复杂形体的调用(Wavefront的OBJ,Lightwave的LWS和LWO,WRL,DWG,3DS)我们可以利用前面介绍的方法生成我们所需要的基本形体,生成点、线、平面。
但有的时候,我们需要用到其它格式的三维形体,如VRML2.0格式的图形文件,AUTOCAD绘出的DWG格式的三维形体,3DS MAX绘制出的复杂形体。
对于这些形体,我们可以非常方便地将其用到JAVA3D程序中去。
下面我们介绍一些图形格式在JAVA3D中的应用方法。
一. Wavefront的OBJ格式的图形文件的调用1. OBJ格式图形的简单调用JAVA3D编译环境所带的UTILITY有两个LOADER,一个可用来调用Wavefront软件的OBJ格式的三维图形格式文件,一个可用来调用Lightwave软件的LWS及LWO格式的三维图形格式文件。
假设我们有一个OBJ格式的文件(JAVA3D附带有两个OBJ,文件名分别为galleon.obj和p51_mustang.obj,以及调用它们的一个程序ObjLoad.java)。
我们编写的第一个程序Obj1.java介绍了OBJ图形的调用方法。
程序的便宜方法:javac Obj1.java程序的运行方法(假设图形在同一目录):java Obj1 galleon.obj//Obj1.javaimport com.sun.j3d.loaders.objectfile.ObjectFile;import com.sun.j3d.loaders.ParsingErrorException;import com.sun.j3d.loaders.IncorrectFormatException;import com.sun.j3d.loaders.Scene;import java.io.*;import java.applet.Applet;import java.awt.BorderLayout;import com.sun.j3d.utils.applet.MainFrame;import com.sun.j3d.utils.universe.*;import javax.media.j3d.*;import javax.vecmath.*;public class Obj1 extends Applet {private String filename = null;public BranchGroup createSceneGraph(String args[]) {BranchGroup objRoot = new BranchGroup();Color3f light1Color = new Color3f(1.0f, 1.0f, 0.9f);Vector3f light1Direction = new Vector3f(4.0f, -7.0f, -12.0f);BoundingSphere bounds =new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);DirectionalLight light1= new DirectionalLight(light1Color, light1Direction);light1.setInfluencingBounds(bounds);objRoot.addChild(light1);TransformGroup objTrans = new TransformGroup();objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);objRoot.addChild(objTrans);ObjectFile f = new ObjectFile( );Scene s = null;try {s = f.load(filename);}catch (FileNotFoundException e) {System.err.println(e);System.exit(1);}catch (ParsingErrorException e) {System.err.println(e);System.exit(1);}catch (IncorrectFormatException e) {System.err.println(e);System.exit(1);}objTrans.addChild(s.getSceneGroup());Transform3D yAxis = new Transform3D();Alpha rotationAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE,0, 0,4000, 0, 0,0, 0, 0);RotationInterpolator rotator =new RotationInterpolator(rotationAlpha, objTrans, yAxis,0.0f, (float) Math.PI*2.0f);rotator.setSchedulingBounds(bounds);objTrans.addChild(rotator);pile();return objRoot;}public Obj1(String args[]) {filename = args[0];setLayout(new BorderLayout());Canvas3D c = new Canvas3D(null);add("Center", c);BranchGroup scene = createSceneGraph(args); //与通常的有不同SimpleUniverse u = new SimpleUniverse(c);u.getViewingPlatform().setNominalViewingTransform();u.addBranchGraph(scene);}public static void main(String[] args) {new MainFrame(new Obj1(args), 400,400);}}//end of Obj1.java程序运行后我们发现,显示的效果不太正确,形体只显示了一部分,我们将在Obj2.java将其效果修正一下。
我们来看程序,为了使JAVA3D能够调用Wavefront的OBJ格式的图形文件,我们需要用到JAVA3D所附带的UTILITY。
程序的头四行import语句就是用来处理Wavefront的OBJ格式的图形文件,第五行的import语句则是打开外部文件之用。
为了调用一个外部文件,我们给出一个定义:private String filename = null;为了使得形体得以看见,我们通过下面的一段程序,设定了一个颜色并将其作为定向光的颜色,确定定向光的影响范围,并使其放入进objRoot。
Color3f light1Color = new Color3f(1.0f, 1.0f, 0.9f);Vector3f light1Direction = new Vector3f(4.0f, -7.0f, -12.0f);BoundingSphere bounds =new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);DirectionalLight light1= new DirectionalLight(light1Color, light1Direction);light1.setInfluencingBounds(bounds);objRoot.addChild(light1);下面这段则是用来调用外部的OBJ文件之用:ObjectFile f = new ObjectFile( );Scene s = null;try {s = f.load(filename);}catch (FileNotFoundException e) {System.err.println(e);System.exit(1);}catch (ParsingErrorException e) {System.err.println(e);System.exit(1);}catch (IncorrectFormatException e) {System.err.println(e);System.exit(1);}objTrans.addChild(s.getSceneGroup());文件调用之后,其它部分的处理和前面的几个例子基本上相同,这里就不介绍了,2. OBJ格式图形的缩小运行前面的程序时,我们发现,显示效果不正确,原因是图形太大,只能看到图形的一部分。
因而我们编写了Obj2.java程序,通过形体所在的坐标系的比例缩小,使形体也相应地缩小。
//Obj2.javaimport com.sun.j3d.loaders.objectfile.ObjectFile;import com.sun.j3d.loaders.ParsingErrorException;import com.sun.j3d.loaders.IncorrectFormatException;import com.sun.j3d.loaders.Scene;import java.io.*;import java.applet.Applet;import java.awt.BorderLayout;import com.sun.j3d.utils.applet.MainFrame;import com.sun.j3d.utils.universe.*;import javax.media.j3d.*;import javax.vecmath.*;public class Obj2 extends Applet {private double creaseAngle = 60.0;private String filename = null;public BranchGroup createSceneGraph(String args[]) {BranchGroup objRoot = new BranchGroup();TransformGroup objScale = new TransformGroup();Transform3D t3d = new Transform3D();t3d.setScale(0.3);objScale.setTransform(t3d);objRoot.addChild(objScale);Color3f light1Color = new Color3f(1.0f, 1.0f, 0.9f);Vector3f light1Direction = new Vector3f(4.0f, -7.0f, -12.0f);BoundingSphere bounds =new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);DirectionalLight light1= new DirectionalLight(light1Color, light1Direction);light1.setInfluencingBounds(bounds);objRoot.addChild(light1);TransformGroup objTrans = new TransformGroup();objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); objScale.addChild(objTrans);int flags = ObjectFile.RESIZE;ObjectFile f = new ObjectFile(flags,(float)(creaseAngle * Math.PI / 180.0));Scene s = null;try {s = f.load(filename);}catch (FileNotFoundException e) {System.err.println(e);System.exit(1);}catch (ParsingErrorException e) {System.err.println(e);System.exit(1);}catch (IncorrectFormatException e) {System.err.println(e);System.exit(1);}objTrans.addChild(s.getSceneGroup());Transform3D yAxis = new Transform3D();Alpha rotationAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE, 0, 0,4000, 0, 0,0, 0, 0);RotationInterpolator rotator =new RotationInterpolator(rotationAlpha, objTrans, yAxis,0.0f, (float) Math.PI*2.0f);rotator.setSchedulingBounds(bounds);objTrans.addChild(rotator);pile();return objRoot;}public Obj2(String args[]) {filename = args[0];setLayout(new BorderLayout());Canvas3D c = new Canvas3D(null);add("Center", c);BranchGroup scene = createSceneGraph(args);SimpleUniverse u = new SimpleUniverse(c);u.getViewingPlatform().setNominalViewingTransform();u.addBranchGraph(scene);}public static void main(String[] args) {new MainFrame(new Obj2(args), 400,400);}}//end of Obj2.java我们发现,和Obj1.java相比,程序增加了下面这段语句,通过这几个语句,使坐标系发生了比例变换,成为了原来大小的0.3倍:TransformGroup objScale = new TransformGroup();Transform3D t3d = new Transform3D();t3d.setScale(0.3);objScale.setTransform(t3d);objRoot.addChild(objScale);并将objRoot.addChild(objTrans);改成了objScale.addChild(objTrans);这表面,程序的场景图中,最根部的objRoot上面是objScale,objScale上面才是objTrans,形体放在objTrans这个BranchGroup中的。