大学毕业论文设计 基于java3D的模型动作引擎 - 图文

2019-07-13 17:25

吉林大学经济信息学院本科毕业论文

基于java3D的模型动作引擎

学院: 学生姓名: 指导教师:

[中文摘要]

本工程着重对既有三维模型的复用,和对模型动画的制作。现在业界很少有基于java3D的动画引擎,本工程也是对java3d在动画方面的创新。工程围绕对3D Max文件格式的解析,动画帧的设计,动画文件的存储,动画的驱动,以及用户界面的设计做了详尽的说明,并提供了可运行的范例代码。在工程的尾声部分,着重说明了代码的重构过程和调试方式。使代码更加精简,易读。

[英文摘要]

This project, to already having the replying and using of a threedimensional

model emphatically, and the making of the model animation. Seldom there is a engine of animation based on java3D in the industry now, this project is innovation in animation to java3d too. The project centres on the analysis of 3D Max file layout, the design of the animation frame, the memory of the animation file correctly, drive of animation, and design , user of interface make exhaustive explanation, have offered the example code that can be operated. In some of coda of the project , have stated constructing the course and debugging the way again of the code emphatically. Make the code simplified further, legible.

[关键词]

Java3D、GUI、Swing、GUI、重构

1、概述

1.1需求分析

在3D愈来愈普及的情况下,了解并掌握相关知识已经成为从业者的当务之急。

1.2开发工具选择

目前开发三维图形有几种工具:windows上的direct x ,支持多平台的openGL。论资源,openGL和direct x都有很多的可参考编程实例可以参考。其中direct x由于有比较快的更新速度,集成程度比openGL高。OpenGL由于是硬件接口,比directx的硬件映射模式速度略高。据我观察,direct x的普及率比openGL略高。可以说两者不相伯仲,可以任选其一。

我选择用java开发,因为有一个系统的3D程序设计结构有利于以后向其他语言转变。而java的系统化正是他的优点。

1.3可行性分析

现在用java开发3d游戏有两种途径:

/1:java3D. 这里面还分基于openGL和基于directx两种。 /2:jogl。 也就是java+openGL的缩写

java3d的结构继承了java的严谨。条理性趋近于完美。其结构如下: VirtualUniverse | | Locale |

1

吉林大学经济信息学院本科毕业论文

/ \\ BG BG | | TG TG | \\

Shape ViewPlatform====View====Canvas3D====Screen3D | \\ / \\

Ap Ge Viewer Enviorment

BG: BranchGroup 分支节点

TG: TransformGroup 变换节点,可以用变换矩阵控制 Ap:Appearance 物体外观数据 Ge: Geometry 物体形状数据

效率问题:java3D最大的问题就在于效率,实现同样的东西,FPS远不及用VC+D3D实现的高。

这就是jogl产生的原因。 缺陷:

动态加载就很成问题。

1.4工程定位及概念设计

我选择制作模型动画引擎,并选择最著名的模型制作软件3D Max制作出来的模型(*.3ds)作为我的引擎导入模型格式。这不仅因为3ds模型逼真,而且这种模型在网上有很多共享资源可以使用。

2、基于java的模型动作引擎的选定和系统总体设计

有人说种纯oo的语言:java,c#在程序设计上强制oo,不仅仅带来了条理性和可靠性,在可重用方面更是其他语言不能比拟的。

2.1工程的划分

主模块/驱动模块:AnimationEditor.java

功能:一切模型和视角动作的驱动(用主循环实现),程序入口(main方法和setup方法),GUI部分及响应(Swing类库和Listener的使用)。 IO模块:ModelLoader.java,FrameIO.java,LocalDAO.java

功能:负责模型的导入(3ds格式的解析,形成java3D格式模型), 动画的导入和导出(采用对象导入导出技术,对动作组进行反射压栈),本地数据库访问。 对象模块:Aframe.java,MoveMatrix.java, ModelStruc.java

功能:帧结构,动画结构,模型结构

功能模块:FrameAccesser.java, FramePlayer.java, ModelCutter.java,

功能:帧结构访问代理类,动画播放类(插值器),模型切分类(反射机制实现) 辅助模块:Axis.java, Land.java, srcNameCheck.java

功能: 坐标轴, 三维地面参考, 源路径检测。

控制模块:GameControl.java, PickHighLightBehavior.java

功能:编辑器视图控制,被选择部分模型高亮显示。 资源模块:*.3ds, *.ani

功能:模型资源,动画资源

2.2结构流程图

2

吉林大学经济信息学院本科毕业论文

2.3数据存储方式选择

由于采用3d max的*.3ds作为导入资源, 所以用平面文件存储数据比用数据库更具有灵活性和可扩展性。

用户可以方便的通过复制粘贴,或者指定路径来编辑指定模型的动画。每个模型的动画被存为单独的文件,便于传播和拷贝。

2.4设计环境

采用IDE: Eclipse

环境:Windows XP professional java3d-1_3_1-windows-i586-opengl-sdk

edition,

java

sdk

1.4.1.2,

3、数据结构分析与设计

3.1导入数据结构分析(属于IO模块)

3ds文件数据是由块(chunks)组成的。 块描述了紧接着的数据的信息,和数据的

组成,以及数据块的ID和下一个块的位置。如果有不明数据块,就忽略他。下一个块的指针在这个不明块的开始就有说明。3ds文件的二进制信息使用非常特殊的方式写的,也就是汇编方式,与正常的高位和地位正好相反。比如:4A 5C, 那么5c是高位, 4A是地位。 如果一个长整数为:4A 5C 3B 8F,那么5C4A是低位,8F3B是高位。对于数据块,被定义为:

start end size name 0 1 2 Chunk ID

2 5 4 Pointer to next chunk relative to the place where Chunk ID is, in other words the length of the chunk

块有一个用ID表明的层次关系。3DS文件的主块ID是4D4DH。这个块永远是文件的第一个块。

3

吉林大学经济信息学院本科毕业论文

下面的表就是块树的层次关系,不同的块ID就表明了他们的属性和位置。每一个块都被起了一个名字,这样是为了更便于将其放在源代码中。 MAIN3DS (0x4D4D) |

+--EDIT3DS (0x3D3D) | |

| +--EDIT_MATERIAL (0xAFFF) | | | . //详见3D max文档 . |

+--KEYF3DS (0xB000) |

+--KEYF_UNKNWN01 (0xB00A)

+--............. (0x7001) ( viewport, same as editor )

3.2模型结构拆分(属于功能模块)

在导入3ds模型的时候形成了以整体模型为根节点的BranchGroup,其模型的树状结构如下:

TG 整体模型 | BG

| \\ \\

BG BG ..... | \\ TG TG | \\

Shape Shape...... 这些是模型最小分割 | \\ Geo Ap

在java树中,我们可以用父节点枚举子节点。 利用反射原理,将整个的模型分割成最小的块。

下面的ModelCutter类用来分割模型。 public class ModelCutter

3.3帧结构设计(属于对象模块)

对于模型的每一个最小细分,一个帧应该记录这个最小细分的三维位置向量,三维旋转量,和三维比例。除了这些,帧还应该有自己在整个动画里面的序号,指向前一个帧和后一个帧的指针。作为辅助,应该加上toString函数,这样随时可以获取当前帧的信息。

最后提供了一个方便的构造函数,可以便捷的将输入帧作为上一帧。 public class AFrame implements Serializable

3.4动画结构*.ani的设计(IO模块)

有两个问题在这里需要讨论:

第一个是保存什么的讨论,在这里有两个选择,保存每个帧,或者保存关键帧。前

4

吉林大学经济信息学院本科毕业论文

者保存文件比较大,读取以后占用内存也比较大,但是动画播放速度快一点。后者保存文件非常小,占用内存相对小,动画播放的时候需要动态插值,速度相对下降。 在这里我选择了只保存关键帧,因为这样动画文件很小,以后可以便于和3ds文件捆绑。

第二个问题是保存方式。

手工保存所有的帧的数据没有任何难度,但这个方法很费时间,无法利用Java Serialization Api的复用能力。这个API可以进行大量基础工作。

我使用Java Serialization API来保存存储在hash table中的frame组。

Java Serialization API的核心功能是把对象变成字节流,把字节流变成对象,分别称为序列化(Serialization)和反序列化(Deserialization)。

运行时非null的引用字段要序列化时,要求引用所指的对象也实现Serializable接口。这个规则递归采用。

另一方面,任何类声明引用其他对象时要经过认真分析确定这个类能否声明可序列化。类声明任何引用字段都要一一检查引用的对象是否可以序列化。

在这个工程里面,帧结构是可序列化的:public class AFrame implements Serializable然后利用java的serialization API写出 *.ani动画文件的io类如下: public class FrameIO { public static void saveObj(Object obj,String filename){// 存动画文件 // 省略 } public static Object loadObj(String filename){//读取动画文件 // 省略 } }

4、GUI设计与反馈控制

插入图片:

5


大学毕业论文设计 基于java3D的模型动作引擎 - 图文.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:湖北省道路交通事故车物损失价格鉴定操作规程

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: