Java 3D API官方教程[翻譯一]

來源:互聯網
上載者:User
  Java 3D API官方教程[翻譯一]

開始學習Java3D API

1

第一章、入門

本章目標:

學習了本章之後,你能:

•能用一些基本術語解釋什麼是Java3D

•能描述出Java3D程式的基本結構。

•能識別出Java3D API中的許多類。

•能編寫出簡單的Java3D動畫程式。

      Java 3D API是一個用於編寫顯示和互動操作三維繪圖物件的程式的介面。Java 3D也是在Java2 Java開發包(JDK)上的標準擴充。這個API提供了用於建立和操縱3D圖形的高端構成方法以及渲染該圖形的一些資料結構。Java3D 提供了建立圖片、可視化、動畫以及3D互動圖形應用程式的函數。

1.1 什麼是Java 3D API?

       Javae 3D API是作為複雜三維圖形和聲音渲染系統的介面的一系列層次的JAVA類的統稱。

       程式員可以用Java3D開發建立和操縱3D繪圖物件的高端應用。這個繪圖物件處於一個被渲染了的虛擬世界(Virtual Universe)中。這個API就是用設計來用於靈活方便地建立精確的各種大小的虛擬環境,可以大到大空物體,小到比原子還小。

     除了這些功能之外,API的使用也很直接,API能自動處理渲染的細節,由於利用了Java線程機制的優勢,所以Java3D的渲染器的工作是並行進行的。並且渲染器也能自動地最佳化並提高渲染效能。   

     一個Java3D程式建立了Java3D對象的實際,並將其置之於情境圖資料結構中。在這個情境圖中,所有3D對象用完全指定了虛擬世界內容和其如何被渲染的樹形結構儲存,

     Java3D程式能寫成能獨立啟動並執行應用程式,或者寫成能嵌入在瀏覽器中啟動並執行Applets,或者二者兼備。

1.2 Java 3D API

  每一個Java3D程式至少部分地整合了來自Java類層次中的對象,這些對象的集合稱做虛擬世界(virtual universe),這就是將要被渲染的對象。此API在javax.media.j3d包中定義了超過100多個類,這些類我們平常稱做Java3D核心類。

   在Java3D API中有數以百計的屬性和方法。儘管如此,一個包含動畫功能的簡單的虛擬世界的構建僅僅需要幾個類就行。本章討論了用盡少的對象集合和互動來渲染一個簡單虛擬世界。

    本章包含了一個簡單但是完全的叫HelloJava3D的程式的開發過程,這個程式顯示了一個能旋轉的立方體,這個樣本程式是逐步開發完成的,因此這個程 序用了很多版本來展示Java 3D編程過程中的每一部分。本教程中的所有程式都可以獲得電子的版本。更多的資訊請見前言中的"獲得本教程"[譯者註:http://java.sun.com/products/java-media/3D/collateral/]。

   除了Java3D核心包之外,Java3D程式設計也會用到其它的包,比如com.sun.j3d.utils,這個包通常稱做Java3D工具類,核心類中僅僅包含了在Java3D編程中必段的最底層的類,而工具類是對核心類方便而強大的補充。

   工具類主要分為四類:內容載入器、情境圖構建輔助類、圖形類和方便的一些工具類。將來還有一些功能,比如nurbs[non-uniform rational B-spline,非均勻有理B樣條],也會加到工具類,而不是Java3D核心包中。而一些工具類在Java 3D API 將來的版本中也可能會移到核心包中去。

   利用工具類大大地減少了Java3D程式中的程式碼數。除Java3D核心類和工具類包之外,每一個Java3D程式還引用了java.awt包和 javax.vecmath包中的類. java.awt包就是Abstract WindowingToolkit (AWT). AWT類用於建立顯示和渲染情境和視窗。而javax.vecmath包則定義了對點、向量、矩陣以及其他數學對象進行數學運算的類。

     在餘下的教程中,詞彙可視對象(visual object)就是情境圖中的對象比如一個立方體或者球體。對象(object)則是指一個類的執行個體。而內容(content)指的是一個情境圖中全部的可視對象。

1.3 構建情境圖

     一個Java3D的虛擬世界建立自一個情境圖,而情境圖就是由Java3D類的執行個體構建而成.情境圖整合了定義圖形、聲音、光線、位置、方向以及可視物體和聲音對象的表面屬性等對象。 一個通常的圖形定義是一個由結點和弧邊組成的資料結構。一個結點是一個資料元素,而邊則是資料元素之間的關係。情境圖中的結點就是Java3D類的執行個體,而邊展示了這些Java 3D執行個體之間的兩種關係。最為通用的關係是就是父子關係(parent-child relationship),一組結點可以有任意數目的孩子卻只能有一個雙親。一個葉子結果可以有一個雙親但是沒有孩子。

另一個關係是引用(reference)。一個引用與情境圖結點中的結點組件(NodeComponent)對象相關聯。結點組件定義了用於渲染可視對象的圖形和表面屬性。

Java 3D情境圖就是由一堆具有父子關係的結點構建成的樹形結構。在樹形結構裡,其中有且僅有一個結點是根結點,共他結點都可以順著從根開始的弧邊可以訪問到,樹形結構中的結點是沒有迴路的。一個情境圖就是由植根於本地(Locale)對象的樹而形成的。結點組件和引用弧邊都不是情境圖樹的組成部分。

在樹形結構中,從根結點到葉子結點有且僅有一條路徑,因此,從情境圖的根到其每個葉子結點也僅有一條路徑。從情境圖根結點到到特點葉子結果的路徑我們稱之為該葉子結點的情境圖路徑(scene graph path)。 因此,一條情境圖路徑恰恰只通向了一個葉子結點。而在情境圖中從根到每個葉子結點都有一條這樣的路徑。在Java3D情境圖中的每一條情境圖路徑也完全地 定義了路徑的葉子的狀態資訊。狀態資訊包括位置、方向、可視對象的大小。由此可見,每一個可視對象的可視屬性僅僅由其情境圖路私決定。Java3D渲染利 用這點,以僅可能有效地按它所定義的順序來渲染葉子物件。Java 3D程式員一般情況下不用控制渲染對象的順序。[原註:Java3D 程式員僅僅可以用來控制渲染對象順序的是OrderedGroup類結點,在本教程中對此部分未加論述,請參見Java3D API規範文檔]

 

在樹形結構中,從根結點到葉子結點有且僅有一條路徑,因此,從情境圖的根到其每個葉子結點也僅有一條路徑。從情境圖根結點到到特點葉子結果的路徑我們稱之為該葉子結點的情境圖路徑(scene graph path)。 因此,一條情境圖路徑恰恰只通向了一個葉子結點。而在情境圖中從根到每個葉子結點都有一條這樣的路徑。在Java3D情境圖中的每一條情境圖路徑也完全地 定義了路徑的葉子的狀態資訊。狀態資訊包括位置、方向、可視對象的大小。由此可見,每一個可視對象的可視屬性僅僅由其情境圖路私決定。Java3D渲染利 用這點,以僅可能有效地按它所定義的順序來渲染葉子物件。Java 3D程式員一般情況下不用控制渲染對象的順序。[原註:Java3D 程式員僅僅可以用來控制渲染對象順序的是OrderedGroup類結點,在本教程中對此部分未加論述,請參見Java3D API規範文檔]

情境圖的圖形表示可以當作設計工具或者Java3D程式的文檔。情境圖一般用一些標準的圖形標記來繪製,1-1所示。Java 3D程式可能不止有包含情境圖中的這些對象。

可以用以上標誌集合來設計一個Java3D虛擬世界情境圖。等設計上的事情完成後,情境圖的設計就是程式設計的規範。等到程式也設計完成,同一個情境圖就是程式的精解表現(假設程式是依照設計的圖來進行的話)。一個從已有程式繪製成的情境圖可以做建立程式情境圖的文檔。

可以用以上標誌集合來設計一個Java3D虛擬世界情境圖。等設計上的事情完成後,情境圖的設計就是程式設計的規範。等到程式也設計完成,同一個情境圖就是程式的精解表現(假設程式是依照設計的圖來進行的話)。一個從已有程式繪製成的情境圖可以做建立程式情境圖的文檔。

       圖1-1左邊所示的每一個標記代表了情境圖中的每一個對象,前兩個標記代表特定的類的對象,即VirtualUniversee和Locale類的對象, 下面的三個則常常用於標註特定對象[譯者注:Group子類的對象等]的子類,最後一個標記用於表示其它類的對象。實線箭頭表示兩個所串連的對象之間存在 父子關係。而虛線箭頭則表求一個對象是另一個對象的引用。引用的對象可以供一個情境圖中的不同的分支所共用。一個簡單的情境圖的例子1-2所示。


    在平時,建立一個錯誤的情境圖也是可能的,一個不合理的情境圖的例子1-3所示.

      圖1-3所描繪的情境圖之所以不合理是因為它與有向非循環圖(Directed Acyclic Graph Or DAG)的規則相衝突.問題存在於兩個TransformGroup對象都以同樣的Shape3D葉 子物件作為其孩子。請記住,一個葉子結點只能一個雙親,也就是,從Locale對象到葉子結點只能有一條路徑(或者從葉子結點到Locale對象只能有一 條路徑)。你也許會認為,圖1-3圖所示的情境在虛擬世界中定義了三個可視對象。它看起來好像是這個情境圖通過重用圖形右邊的可視對象(Shape3D) 而定義了兩個對象。從概念上講,每一個TransformGroup 對象都作為共用的那個Shape3D的雙親,這個Shape3D的可視化對象可以允許在不同地方放置一張圖片。儘管如此,由於父子邊之間的關係構不成樹形結構,所以這個情境圖是不合法的。在這個例子中,表現為Shape3D對象有多於一個以上的雙親。

 

     對樹形結構和有向非循環圖的討論是正確的,然而,Java 3D運行時系統會報告這類父子關係之間的錯誤。樹形結構存在的限制是每一個Shape3D 對象只能有一個雙親。

 

    從圖1-3所示的例子看來,‘多親'異常會在運行時報告出來。圖1-4中,展示了這種不合法情境圖的解決辦法,每一個Shape3D只有一個雙親。

       一個定義了不合理(法)情境圖的Java3D程式可能通過編譯,但是不會在運行時渲染。當一個定義了不合法情境圖的Java3D程式運行時,Java3D 系統會檢測到這個問題,從而會報告一個異常。程式還會繼續運行,但是結果是,應該被關閉,沒有任何渲染好的圖象產生。每一個情境圖有一個唯一的VirtualUniverse,這個VirtualUniverse有一系列 Locale 對象。

 

      一個Locale對象,提供了虛擬世界中的一個參考點。可以把Locale對象看作是在虛擬世界中定義可視對象位置的標誌。一個Java3D程式有多於一 個的VirtualUniverse對象,技術上是可行的,因此,可以在虛擬世界中定義多個Locale對象,然而,在多個虛擬世界之間沒有內在的溝通方 式,更進一步講,一個情境圖不能存於多個虛擬世界中。同時,我們強烈建議在一個Java 3D程式中只同時擁有有且僅有一個VirtualUniverse。而一個VirtualUniverse 可能在多個Locale對象中引用,但是更多的Java 3D程式只有一個Locale對象,每一個Locale對象,可以作為情境圖中多個子圖的根結點。參考圖1-2作為情境圖的例子,注意到圖中的Locale對象有兩個子圖分支。

 

     一個BranchGroup對象是子圖的根結點,或者是分支圖的根結點。情境子圖可以分為兩類,視圖分支圖(the view branch graph)和內容分支圖( the content branch graph.)。內容分支圖指定了虛擬世界的內容——圖形,表面,動作,位置,聲音以及光線等。視圖分支子圖指定了視圖參數比如觀看位置和方向。總的來說,兩類子圖指定了很多渲染要完成的工作。

1.3.1高端Java 3D API的類層次

圖1-5顯示了Java 3D API類層次中的前面三個層次。


VirtualUniverse, Locale, Group, 和 Leaf 類處於類層次中的這部分。除了VirtualUniverse 和Locale對象,情境圖中餘下的部分由SceneGraphObject 對象構成。SceneGraphObject 幾乎是Java3D類中每一個核心類和工具類的超類[譯者註:超類即上層類,可以是父類或者祖先類]。

SceneGraphObject 有兩個子類: Node 類NodeComponent.類,Node子類提供了情境圖中的絕大部分對象,一個Node對象可以是一個Group,也可是一個Leaf結點對象。

Group 和Leaf是一系列類的超類。這裡可以一目瞭然地看到Node類的子類,它有兩個子類,而 NodeComponent 類,在這些背景知識介紹之後,在Java3D程式的構建中會解釋到。

Node

Node是Group和Leaf類的一個抽象超類. Node 為其子類定義了一些公用的重要的方法。某些方法的資訊會在更多的背景知識介紹了之後提到。Node 的子類構成了子圖。

Group

Group 類是用於在虛擬世界中指定可視對象位置和方向的類的超類。Group類的兩個下層類是 BranchGroup是TransformGroup. 在情境圖的圖形表現中,Group標記 (用圓表示)。而其中BranchGroups注為GB, TransformGroups注為TG,等等。具體例子請見圖1-2。

Leaf 類

Leaf是用於指定虛擬世界中可視對象的形狀,聲音和,動作的類的超類。Leaf的一些子類如Shape3D, Light, behavīor,和 Sound. 這些對象不能有自己的孩子,並且可能引用NodeComponents對象。

NodeComponent 類

NodeComponent 類是用於指定Shape3D (Leaf)結點對象的圖形,表面,紋理和材質屬性的類的超類。NodeComponents 不是情境圖的組成部分,但是為其所引用。一個NodeComponent 對象可能為多個Shape3D對象所引用(譯者註:就是比如,同一個材質對象可以賦予多個shape3D對象)。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.