岁月联盟 · 中国技术网 本站主页 | 安全认证 | 用户服务 | 技术论坛
新闻快报 | 新手学堂 | 黑客特区 | 程序语言 | 数 据 库 | 防 火 墙 | 路由交换 | 系统集成 | 服 务 器 | 存储备份 | 考试认证
Windows | Linux | Java | 协议分析 | 问题解答 | 进程大全 | 网页设计 | 多 媒 体 | 图库资料 | 软件下载 | 站内下载
  您现在的位置: 岁月联盟 >> Java >> 核心技术 >> JavaMedia >> Java正文
JAVA 3D动画展示图(Part2,使用QuickTime)
作者:未知 文章来源:本站整理 点击数: 更新时间:2007-7-22 17:29:58

  在这一系列的第一部分中,我描述了在JMF(JAVA媒体帧工作器 下同)的帮助下,怎样将一部电影片断插入JAVA 3D场景中。这个执行过程使用Model-View-Controller设计模式。
  
  。动画屏幕是由JMFMovieScreen类表示的视觉元素
  
  。动画模型部分由JMFSnapper类控制
  
  。java 3D行为类,TimeBehavior,是动画中引起帧周期性恢复的控制类
  
  在这篇文章中,我将使用QTJ(QuickTime for Java 下同)再次解析动画成份。QTJ提供一个覆盖QuickTime API的依赖对象的java,使之可以展示,编辑和创建QuickTime动画;捕获视频 音频;展示2D和3D动画。QuickTime可用于Mac和Windows系统。关于QTJ的安装.文档和实例细节可在developer.apple.com/quicktime/qtjava查询。
  
  由设计模式作出的推论,只在动画类JMFSnapper被QTSnapper取代时,QTJ取代JMF在应用中有微小的作用。
  
  图1:两幅QTJ情况下的3D动画截屏,右边图片采取显示屏背面视角
  
 

  从图1大致看出,QTJ-based 和JMF成像效果没有明显区别。
  
  然而,通过更仔细得比较可以看出有两个变化:QTJ动画有轻微的被像素化,播放的更慢。像素化(像素化是对内部像素对于观看者易见的数字图像的显示。当一些用于普通的计算机显示的低分辨率图像被投射到一个大的显示器上,每一个像素都会变得单独可见,这种不常发生的现象就叫做像素化。)是由于原始动画从MPEG转换为QuickTime's MOV格式引起的,它可由更好的转换方法矫正。速度问题更基础:它与QTSnapper的潜在执行有关。
  
  这篇文章的重点为?
  
  。执行QTSnapper的两种主要方法的讨论.一种方法是将动画里的每一帧都提出来显示在屏幕上。另一种方法依靠当前的时间提出帧.第二种方法意味着可能将会遗漏部分帧,画面颤抖,但遗漏 可以使播放更快
  
  。一些简单的FPS(frame-per-second)度量器的介绍.我将用它们这两种方法的相对速度,探测遗漏帧数
  
  1. 此山非彼山
  
  与第一部分一样,编码将利用两个大型的API,在这里没有时间介绍利用的细节了。我将再次使用java 3D,但API媒体将由JMF转变为QTJ。
  
  在我的O'Reilly book, Killer Game Programming in Java (KGPJ)中有大量关于java 3D的信息,还有图1的原码。
  
  我将不会解释动画屏幕和动画更新行为,因为它们与第一部分相同。
  
  在QTJ技术中我将会使用QTSnapper从动画中提取帧
  
  2.应用的两种看法
  
 

  
图2:应用流程图

  
  此图表与第一篇文章中的几乎相同
  
  QuickTime动画由QTSnapper类加载,动画屏幕由QTMovieScreen创建.每40毫秒,TimeBehavior对象调用QTMovieScreen中的nextFrame()方法.然后调用QTSnapper中的getFrame()方法获取动画中的一个帧.依次循环.
  
  JMFSnapper与QTSnapper之间有一个很重要的不同.JMFSnapper返回一个帧,这个帧是动画播放时的当前帧.而QTSnapper返回动画中的帧根据递增的索引.
  
  例如.当getFrame()方法在JMFSnapper被反复调用时,也许会重新得到帧1,3,6,9等等,它是由方法何时被调用与动画播放速度决定的.当getFrame()方法在QTSnapper被调用,它将会返回帧1,2,3,4等等.
  
 

  
图3:UML类的应用图表,仅列出公共方法.

  
  此图表除了动画屏幕名和动画类名(QTMovieScreen 和 QTSnapper)外,与第一篇文章的相同.事实上,只有Snapper类的内部执行被改变.
  
  JMF Movie3D应用程序和QTJ-based版本之间的改动需要Snapper被重写.
  
   // global variableprivate QTSnapper snapper;  // was JMFSnapper// in the constructor, load the movie in fnmsnapper = new QTSnapper(fnm);
  
  这两处改动是由于须将JMFMovieScreen重命名为QTMovieScreen.
  
  这个例子中的所有代码,和文章的早期版本,可以在KGPJ website查询到.
  
  3.一帧一帧的动画
  
  理解QTSnapper的内在工作机理,可以帮助我们对QuickTime动画构造有一个大致的认识.每一幅动画可以理解为视频轨迹和音频轨迹在相同时间上的重叠.图4是这种思想的图示
  
 

  
图4:QuickTime动画的内部构造机理

  
  每个轨迹控制着其自身数据,例如它包含的媒体类型和媒体本身.媒体容器(media container)有它自己的数据结构,包括它的持续时间和播放率(每秒播放抽样数).媒体是由一组抽样(或帧)组成,第一个抽样时间为0(与媒体时间有关).抽样是被变址的,第一个抽样在1位置(非0).
  
  图5大致描述了QuickTime的轨迹和媒体结构
  
 

  
图5:QuickTime轨迹和媒体的内在构造机理

  
  想要得到更多信息,请查询QuickTime指南的movie section
  
  打开动画视频媒体
  
  QTSnapper构造器打开动画:
  
  // globalsprivate boolean isSessionOpen = false;private OpenMovieFile movieFile;private Movie movie;// in the constructor,// start a QuickTime sessionQTSession.open();isSessionOpen = true;// open the moviemovieFile =  OpenMovieFile.asRead( new QTFile(fnm) );movie = Movie.fromFile(movieFile);
  
  在QuickTime使用之前调用QTSession.open()方法将其

[1] [2] 下一页


  • 上一个Java:
  • 下一个Java:
  •  
    热门文章
    推荐文章
    关于我们 | 发展历程 | 网站地图 | 广告服务 | 招贤纳士 | 战略合作 | 友情链接 | 著作声明 | 联系我们
    Copyright © 2002-2007 SYUE All rights reserved.
    E_mail:Admin@Syue.Com 皖ICP备05004589号
    未经授权禁止转载、摘编、复制或建立镜像.如有违反,追究法律责任.
    传世私服 传奇世界私服 天龙八部私服 bet365 传世私服 天龙八部私服 热血江湖私服 英雄合击传奇私服 热血江湖私服 bet365 bet365