思诚科技 seecen LOGO
咨询热线:0791-87557233
  首页 |   Java EE  
关于思诚
关注官方微信

利用Java 3D技术播放动画之QTJ技术

来源:网络    更新时间:2014-12-3



  在第一部分内容中,我描述了怎样借助Java媒体框架(JMF)的帮助实现在一个Java3D场景中播放动画片断。其实现主要使用了模型-视图-控制器设计模式:

  ·动画屏幕是视图元素,由JMFMovieScreen类描述。

  ·动画是模型部分,由JMFSnapper类所管理。

  ·一个Java3DBehavior类TimeBehavior是控制器,由它完成从动画中的周期性帧检索,然后在屏幕上画出。

  在这篇文章中,我将revisit该动画组件,用QuickTimeforJava(QTJ)来重新实现之。QTJ在QuickTimeAPI之上提供了一个面向对象的Java层,使之有可能实现播放,编辑和创建QuickTime动画;捕获音频与视频;执行2D和3D动画。QuickTime在Mac和Windows上平台都可以使用。关于QTJ的安装,文档和举例的细节信息请参见developer.apple.com/quicktime/qtjava。

  由QTJ来取代JMF设计模式的结果对应用程序影响很小-只有动画类JMFSnapper分离出来,由QuickTimeforJava版本的QTSnapper所代替。

  图1展示了QTJ版本的Movie3D应用程序中的两幅屏幕快照,其中右边的那幅是屏幕从后面看上去的视图。


图1.QTJMovie3D应用程序中的两幅视图
  如果快点回顾一下第一部分中的图1,你会发现基于QTJ的应用程序和JMF版本的实现没有太明显的区别。

  但是,如果细致比较一下这两处执行程序会发现有两个变化:QTJ版本的动画像素化pixelation更明显,且播放速度更慢些。像素化的出现是由于原始的动画被从MPEG格式翻译成QuickTime的MOV格式所致,可以借助于一个更好的转换工具来实现修补。速度问题更为根本性:它与QTSnapper的基本实现有关。

  该文中主要涉及到:

  ·讨论QTSnapper实现中的两种主要方法。一种方法是把动画的每一帧都着色到屏幕上去,另一种方法是基于当前时间选择一帧。后一种方法意味着,可以跳过一些帧,使得动画颤动一点,但是却使动画播放速度加快。

  ·介绍几种简单的帧/秒(FPS)计算方法,我将用之来判断不同实现方式的相对速度的不同,并用来检测跳过的帧。

  我不会再细致地介绍动画屏幕和动画更新行为,因为这些与第一部分中是一致的。

  下面我将详细介绍的是我应用在QTSnapper中的用于从动画中提取帧的QTJ技术。

  1.程序实现中的两幅轮廓图

  下面的图2描述了该应用程序中的场景图。


图2.Movie3D场景图
  该图几乎和第一部分中的一模一样。

  QuickTime动画由QTSnapper类负责装载。动画屏幕由QTMovieScreen创建,它管理一个放置在跳棋盘地板上的Java3D四边形。每隔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类的内部实现变更了一些。

  • 上一篇文章:

  • 下一篇文章:
  •  

    0791-87557233

    重视每个来电 珍惜您的时间
    思诚者开发沙龙
    江西思诚科技有限公司  赣ICP备17006097号  CopyRight©2014 - 2018