?? 利用java 3d技術播放動畫之jmf技術 - 網易學院·教程.txt
字號:
利用Java 3D技術播放動畫之JMF技術 - 網易學院·教程通行證:用戶名 密碼 首頁 - 新聞 - 免費郵箱 - 短信 - POPO -
相冊 - 搜索 - 交友 - 拍賣
新聞 | 體育 | 財經 | 娛樂 | 商業 | 科技 | 汽車 | 數碼 | 女人 | 旅游 | 教育 | 文化 | 廣州 | 軍事 | 部落
評論 | NBA | 明星 | 證券 | 基金 | 探索 | 房產 | 手機 | 兩性 | 健康 | 培訓 | 電影 | 游戲 | 拍賣 | 論壇
科技首頁重磅報道專題IT茶館技術趨勢科學學院游戲病毒下載論壇
首頁 工具軟件 辦公軟件操作系統 圖形圖像網站建設 編程開發多媒體 網絡 安全 病毒 專題 視頻中心 藝術設計教授視點 軟件新聞 病毒安全新聞 論壇
滾動更新 視覺玩家征稿 熱門搜索關鍵字: WEB 學院
你現在的位置是: 網易 > 網易科技 > 網易學院·教程 利用Java 3D技術播放動畫之JMF技術
http://tech.163.com/school · 2005-10-17 19:04:31 · 來源: 天極網 第1頁:利用Java
3D技術播放動畫之JMF技術 第2頁:利用Java 3D技術播放動畫之JMF技術 第3頁:利用Java 3D技術播放動畫之JMF技術
把紋理鏈接到四邊形上
把紋理圖像平鋪到一個四邊形上的常用方法是,把紋理的左下角鏈接到四邊形的左下角,并以反時針方向指定其它鏈接。這種方法顯示在圖4中。
圖 4.紋理與四邊形間的標準鏈接
紋理坐標的范圍是0-1,沿著x軸和y軸,且y軸方向向上。例如,紋理左下角使用坐標(0,0),則右上角為(1,1)。
當使用"Y-up"方式時,y軸的紋理坐標是顛倒的,即指向下方。這就是說,坐標(0,0)對應紋理的左上角,而(1,1)對應紋理的右下角。
在使用"Y-up"方式情況下,紋理坐標一定要賦給四邊形的不同點以取得圖像的相同的方向。這種新的配置顯示在圖5中。
圖 5. 當使用"Y-up"方式時的紋理與四邊形的鏈接
在JMFMovieScreen中,實現把四邊形頂點與紋理坐標相鏈接的代碼如下:
TexCoord2f q = new TexCoord2f();
q.set(0.0f, 0.0f);
plane.setTextureCoordinate(0, 3, q);
//紋理坐標(0,0)-->四邊形左上點(p3)
q.set(1.0f, 0.0f);
plane.setTextureCoordinate(0, 2, q);
// (1,0) -->右上(p2)
q.set(1.0f, 1.0f);
plane.setTextureCoordinate(0, 1, q);
// (1,1) -->右下(p1)
q.set(0.0f, 1.0f);
plane.setTextureCoordinate(0, 0, q);
// (0,1) -->左下(p0)
這里的平面對象代表了四邊形。
更新圖像
前面已經提到,一個TimeBehavior對象被建立以每隔40毫秒調用一次JMFMovieScreen的nextFrame()方法。而nextFrame()又調用JMFSnapper對象的getFrame()方法來以一個BufferedImage對象方式檢索當前動畫幀。該BufferedImage對象被指派給ImageComponent2D對象,然后用于四邊形的材質。nextFrame()的代碼如下所示:
//全局變量
private Texture2D texture; //由四邊形使用
private ImageComponent2D ic;
private JMFSnapper snapper;
//快照該動畫
private boolean isStopped = false;
//動畫停止了嗎?
public void nextFrame()
{
if (isStopped) //動畫已經停止
return;
BufferedImage im = snapper.getFrame();
//獲取當前幀
if (im != null) {
ic.set(im); //把該幀指派給ImageComponent2D
texture.setImage(0,ic);
//使成為該形狀的材質
}
else
System.out.println("Null BufferedImage");
}
JMFSnapper對象snapper是在JMFMovieScreen的構造器中創建的:
//裝載并播放動畫
snapper = new JMFSnapper(movieFnm);
JMFSnapper中的簡單接口隱藏了用于播放動畫和從動畫中提取幀的JMF代碼的復雜性。在本文的第二部分里,JMFSnapper類為一個使用QuickTime
for Java的版本所取代,且JMFMovieScreen類也作了最少的修改。
5.管理動畫
JMF為存取特定的動畫幀提供了一種高級存取方式。下面的代碼片斷顯示了該高級方式的主要組成,我略去了其中有關錯誤檢測及異常處理的部分。
//在realized狀態下,創建一個動畫播放器
URL url = new URL("file:" + movieFnm);
Player p = Manager.createRealizedPlayer(url);
//生成一個幀放置器
FramePositioningControl fpc = (FramePositioningControl)
p.getControl("javax.media.control. FramePositioningControl");
//創建一個幀抓取器
FrameGrabbingControl fg = (FrameGrabbingControl)
p.getControl("javax.media.control.FrameGrabbingControl");
//要求改變到一個prefetched 態
p.prefetch();
//一直等待,直到播放器處于那種狀態...
//移動到具體的某幀,例如第100幀
fpc.seek(100);
//取得當前幀的一個快照
Buffer buf = fg.grabFrame();
//取得它的視頻格式細節
VideoFormat vf = (VideoFormat) buf.getFormat();
//用視頻格式初始化BufferToImage
BufferToImage bufferToImage =new BufferToImage(vf);
//把緩沖區數據轉化成一幅圖像
Image im = bufferToImage.createImage(buf);
//指定想得到的BufferedImage的格式
BufferedImage formatImg =
new BufferedImage(
FORMAT_SIZE, FORMAT_SIZE,
BufferedImage.TYPE_3BYTE_BGR);
//把該圖像轉化成一個BufferedImage
Graphics g = formatImg.getGraphics();
g.drawImage(im, 0, 0,
FORMAT_SIZE, FORMAT_SIZE, null);
g.dispose();
一個媒體播放器從創建到開始播放共經歷6種狀態。處于realized態的播放器知道如何對其數據進行著色,所以在要求時可以提供可視化組件和控件。我用了兩個控件:FramePositioningControl
和FrameGrabbingControl。FramePositioningControl提供seek()和skip()等方法,用于在一個動畫中移動以查找一個特別的幀。FrameGrabbingControl提供了方法grabFrame(),它可以從動畫的視頻軌道中抓取當前幀。
為使這些控件工作,播放器必須實現從realized 態轉入prefetched 態。這可以使播放器為進行媒體播放作好準備,并使媒體數據裝入。
對于prefetch()的調用是異步的,這意味著我的代碼必須包含一個等待周期,直到完成一個變換狀態為止。標準的JMF編碼方案是實現一個waitForState()方法,它可以停止代碼的執行,直到一個狀態改變事件喚醒它。
要抓取的幀可以用seek()方法在軌道中定位,然后調用grabFrame()方法實現幀的抓取。編碼中必須經歷多個轉換步驟來把抓取的緩沖對象轉懷蒍MFMovieScreen要求的BufferedImage對象。注意,BufferedImage對象使用了TYPE_3BYTE_BGR格式,這種格式對于該程序中的Java
3D部分通過引用方式使用紋理是必需的。
Sun的JMF站點 包括了一些有用的小例子,其中Seek.java一例說明了如何使用FramePositioningControl來遍歷一個動畫。
[編輯:gigi_miao] [返回首頁]
[1] [2] [3]
相關文章:
·跟我學Java Swing之游戲設計(1)(2005-10-17 16:32:45)
·初學者如何開發出一個高質量的J2EE系統(2005-10-17 16:02:53)
·什么是Java EE 5(2005-10-17 16:01:46)
·Java手機軟件圖形界面API篇(2005-10-10 16:10:23)
·Java手機軟件圖形界面API之低級GUI組件(2005-10-10 15:54:39)
推薦文章:
·贏在2007賽迪網年度企業人物榜單揭曉 ·你最需要哪種類型的視頻教程 ·不用網銀也網上購物 三步自助開通 ·2007年UPA用戶體驗大會成功閉幕
·2007中國青年設計節暨用戶體驗年會在京開幕 ·User Friendly 2007現場圖片 ·手機暢游互聯網 空中Opera 2.0實測
·動易軟件即將全面開源和免費 ·搜圖有“道” 圖片達人的搜索秘籍 ·數字水墻 08年世博會亮相 ·RabbitAir MinusA2空氣凈化器設計 ·Oscar
Bjarnason 平面設計 ·國產殺毒軟件半個月內勇奪兩項國際權威認證 ·美化你的博客-推薦多個博客圖標下載網站
·微軟回應Vista用戶遇到的網絡問題“設計如此” ·eBay改進用戶體驗 借鑒亞馬遜頁面設計搜索功能 ·極點五筆6.0正式版發布 ·WPS Office
2007搶先試用 ·報告稱Google Apps功能遠不及微軟Office ·什么是SOCK5代理,什么是HTTP代理最新評論
更多評論 共 0 條評論
網易通行證: 密碼:
參與評論您尚未登陸系統,只能以游客身份發表評論,如果想以實名發表,請先登陸系統。
您的發表的評論將在5分鐘內被審核,請耐心等待
網易學院聯系電話:020-61210163-560 合作/投稿郵箱:NeteaseSchool(at)126.com
合作媒體:結繩記事 藝網 中國電腦救援中心 ad110.com 中國教程網 FIF多媒體制作組 金鷹電腦教程網 時代光魔 好好學習
天天向上主編信箱 熱線:020-85105316 給網易提意見
About NetEase - 公司簡介 - 聯系方法 - 招聘信息 - 客戶服務 - 相關法律 - 網絡營銷 - 幫助中心
網易公司版權所有
©1997-2008
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -