JAVA3D之HelloWorld
很早就聽說了JAVA3D,可惜一直都沒有去看,那個時候JAVA3D還是1.4是最新版,轉眼一年多過去了,JAVA3D都到了1.5.1版了,在感慨時間易逝的同時也不免對自己沒有努力而感到嘆息。現在又重新拾起對JAVA3D的激情與希望,希望在以后的日子里,少一些空虛,多一份充實,與大家互勉。
對于有JAVA基礎的人來說,學習JAVA3D并不會很困難,一般來說涉及到3D都是比較底層的東西了,但是JAVA3D卻把它抽象的非常好,很符合面向對象的思維,并且JAVA優秀的架構也使JAVA3D更加強大。我們還是先來看代碼吧,看了代碼才好講話:
/*
* Test1.java
*
* Created on 2007-10-4, 14:28:53
*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package test1;
import com.sun.j3d.utils.behaviors.mouse.MouseRotate;
import com.sun.j3d.utils.behaviors.mouse.MouseTranslate;
import com.sun.j3d.utils.behaviors.mouse.MouseWheelZoom;
import com.sun.j3d.utils.geometry.Cylinder;
import com.sun.j3d.utils.universe.SimpleUniverse;
import java.awt.Color;
import java.awt.GraphicsConfiguration;
import javax.media.j3d.Appearance;
import javax.media.j3d.BoundingSphere;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.DirectionalLight;
import javax.media.j3d.Material;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.swing.JFrame;
import javax.vecmath.Color3f;
import javax.vecmath.Point3d;
import javax.vecmath.Vector3f;
/**
*
* @author hadeslee
*/
public class Test1 {
public Test1() {
build();
}
private void build() {
//生成分支組合
BranchGroup bg = createSceneGraph();
//得到推薦的配置
GraphicsConfiguration config =
SimpleUniverse.getPreferredConfiguration();
//用此配置構造一個用于顯示3D的畫布
Canvas3D c=new Canvas3D(config);
//用此畫布生成一個簡易的虛擬宇宙
SimpleUniverse u = new SimpleUniverse(c);
//設置觀察者的位置
u.getViewingPlatform().setNominalViewingTransform();
//把我們構造好的一個分支放進來
u.addBranchGraph(bg);
//生成一個Frame對象
JFrame f=new JFrame("3D Hello");
f.add(c);
f.setSize(300,300);
f.setLocationRelativeTo(null);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
//創造分枝組合的方法
private BranchGroup createSceneGraph() {
//生成一個分支對象
BranchGroup objRoot = new BranchGroup();
//生成一個變換組合對象
TransformGroup objTrans = new TransformGroup();
//將其設為可寫,也就是在運行時可以進行更改
objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
//創建一個變換對象
Transform3D trans = new Transform3D();
Vector3f vec = new Vector3f(0.5f, 0, 0);
//設置它的位置,為0.5,0,0
trans.setTranslation(vec);
//將此變換對象應用到變換組合中
objTrans.setTransform(trans);
//呈現方式
Appearance app=new Appearance();
//材質
Material mater=new Material();
//設置自己的顏色是藍色
mater.setEmissiveColor(new Color3f(Color.BLUE));
app.setMaterial(mater);
//生成一個圓柱,并指定其顯示方式
Cylinder box = new Cylinder(0.2f, 0.50f,app);
//把圓柱加入到變換組合中,使它可以被變換
objTrans.addChild(box);
//把整個變換組件加入到分支組合中
objRoot.addChild(objTrans);
//作用的空間范圍
BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
//鼠標旋轉
MouseRotate behavior = new MouseRotate();
behavior.setTransformGroup(objTrans);
objTrans.addChild(behavior);
behavior.setSchedulingBounds(bounds);
//鼠標移動
MouseTranslate tr = new MouseTranslate();
tr.setTransformGroup(objTrans);
objTrans.addChild(tr);
tr.setSchedulingBounds(bounds);
//鼠標滾輪縮放
MouseWheelZoom tr1 = new MouseWheelZoom();
tr1.setTransformGroup(objTrans);
objTrans.addChild(tr1);
tr1.setSchedulingBounds(bounds);
//營造直射燈光為紅色
Color3f light1Color = new Color3f(Color.RED);
Vector3f light1Direction = new Vector3f(0f, 0f, -10f);
DirectionalLight light1 = new DirectionalLight(light1Color, light1Direction);
light1.setInfluencingBounds(bounds);
objRoot.addChild(light1);
//預編譯一下,提高效率,也可以不要
objRoot.compile();
return objRoot;
}
public static void main(String[] args) {
new Test1();
}
}
代碼需要JAVA3D的運行環境,可以到這里下載:https://java3d.dev.java.net/,程序運行以后,可以看到一個3D的圓柱,可以用鼠標左鍵進行旋轉,鼠標右鍵進行平移,3D滾輪進行縮放,程序運行如下圖所示:
在JAVA3D里面,所有的組件構成了一個圖表的結構,其中最頂端的就是虛擬宇宙,它只能有一個,然后它下面可以放很多個節點,節點下面還可以放節點,其中不但物體可以做為節點,燈光等別的東西也都是一個節點,附屬在一起,描述出了整個3D的世界。
其實3D也沒有想象中那么難,只要把一些概念搞清楚了就可以了,有些概念我現在也不是很清楚,因為我們一般的編程模式不會用到這些,所以我們對這方面的知識就比較缺乏,現在只是盡自己的可能把自己所理解的寫出來,一來可以讓大家也了解一下JAVA3D,二來也算是自己的一個學習歷程吧。
盡管千里冰封
依然擁有晴空
你我共同品味JAVA的濃香.
posted on 2007-10-05 00:54
千里冰封 閱讀(5721)
評論(7) 編輯 收藏 所屬分類:
JAVA擴展