Java 3D API官方教程[翻譯二]
java 3D API官方教程:1.4 編寫Java3D程式的一般步驟
SceneGraphObject類的子類就是整合構建情境圖的模組,一個Java3D程式的開發大略可以分為七步(把它們聚在一起,在Java 3D API 規範中和這裡稱之為步驟(recipe)),具體如下列表所示,這些方法可用於裝配許多的Java3D程式。
1. 建立一個Canvas3D對象。
2. 建立一個VirtualUniverse對象。
3. 建立一個Locale 對象,並使之與VirtualUniverse相關聯。
4. 構建一個視圖子圖。
a. 建立一個View 對象。
b. 建立一個ViewPlatform對象。
c. 建立一個PhysicalBody對象。
d. 建立一個PhysicalEnvironment對象。
e. 把 ViewPlatform, PhysicalBody, PhysicalEnvironment, 和Canvas3D對象與View
對象相關聯。
5. 構建一個或多個內容子圖。 6. 編譯所有子圖。
7. 把子圖加到Locale對象中。
表 1-1 編寫Java3D程式的一般步驟
這些步驟忽略了細節但是解釋了Java 3D編程中的基本概念。建立情境圖中的子圖是編程的主要部分。但我們並沒有展開這些步驟詳細討論,本教程的下一部分解釋了一種用更少的代碼更容易的手段來構建一個非常簡單的情境圖的方法。
1.4.1 編寫Java 3D程式的一個簡單方法
用 基本方法編寫具有視圖分支圖的Java 3D programs程式的結構有其唯一性,構建視圖分支子圖結構的規則可以通過SimpleUniverse工具類來實現. SimpleUniverse 的執行個體承擔了構建情境圖的基本步驟中的第2, 3以及第4步。利用SimpleUniverse類來進行Java3D編程,可以大大減少建立視圖分支圖的時間和精力,從而,程式員可以有更多的時間來構 建內容分支子圖,這才是真正與Java3D程式事關重大的。
SimpleUniverse類對於Java 3D編程而言真是一個很好的起點,因為它允許程式員暫時忽略視圖子圖的存在.儘管如此,SimpleUniverse 中也不允許同一個虛擬世界存在多個視圖。
本 教程的所有例子程式都用到了SimpleUniverse類,因此,如果程式員想獲得更多的關於View, ViewPlatform, PhysicalBody, 和PhysicalEnvironment 類的資訊請參考其它參考資料,附錄B有詳細的參考資料列表。
SimpleUniverse類
SimpleUniverse 對象的建構函式建立了包含VirtualUniverse 、Locale對象以及一個完整的視圖子圖在內的情境圖,SimpleUniverse建立的視圖子圖是用了ViewingPlatform 和Viewer 便利類的執行個體來代替了其它核心類來建立視圖子圖。注意到SimpleUniverse僅僅是沒有直接用到 Java3D核心類中的View和ViewPlatform對象的。SimpleUniverse 對象提供了圖1-7中大方框中的所有功能。com.sun.j3d.utils.universe包包括了 SimpleUniverse, ViewingPlatform, 和Viewer convenience工具類
利 用一個SimpleUniverse 對象可以使構造Java3D程式的基本步驟更加簡單,表1-2展示了簡單的方法。這是用SimpleUniverse 對象之後構建Java3D程式所需的步驟,上文所提到的基本步驟的第2, 3,和4步已經被本方法的第2步所替代。
1. 建立一個Canvas3D對象。
2. 建立一個SimpleUniverse對象,並添加對先前建立的Canvas3D 對象的引用。
a. 定製SimpleUniverse對象。
3. 構建內容子圖。
4. 編譯內容分支子圖。
5. 把內容子圖添加到SimpleUniverse的Locale中。
表1-2 用SimpleUniverse建立Java3D程式的簡單步驟
下 面的灰框中的內容是本教程中參考模組的第一次出現。參考模組一般對一個類的建構函式、方法和屬性作了個列表。使用參考模組的目的在於使讀者能在手頭上沒有 其他參考資料的情況下能學到基本的Java 3D API編程知識。本教程中的參考塊並沒有涉及到每一個類的建構函式和方法,由於這個原因,很多的Java 3D API 類都沒有列出參考塊。因此,本教程的文檔本不能替代Java 3D API規範的位置,儘管如此,列出了建構函式、方法和屬性的參考塊的這些類,本教程所提供的資訊往往比Java 3D API規範所提供的資訊更加詳實。
|
SimpleUniverse 建構函式
包: com.sun.j3d.utils.universe
這 個類構建了一個儘可能小的使用者環境,以使Java3D程式能儘快盡簡單地運轉起來。這個工具類建立了視圖子圖中所必需的所有對象。特別是建立了 Locale, VirtualUniverse, ViewingPlatform, 和Viewer對象, (構建這些對象時統統使用預設值).這些對象以恰當的關係構成了視圖子圖。
SimpleUniverse 提供了許多基本的Java 3D應用程式所必需的全部功能. Viewer和ViewingPlatform都是很方便的工具類.這些類用到了View 和ViewPlatform 核心類。
SimpleUniverse()
構建一個包含視圖子圖的簡單虛擬世界。.
SimpleUniverse(Canvas3D canvas3D)
構建一個簡單虛擬世界並與指定的Canvas3D對象建立關聯。
|
構建一個簡單虛擬世界並與指定的Canvas3D對象建立關聯。
SimpleUniverse對象建立了虛擬世界中一個完全的視圖分支子圖。這個視圖分支圖包括一個圖板(image plate)。Java 3D把情境內容投影到圖板塊上形成一個渲染圖象。Canvas3D 對象,提供了在電腦的視窗上顯示圖象,就可以看做圖板。
圖1-9,顯示了圖象圖板,觀察者位置和虛擬世界的關係。 觀察者在圖板後面。而可視對象在圖板之前並能在圖板上進行渲染。渲染就可以看作是可視對象到圖板上的投影。這個觀點就中的四個方向上的投影儀(虛線所示)
預設地,圖板位置SimpleUniverse原始位置的中心,預設的方向是從Z軸從上往下看的。從這個位置上看,X軸是一條正向在右邊的水平穿過圖板的直線,而Y軸是垂直穿過圖板中心、正向在上方的直線。因此,點 (0,0,0)就處於圖板的正中央。
一 般的Java3D程式,都把視圖往後退(Z軸正向)(譯者註:物體前移,往Z軸正向移,或往圖外移),以使物體處於或者離原始視圖比較近。 SimpleUniverse類有一個ViewingPlatform的類的執行個體作為成員對象,ViewingPlatform類也有一個 setNominalViewingTransform的方法來設定觀察者(眼睛)的位置,使之位於 (0, 0, 2.41)(looking in the negative z direction toward the origin?).
|
ViewingPlatform setNominalViewingTransform() 方法
包: com.sun.j3d.utils.universe
ViewingPlatform 類用於設定SimpleUniverse 對象中Java 3D情境圖的視圖分支圖。這個方法一般用SimpleUniverse 類的getViewingPlatform方法來進行串連。
void setNominalViewingTransform()
把SimpleUniverse對象中的象徵性的觀察者設定約2.41米的距離變化。在這個距離上,視圖的預設屬性,2米高和寬的對象大約都會恰好與圖板符合。
|
創 建了Canvas3D和Simple Universe對象後,下一步就是建立內容子圖。對視圖子圖中的常規結構的應用,從而導致應用SimpleUniverse類的這一套,對內容子圖並不 適合,因為內容子圖在每一個程式中都各有不同,因而也就不可能給出構建一個內容子圖的通用的詳細方法。這也意味著你想整合的任何虛擬世界中並不存在簡單內 容類("simple content")。
建立內容子圖是第1.6,1.7和1.9節的主題,在1.8節中討論了內容了圖的編譯。如果你迫不及待地想看代碼以找出個究竟,請參考程式碼片段1-1,這就是一個應用SimpleUniverse 類的例子。
創 建了內容子圖之後,可以用addBranchGraph把內容子圖加到SimpleUniverse對象中. addBranchGraph方法把BranchGroup 的執行個體作為唯一的傳入參數。BranchGroup作為SimpleUniverse 對象所建立的Locale對象的孩子加到情境圖中。
SimpleUniverse 的方法 (只列出了部分)
包: com.sun.j3d.utils.universe
void addBranchGraph(BranchGroup bg)
用於往SimpleUniverse對象所建立的Locale對象的情境圖中。用這個方法把內容子圖添加到虛擬世界中。
ViewingPlatform getViewingPlatform()
用於擷取SimpleUniverse 執行個體化後的ViewingPlatform 對象。這個方法再附加調用setNominalViewingTransform()方法來調整視圖的位置。