基于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.http://www.16sheji8.cn/
[关键词]
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
|
/ \
BG BG
| |
TG TG
| \
Shape ViewPlatform====View====Canvas3D====Screen3D
| \ / \
Ap Ge Viewer Enviorment
BG: BranchGroup 分支节点 http://www.16sheji8.cn/
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.3数据存储方式选择
由于采用3d max的*.3ds作为导入资源, 所以用平面文件存储数据比用数据库更具有灵活性和可扩展性。
用户可以方便的通过复制粘贴,或者指定路径来编辑指定模型的动画。每个模型的动画被存为单独的文件,便于传播和拷贝。
2.4设计环境
采用IDE: Eclipse
环境:Windows XP professional edition, java sdk 1.4.1.2, java3d-1_3_1-windows-i586-opengl-sdk
3、数据结构分析与设计http://www.16sheji8.cn/
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。这个块永远是文件的第一个块。
下面的表就是块树的层次关系,不同的块ID就表明了他们的属性和位置。每一个块都被起了一个名字,这样是为了更便于将其放在源代码中。
MAIN3DS (0x4D4D)
|
+--EDIT3DS (0x3D3D)
| |
| +--EDIT_MATERIAL (0xAFFF)
| | |
. //详见3D max文档
.
|
+--KEYF3DS (0xB000)
|
+--KEYF_UNKNWN01 (0xB00A)
+--............. (0x7001) ( viewport, same as editor )
3.2模型结构拆分(属于功能模块)http://www.16sheji8.cn/