计算机毕业设计99基于java3D的模型动作引擎Word文档格式.docx
- 文档编号:13563246
- 上传时间:2022-10-11
- 格式:DOCX
- 页数:17
- 大小:234.42KB
计算机毕业设计99基于java3D的模型动作引擎Word文档格式.docx
《计算机毕业设计99基于java3D的模型动作引擎Word文档格式.docx》由会员分享,可在线阅读,更多相关《计算机毕业设计99基于java3D的模型动作引擎Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
在3D愈来愈普及的情况下,了解并掌握相关知识已经成为从业者的当务之急。
1.2开发工具选择
目前开发三维图形有几种工具:
windows上的directx,支持多平台的openGL。
论资源,openGL和directx都有很多的可参考编程实例可以参考。
其中directx由于有比较快的更新速度,集成程度比openGL高。
OpenGL由于是硬件接口,比directx的硬件映射模式速度略高。
据我观察,directx的普及率比openGL略高。
可以说两者不相伯仲,可以任选其一。
我选择用java开发,因为有一个系统的3D程序设计结构有利于以后向其他语言转变。
而java的系统化正是他的优点。
1.3可行性分析
现在用java开发3d游戏有两种途径:
/1:
java3D.这里面还分基于openGL和基于directx两种。
/2:
jogl。
也就是java+openGL的缩写
java3d的结构继承了java的严谨。
条理性趋近于完美。
其结构如下:
VirtualUniverse
|
Locale
/\
BGBG
||
TGTG
|\
ShapeViewPlatform====View====Canvas3D====Screen3D
|\/\
ApGeViewerEnviorment
BG:
BranchGroup分支节点
TG:
TransformGroup变换节点,可以用变换矩阵控制
Ap:
Appearance物体外观数据
Ge:
Geometry物体形状数据
效率问题:
java3D最大的问题就在于效率,实现同样的东西,FPS远不及用VC+D3D实现的高。
这就是jogl产生的原因。
缺陷:
动态加载就很成问题。
1.4工程定位及概念设计
我选择制作模型动画引擎,并选择最著名的模型制作软件3DMax制作出来的模型(*.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.3数据存储方式选择
由于采用3dmax的*.3ds作为导入资源,所以用平面文件存储数据比用数据库更具有灵活性和可扩展性。
用户可以方便的通过复制粘贴,或者指定路径来编辑指定模型的动画。
每个模型的动画被存为单独的文件,便于传播和拷贝。
2.4设计环境
采用IDE:
Eclipse
环境:
WindowsXPprofessionaledition,javasdk1.4.1.2,java3d-1_3_1-windows-i586-opengl-sdk
3、数据结构分析与设计
3.1导入数据结构分析(属于IO模块)
3ds文件数据是由块(chunks)组成的。
块描述了紧接着的数据的信息,和数据的组成,以及数据块的ID和下一个块的位置。
如果有不明数据块,就忽略他。
下一个块的指针在这个不明块的开始就有说明。
3ds文件的二进制信息使用非常特殊的方式写的,也就是汇编方式,与正常的高位和地位正好相反。
比如:
4A5C,那么5c是高位,4A是地位。
如果一个长整数为:
4A5C3B8F,那么5C4A是低位,8F3B是高位。
对于数据块,被定义为:
startendsizename
012ChunkID
254Pointertonextchunkrelativetotheplacewhere
ChunkIDis,inotherwordsthelengthofthechunk
块有一个用ID表明的层次关系。
3DS文件的主块ID是4D4DH。
这个块永远是文件的第一个块。
下面的表就是块树的层次关系,不同的块ID就表明了他们的属性和位置。
每一个块都被起了一个名字,这样是为了更便于将其放在源代码中。
MAIN3DS(0x4D4D)
|
+--EDIT3DS(0x3D3D)
||
|+--EDIT_MATERIAL(0xAFFF)
|||
.//详见3Dmax文档
.
+--KEYF3DS(0xB000)
+--KEYF_UNKNWN01(0xB00A)
+--.............(0x7001)(viewport,sameaseditor)
3.2模型结构拆分(属于功能模块)
在导入3ds模型的时候形成了以整体模型为根节点的BranchGroup,其模型的树状结构如下:
TG整体模型
|
BG
|\\
BGBG.....
|\
TGTG
ShapeShape......这些是模型最小分割
GeoAp
在java树中,我们可以用父节点枚举子节点。
利用反射原理,将整个的模型分割成最小的块。
下面的ModelCutter类用来分割模型。
publicclassModelCutter
3.3帧结构设计(属于对象模块)
对于模型的每一个最小细分,一个帧应该记录这个最小细分的三维位置向量,三维旋转量,和三维比例。
除了这些,帧还应该有自己在整个动画里面的序号,指向前一个帧和后一个帧的指针。
作为辅助,应该加上toString函数,这样随时可以获取当前帧的信息。
最后提供了一个方便的构造函数,可以便捷的将输入帧作为上一帧。
publicclassAFrameimplementsSerializable
3.4动画结构*.ani的设计(IO模块)
有两个问题在这里需要讨论:
第一个是保存什么的讨论,在这里有两个选择,保存每个帧,或者保存关键帧。
前者保存文件比较大,读取以后占用内存也比较大,但是动画播放速度快一点。
后者保存文件非常小,占用内存相对小,动画播放的时候需要动态插值,速度相对下降。
在这里我选择了只保存关键帧,因为这样动画文件很小,以后可以便于和3ds文件捆绑。
第二个问题是保存方式。
手工保存所有的帧的数据没有任何难度,但这个方法很费时间,无法利用JavaSerializationApi的复用能力。
这个API可以进行大量基础工作。
我使用JavaSerializationAPI来保存存储在hashtable中的frame组。
JavaSerializationAPI的核心功能是把对象变成字节流,把字节流变成对象,分别称为序列化(Serialization)和反序列化(Deserialization)。
运行时非null的引用字段要序列化时,要求引用所指的对象也实现Serializable接口。
这个规则递归采用。
另一方面,任何类声明引用其他对象时要经过认真分析确定这个类能否声明可序列化。
类声明任何引用字段都要一一检查引用的对象是否可以序列化。
在这个工程里面,帧结构是可序列化的:
publicclassAFrameimplementsSerializable然后利用java的serializationAPI写出*.ani动画文件的io类如下:
publicclassFrameIO{
publicstaticvoidsaveObj(Objectobj,Stringfilename){//存动画文件
//省略
}
publicstaticObjectloadObj(Stringfilename){//读取动画文件
//省略
}
4、GUI设计与反馈控制
插入图片:
4.1Swing组件概念
Swing的优点:
1、Swing有一套丰富的、更方便的用
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 毕业设计 99 基于 java3D 模型 动作 引擎