Java 3D 學習筆記

1.java3d開發環境搭建

  • jdk(java development kit)安裝
  • java3d安裝
  • IDE安裝(eclipse,idea,netbeans選擇一種即可)

2.java3d開發引擎

  • JME
  • Ardor3D
  • Xith3D

3.java3d原理

JAVA 3D從高層次爲開發者提供對三維實體的創建、操縱和着色,使開發工作變得極爲簡單。同時,JAVA 3D的低級API是依賴於現有的三維圖形系統的,如Direct 3D、OpenGL、QuickDraw 3D和XGL等,它可以幫助我們:
A. 生成簡單或複雜的形體(也可以直接調用現有的三維形體)
B. 使形體具有顏色、透明效果、貼圖。
C. 可以在三維環境中生成燈光、移動燈光。
D. 可以具有行爲(Behavior)的處理判斷能力(鍵盤、鼠標、定時等)
E. 可以生成霧、背景、聲音等。
F. 可以使形體變形、移動、生成三維動畫。
G. 可以編寫非常複雜的應用程序,用於各種領域如VR
JAVA 3D的這種體系結構既可以使其開發的程序“到處運行”,又使其能充分利用系統的三維特性。就因爲JAVA 3D擁有如此的強大的三維能力,使得它在網絡世界,特別是在遊戲中能大展姿彩。

4.常用函數介紹

BranchGroup 類 
這種類型的對象是用於構建建場景圖的, BranchGroup的實例是子圖的根結點, BranchGroup對象也是唯一能成爲Locale對象的孩子對象的對象。BranchGroup對象可以有多個孩子, BranchGroup對象的孩子對象可以是Group和Leaf對象。 

BranchGroup 默認構造函數 

BranchGroup() 

BranchGroup的實例,作爲場景圖分支的根結點,BranchGroup 對象也是能唯一插入到Locale對象中的對象。 


Canvas3D類 

Canvas3D 類繼承自Abstract Windowing Toolkit (AWT)類的Canvas類.在場景圖的視圖分支圖中,至少要引用一個 Canvas3D對象(注:有可能存在多個Canvas3D對象,爲了使演示簡單,在使用SimpleUniverse類時,在程序中僅有 Canvas3D類的一個實例)。關於Canvas類更多的信息,請參考AWT。附錄B中提供了一系列參考。 

Canvas3D 類的構造函數 

Canvas3D(GraphicsConfiguration graphicsconfiguration) 構造並初始化一個新的Canvas3D對象,Java 3D可以在給定的GraphicsConfiguration對象條件下渲染這個對象。這是 AWT Canvas類的擴展的類。關於GraphicsConfiguration 對象的更多信息請參考Java 2D規範。這也是JDK 1.2 AWT的一部分。 



Transform3D 類 

Transform3D 對象用於進行3D幾何形變比於平移和旋轉。這些對象一般僅僅用於創建一個TransformGroup對象。首先, Transform3D對象可能基於一些Transform3D對象的組合而創建,然後就用這個Transform3D來構建一個] TransformGroup對象。 

Transform3D默認的構造函數 

一個通常的變換對象就表示爲一個4x4雙精度浮點矩陣。 這種數學表示是以行爲主的。一個Transform3D對象不是在場景圖中用到的,而是用於指定TransformGroup對象的圖形變換的。 

Transform3D() 

構造一個Transform3D 對象,默認使用單位矩陣 (不顧慮在變換)。 

一個Transform3D對象能表示平移,旋轉,縮放乃至這些變換的組合。當指定一個旋轉變換時,角度用弧度來表示。一個全 

旋轉(圓)的弧度是2 PI。設置角度的一個方法是利用常量Math.PI,另外一種算途徑是直接設置,這裏說一下常用角度的 

弧度:45度是0.785, 90度是1.57, 而180 度是3.14(約爲PI)。 

Transform3D 類的方法 (列出部分) 

Transform3D對象用於表示幾何形變,比如旋轉,平移和縮放。 Transform3D是沒在任何場景圖中直接使用到的少數幾個類之一。Transform3D對象所定義的變換是用於創建場景圖中的 TransformGroup 對象的。 

void rotX(double angle) 

設置圖形X軸方向沿逆時針對象按指定的角度旋轉。角度值用弧度指定。 

void rotY(double angle) 

設置圖形Y軸方向沿逆時針對象按指定的角度旋轉。角度值用弧度指定。 

void rotZ(double angle) 

設置圖形Z軸方向沿逆時針對象按指定的角度旋轉。角度值用弧度指定。 

void set(Vector3f translate) 

利用傳入的Vector3f型的參數設置圖形的平移值,如果這個傳入的形變是單位矩陣,則在其它時候設置真正的形變值。 


TransformGroup 類 

作爲Group類的子類,TransformGroup類的實例用於創建場景圖並且都其子結點的集合。TransformGroup對象存儲了幾何形變比如平移和旋轉。一般利用不在場景圖中的Transform3D對象來構造某一形變。TransformGroup對象保存了場景圖中的形變信息。 

ransformGroup 構造函數 

TransformGroup() 

利用單位矩陣來構造並且初始化一個TransformGroup對象。(不發生形變) 

TransformGroup(Transform3D t1) 

通過傳入Transform3D對象參數來構造並且初始化一個TransformGroup 對象。 

參數: 

t1 - transform3D對象 







Transform3D對象中所包含的形變信息在TransformGroup對象創建時或者是調用了setTransform()方法變複製到 TransformGroup中。 

TransformGroup setTransform() 方法 

void setTransform(Transform3D t1) 

利用傳入的形變參數設置TransformGroup對象的形變值。 

參數: 

t1 - 要複製的transform3D對象。 


Vector3f 類 

Vector3f 是包javax.vecmath中的數學類,用於用浮點數來設定一個矢量。Vector對象常常用於設置圖形開變。 

Vector3f對象也不直接在場景圖中用到。常用於指定形變,表現,法向量以及一些其它的應用。 

Vector3f 構造函數 

一個三個元素的矢量。其三個元素用單精度浮點數表示X,Y,Z座標。 

Vector3f() 

用(0,0,0)構造並初始化一個Vector3f。 

Vector3f(float x, float y, float z) 

指定x,y,z軸座標來構造並初始經一個Vector3f。 



ColorCube 

ColorCube 是包com.sun.j3d.utils.geometry中的工具類。定義了一個立方體圖形及其各面的不同的顏色,並使位置處 

於初始位置的中間。默認的 ColorCube對象是一個長寬高均爲2米的立方體。如果一個處於原始位置未經旋轉的立方體(如 HelloJava3Da示例中的),在名義上的視圖位置中,紅色面是可見的,其它面的顏色分別是:藍色, 洋紅,黃色,綠色和 青色。 

ColorCube 構造函數 

包: com.sun.j3d.utils.geometry 

一個ColorCube 是一個簡單的各面均有不同顏色的可視的立方體。 

ColorCube 擴展了Shape3D 類;因此,它是葉子結點。 ColorCube可以很容易地放置於虛擬世界中。 

ColorCube() 

以默認的大小構造一個有色立方體。默認地,每一個角到相應座標的中心都是1米,因而,此立方體處於視圖正中心,長寬高 

都是2米。 

Node 類 

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



Group 類 

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


Leaf 類 

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

NodeComponent 類 


NodeComponent 類

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


Group對象

     方法: addchild, insertchild,removechild,setchild

     用來對形體的分組,是所有Group類的父類,Group nodes have exactly one parent and an arbitrary number of children that are  rendered    in an unspecified order (or in parallel). Null children are allowed; no operation is performed on a null child node.

      子類: BranchGroup, OrderedGroup, Primitive, SharedGroup, Switch, TransformGroup, ViewSpecificGroup


BranchGroup

通常做爲整個場景的根節點,燈光,背景等效果對象都加在這一對象上面

OrderedGroup

與BG有相同的效果,只不過渲染的時候是按下標的順序來渲染

DecalGroup

OG的一個子類,只有這個類可以正確的顯示位於同一平面上的多個重疊的平面

Switch

可以靈活控制一組對象中的單個或者幾個,切換的作用

ShareGroup

可以以一個圖像爲模子進行同一對象的複製

2.幾何變換

   TG:定義局部座標系,通過對它的設定可以實現形體的旋轉與放縮怎麼變換


TransformGroup(Transform3D t)

標誌: ALLOW_TRANSFORM_READ,ALLOW_TRANSOFRM_WRITE

如果想讓物體移動,一定要指定這兩個標誌.


Transform3D

通常表示TG對象相對於父節點(如BG)的位置/角度/尺度等空間的變換


TransformGroup對象與Transform3D對象的應用

程序中每次指定TG對象的Transform3D屬性都需要生成新的T3D對象,這是因爲不同的TG對象都保留着自己的T3D對象的實例,且僅有一個,因此不同的TG對象如果提供的變換是不一樣的,那麼必須使用不同的T3D對象



TransformGroup特點:

1.在三維空間中放置任何形體,燈光,聲音都要要到該對象。

2.該對象用來定義一個通過設置,可以移動、旋轉和放大縮小的局部座標系。

3.該對象有兩個flags,其中ALLOW_TRANSFORM_WRITE用來將最新的數據(即座標變化後的數據寫入到數據結構中),允許程序在運行的時候修改該節點上的場景。ALLOW_TRANSFORM_READ用來讀取位置變化前的數據,從而進行判斷和處理。允許程序在運行的時候讀取該節點上的場景。

4.通過設置ALLOW_TRANSFORM_WRITE來使座標系運動(此時在不要讀取值時使用,如讀取移動的距離,選旋轉的角度,縮放的比例等值。若要讀取這些值,則要再使用ALLOW_TRANSFORM_READ)

5.要在程序中通過鼠標,移動、旋轉、比例放大所指定的局部座標系,則需要同時設置ALLOW_TRANSFORM_WRITE和ALLOW_TRANSFORM_READ。

6.Java虛擬機會爲這兩個flags創建單獨的線程(或者進程)來負責接收場景的反饋,在控制場景,避免了用戶不必要的開銷。

Transform3D的特點

1.表示所指定的座標的座標變換,如旋轉、放大縮小、平移等

2.Quat4f(x,y,z,w)的參數介紹

 x:x座標    y:y座標    z:z座標   w:物體旋轉的角度   如:

  Quat4f(0.0f,1.0f,0.0f,1.57f) 表示物體繞Y軸旋轉90度,當Y軸的只越大則旋轉的幅度越大。

  當x,y,z的值不爲0時,其值的大小即表示轉動幅度的大小,值越大,表示向該方向轉動的幅度也越大。

3.Transform3D有四個方法rotx(),roty(), rotz(),setTranslation().當這四個方法一起使用的時候,只有最後一個有作用。爲了能夠讓rotx,roty, rotz都顯示出來,則可以使用setRotation(new Quat4())來代替,此時不論setTranslation()在setRotation(new Quat4())前還是後,都可以顯示出效果。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章