天极软件专题专区精选
Google专区
POPO专区
QQ专区
Flash MX 视频教程
Photoshop视频教程
网页设计视频教程
PowerPoint动画演示教程
Excel动画教程集
Word动画演示教程
特洛伊木马专区
黑客知识教程专区
注册表应用专区
Windows API开发专区
网络编程专区
VB数据库编程专区 在第一部分内容中,我描述了怎样借助Java 媒体框架(JMF)的帮助实现在一个Java 3D场景中播放动画片断。其实现主要使用了模型-视图-控制器设计模式:
· 动画屏幕是视图元素,由JMFMovieScreen类描述。
· 动画是模型部分,由JMFSnapper类所管理。
· 一个Java 3D Behavior类TimeBehavior是控制器,由它完成从动画中的周期性帧检索,然后在屏幕上画出。
在这篇文章中,我将revisit该动画组件,用 QuickTime for Java (QTJ)来重新实现之。QTJ在QuickTime API之上提供了一个面向对象的Java 层,使之有可能实现播放,编辑和创建QuickTime 动画;捕获音频与视频;执行2D和3D动画。QuickTime在Mac 和Windows上平台都可以使用。关于QTJ的安装,文档和举例的细节信息请参见developer.apple.com/quicktime/qtjava。
由QTJ 来取代JMF 设计模式的结果对应用程序影响很小-只有动画类JMFSnapper分离出来,由QuickTime for Java版本的QTSnapper所代替。
图 1展示了QTJ 版本的Movie3D应用程序中的两幅屏幕快照,其中右边的那幅是屏幕从后面看上去的视图。
图 1.QTJ Movie3D应用程序中的两幅视图 如果快点回顾一下第一部分中的图1,你会发现基于QTJ的应用程序和JMF 版本的实现没有太明显的区别。
但是,如果细致比较一下这两处执行程序会发现有两个变化:QTJ版本的动画像素化pixelation 更明显,且播放速度更慢些。像素化的出现是由于原始的动画被从MPEG 格式翻译成QuickTime的MOV格式所致,可以借助于一个更好的转换工具来实现修补。速度问题更为根本性:它与QTSnapper的基本实现有关。
该文中主要涉及到:
·讨论QTSnapper实现中的两种主要方法。一种方法是把动画的每一帧都着色到屏幕上去,另一种方法是基于当前时间选择一帧。 后一种方法意味着,可以跳过一些帧,使得动画颤动一点,但是却使动画播放速度加快。
·介绍几种简单的帧/秒(FPS)计算方法,我将用之来判断不同实现方式的相对速度的不同,并用来检测跳过的帧。
我不会再细致地介绍动画屏幕和动画更新行为,因为这些与第一部分中是一致的。
下面我将详细介绍的是我应用在QTSnapper中的用于从动画中提取帧的QTJ技术。
1. 程序实现中的两幅轮廓图
下面的图2描述了该应用程序中的场景图。
图 2. Movie3D场景图 该图几乎和第一部分中的一模一样。
QuickTime动画由QTSnapper类负责装载。动画屏幕由QTMovieScreen创建,它管理一个放置在跳棋盘地板上的Java 3D四边形。每隔40毫秒,TimeBehavior 对象调用QTMovieScreen中的nextFrame()方法一次,该方法调用中QTSnapper 的getFrame()方法来取得动画中的一帧,该帧最后被放置到由QTMovieScreen管理的四边形上。
JMFSnapper和QTSnapper之间有一个重要的不同。JMFSnapper返回当前正播放动画的当前帧,而QTSnapper依赖于一个递增的索引值返回动画中的当前帧。
例如,当getFrame()在JMFSnapper中被反复调用时,它可以检索帧1,3,6,9,11,等等,具体依赖于调用的方法和动画的播放速度。当在QTSnapper中调用getFrame()时,它将返回帧1,2,3,4,等等。
下面的图3描述了该应用程序的UML类图,其中仅显示了类的公共方法。
图 3. Movie3D类图 除了动画屏幕QTMovieScreen类和动画QTSnapper类名字的区别外,这里的应用程序类继承图与第一部分中的没有区别。事实上,只有Snapper类的内部实现变更了一些。
把应用程序从JMF Movie3D版本迁移到QTJ版本要求代替Snapper类。另外,还需要把动画屏幕类中的两行代码改变一下,其中声明了Snapper 类并被实例化:
//全局变量定义 private QTSnapper snapper; //以前是JMFSnapper //在构造器中以fnm方式装入动画 snapper = new QTSnapper(fnm); 这两处变化是把JMFMovieScreen 改名为QTMovieScreen的唯一原因。
所有该示例的代码以及本文的一个早期版本,都能在KGPJ website处找到。
2. 一部帧到帧Frame-By-Frame 的动画
理解了QTSnapper的内部工作机理,有助于对QuickTime动画的结构有一个基本了解。每个动画可能由多个音频和视频轨道合成,而在时间上相重叠。下图4展示了这种基本思想。
图 4.一个QuickTime动画的内部结构 每个轨道管理自己的数据,如它包含的媒体的类型和媒体本身。该媒体容器具有它自己的数据结构,包括持续时间和播放速率(也就是,每秒要显示多少个样本)。这里的媒体实际上是一系列的样本(或者帧),第一个样本从时间0开始(with respect to media time)。样本被索引化了,如第一个样本在位置1处(而不是0)。
简化后的QuickTime轨道和媒体结构如下图5所示。
图 5. 一个QuickTime轨道和媒体的内部结构 要想更全面的了解,请参考QuickTime教程的动画部分。
共2页。 1 2 8 :
|