熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java 3D的動畫展示圖(Part1-使用JMF)

2013-11-23 19:18:25  來源: Java核心技術 

  在Java D場景中插入動畫片段使D內容更加有趣充實一段動畫可以在更令人信服的背景下展示例如飄動的雲繁忙的城市街道或者是從窗向外看的效果動畫可以在屏幕效果和游戲效果之間任意轉換
  
  這篇文章被分為兩個部分描寫我怎樣實現一個Java D動畫屏幕效果在這個部分我將說明我怎樣利用JMF(Java Media Framework)特別是在JMF Performance Pack for Windows ve情況下我的另外兩個工具是JSE 和Java D 我將討論另外的使用Quicktime for Java的動畫屏幕版本
  
  圖是應用JMF MovieD在不同時間截取的兩幅截屏右邊截屏是從屏幕後看的效果
  
 

  
MovieD應用截屏

  
  此應用程序中重點
  
  JMF和Java D的集成屏幕以任意尺寸成倍增加在一個應用程序由於屏幕是JavaD的ShapeD類的一個子類因此它可以很容易的統一到各種Java D場景中
  
  程序執行使用ModelViewController設計模式屏幕是一個視頻元素由JMFMovieScreen類描述動畫是一個由JMFSnapper類控制的模型部分一個Java D Behavior類TimeBehavior控制動畫定時定期更新所有JMF編碼都存放在JMFSnapper類可以很方便的測試各種變化這篇文章的第二部分JMFSnapper由QuickTime for Java版本中的QTSnapper取代
  
  Java D 的使用將會使動畫的播放速度毫無困難的上升到幀/秒
  
  使用JMF出現問題的討論問題是我首選解決方案將不會工作JMF有可能變為一個巨大的API但在其內部仍有一些程序沒有及時運行
  
   我坐在山上
  
  事實上我正坐在一個冰冷的辦公室我真正的意思是說這篇文章建立在大量Java D和JMF背景知識之上
  
  我將不會細致地解釋Java D的基礎知識因為它們都可以在OReilly文章Killer Game Programming in Java(以下簡稱KGPJ)中找到例如場景效果圖是其第章中的輕微改良CheckersD的版本實例我再生了這些編碼以生成底版藍天和燈光
  
  假如你不想買這本書沒關系所有篇章的初稿和所有編碼都可以在此書的站點查閱
  
  在此文章中我將會解釋我用來從動畫中抽取幀的JMF技術我將不會討論流媒體或者編碼轉換
  
   應用簡述
  
  動畫由JMFSnapper類加載播放並且不斷的循環播放直到被停止
  
  JMFMovieScreen生成動畫屏幕並在底版上控制Java D四邊形
  
  圖顯示這些類的應用(該場景圖說明場景中Java D節點怎樣連接在一起)
  
 

  
MovieD場景圖

  
  圖種的很多細節可以被忽略此圖KGPJ章中的得CheckersD實例有很多相似之處 只有特殊動畫的節點是新的
  
  由於節點關系JMFMovieScreen和TimeBehavior對象以三角形表示JMFSnapper對象不屬於這張圖但由JMFMovieScreen調用
  
  每毫秒TimeBehavior對象調用JMFMovieScreen類中的nextFrame()方法接下來調用JMFSnapper中的getFrame()方法獲取動畫中當前播放的幀由JMFMovieScreen控制成像
  
  TimeBehavior是Java D的Behavior類的子類它是Java D應用的計時器它與KGPJ章中的D sprites實例中的TimeBehavior類十分相似
  
  觀察應用過程的另一種方式就是察看它的UML類圖表給出類中的公共方法被顯示
  
 

  
MovieD類圖表

  
  MovieD的子類JFrameWrapMovieD是JPanel的一個子類展示了WrapMovieD如何構建場景圖和將其譯成應用的JPanel他使用CheckerFloor 和ColouredTiles類構建底版
  
  JMFMovieScreen創建動畫屏幕將其加入場景中通過創建一個JMFSnapper對象開始動畫TimeBehavior每毫秒調用JMFMovieScreen中的nextFrame()方法 nextFrame()調用JMFSnapper中的getFrame()得到當前幀
  
  這個例子中的所有編碼此文章的早期版本可以在KGPJ網點查詢
  
   准備動畫
  
  動畫它的屏幕和更新屏幕的TimeBehavior對象都是由WrapMovieD中的addMovieScreen()方法創立
  
  // globalsprivate BranchGroup sceneBG;private JMFMovieScreen ms;
  // the movie screenprivate TimeBehavior timer;
  // to update screenprivate void addMovieScreen(String fnm){ // put the movie in fnm onto a movie screen ms = new JMFMovieScreen(      new Pointf(f ) f fnm);
  sceneBGaddChild(ms);
  // set up the timer for animating the movie timer = new TimeBehavior( ms);
  // update movie every ms (== frames/sec) timersetSchedulingBounds(bounds);
  sceneBGaddChild(timer);}
  
  兩個Java D addChild()方法調用JMFMovieScreen和TimeBehavior節點間的連接setSchedulingBounds()激活TimeBehavior節點
  
   創建動畫屏幕
  
  JMFMovieScreen是Java D的ShapeD類的一個子類所以必須仔細說明它的外形的幾何形狀和外觀
  
  幾何形狀是指動畫圖像的四個邊尺寸上成比例它的最大尺寸(高 寬)必須向構造器仔細說明這個四方形是垂直的朝向Z軸正方向可以在底版的任何位置被定位
  
  四方形外觀是雙面允許從前或後觀看動畫結構是用雙線性插值可以降低動畫圖像的像素化
  
  大多數的功能是從KGPJ章中的FPS(firstperson shooter)實例中的ImageCsSeries類拷貝而來 ImageCsSeries在一個區域中顯示一系列的GIF圖片 為了簡短起見我僅描述了JMFMovieScreen與ImageCsSeries的不同特征
  
  高效顯示圖像
  
  動畫中的一個幀被轉換結構擴大四倍分為兩個步驟第一步 提供的BufferedImage傳給Java D的ImageComponentD對象然後傳給Java D TextureD
  
  區域的圖像更新非常快每秒更新要求結構更新因此結構有效率的更新非常的重要這種高效率在利用BufferedImage和ImageComponentD對象進行格式化的情況下是可能的
  
  JMFMovieScreen使用的ImageComponentD對象以以下方式聲明
  
  ImageComponentD ic = new ImageComponentD(    ImageComponentDFORMAT_RGB    FORMAT_SIZE FORMAT_SIZE true true);
  
  構造器剩余兩個需要說明的討論點是它使用by referenceYup模式這些模式降低了存儲結構圖像的內存大小因為Java D避免將圖像從應用空間拷貝到圖形內存
  
  在Windows OS環境下使用OpenGL作為Java D優先圖像引擎ImageComponentD格式應是ImageComponentDFORMAT_RGBBufferedImage格式應是BufferedImageTYPE_BYTE_BGRBufferedImage格式在JMFSnapper中確定
  
  此項技術的更多細節可以在中查詢
  
  將紋理加進區域
  
  通常在一個區域中確定一幅圖像的方法是將圖像的坐下角連接到區域的左下角然後逆時針連接剩余的幾個角說明這種方法
  
 

  
圖像與區域之間的標准連接

  
  圖像坐標區間在X Y軸的 之間Y軸正方向例如圖像左下點坐標為(右上點為(
  
  當Yup模式使用圖像坐標Y軸翻轉負方向意味著()代表圖像左上點)指向右下
  
  當Yup模式建立圖像坐標必須分配給區域中不同點以便獲得圖像的相同定位顯示了最新配置
  

  
Yup模式使用時圖像與區域之間的連接

  
  連接區域點與圖像定位的JMFMovieScreen編碼是
  
  TexCoordf q = new TexCoordf();
  qset(f f);
  planesetTextureCoordinate( q);
  // () tex coord > top left quad point (p)qset(f f);
  planesetTextureCoordinate( q);
  // () > top right (p)qset(f f);
  planesetTextureCoordinate( q);
  // () > bottom right (p)qset(f f);
  planesetTextureCoordinate( q);
  // () > bottom left (p)
  
  PLANE對象指代區域
  
  更新圖像
  
  以上所講TimeBehavior是被設置用來被毫秒調用JMFMovieScreen的nextFrame()方法nextFrame()調用JMFSnapper對象中的getFrame()方法獲得被看作BufferedImage對象的當前動畫幀指派給一個mageComponentD對象然後傳給區域圖像nextFrame()是
  
  // globalsprivate TextureD texture;
  // used by the quadprivate ImageComponentD ic;
  private JMFSnapper snapper;
  // to take snaps of the movieprivate boolean isStopped = false;
  // is the movie stopped?public void nextFrame(){ if (isStopped)  // movie has been stopped  return;  BufferedImage im = snappergetFrame();
  // get current frame if (im != null) {
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26618.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.