很早就聽(tīng)說(shuō)了JAVA3D,可惜一直都沒(méi)有去看,那個(gè)時(shí)候JAVA3D還是1.4是最新版,轉(zhuǎn)眼一年多過(guò)去了,JAVA3D都到了1.5.1版了,在感慨時(shí)間易逝的同時(shí)也不免對(duì)自己沒(méi)有努力而感到嘆息。現(xiàn)在又重新拾起對(duì)JAVA3D的激情與希望,希望在以后的日子里,少一些空虛,多一份充實(shí),與大家互勉。
對(duì)于有JAVA基礎(chǔ)的人來(lái)說(shuō),學(xué)習(xí)JAVA3D并不會(huì)很困難,一般來(lái)說(shuō)涉及到3D都是比較底層的東西了,但是JAVA3D卻把它抽象的非常好,很符合面向?qū)ο蟮乃季S,并且JAVA優(yōu)秀的架構(gòu)也使JAVA3D更加強(qiáng)大。我們還是先來(lái)看代碼吧,看了代碼才好講話:
* 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();
//用此配置構(gòu)造一個(gè)用于顯示3D的畫(huà)布
Canvas3D c=new Canvas3D(config);
//用此畫(huà)布生成一個(gè)簡(jiǎn)易的虛擬宇宙
SimpleUniverse u = new SimpleUniverse(c);
//設(shè)置觀察者的位置
u.getViewingPlatform().setNominalViewingTransform();
//把我們構(gòu)造好的一個(gè)分支放進(jìn)來(lái)
u.addBranchGraph(bg);
//生成一個(gè)Frame對(duì)象
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);
}
//創(chuàng)造分枝組合的方法
private BranchGroup createSceneGraph() {
//生成一個(gè)分支對(duì)象
BranchGroup objRoot = new BranchGroup();
//生成一個(gè)變換組合對(duì)象
TransformGroup objTrans = new TransformGroup();
//將其設(shè)為可寫(xiě),也就是在運(yùn)行時(shí)可以進(jìn)行更改
objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
//創(chuàng)建一個(gè)變換對(duì)象
Transform3D trans = new Transform3D();
Vector3f vec = new Vector3f(0.5f, 0, 0);
//設(shè)置它的位置,為0.5,0,0
trans.setTranslation(vec);
//將此變換對(duì)象應(yīng)用到變換組合中
objTrans.setTransform(trans);
//呈現(xiàn)方式
Appearance app=new Appearance();
//材質(zhì)
Material mater=new Material();
//設(shè)置自己的顏色是藍(lán)色
mater.setEmissiveColor(new Color3f(Color.BLUE));
app.setMaterial(mater);
//生成一個(gè)圓柱,并指定其顯示方式
Cylinder box = new Cylinder(0.2f, 0.50f,app);
//把圓柱加入到變換組合中,使它可以被變換
objTrans.addChild(box);
//把整個(gè)變換組件加入到分支組合中
objRoot.addChild(objTrans);
//作用的空間范圍
BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
//鼠標(biāo)旋轉(zhuǎn)
MouseRotate behavior = new MouseRotate();
behavior.setTransformGroup(objTrans);
objTrans.addChild(behavior);
behavior.setSchedulingBounds(bounds);
//鼠標(biāo)移動(dòng)
MouseTranslate tr = new MouseTranslate();
tr.setTransformGroup(objTrans);
objTrans.addChild(tr);
tr.setSchedulingBounds(bounds);
//鼠標(biāo)滾輪縮放
MouseWheelZoom tr1 = new MouseWheelZoom();
tr1.setTransformGroup(objTrans);
objTrans.addChild(tr1);
tr1.setSchedulingBounds(bounds);
//營(yíng)造直射燈光為紅色
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);
//預(yù)編譯一下,提高效率,也可以不要
objRoot.compile();
return objRoot;
}
public static void main(String[] args) {
new Test1();
}
}
代碼需要JAVA3D的運(yùn)行環(huán)境,可以到這里下載:https://java3d.dev.java.net/,程序運(yùn)行以后,可以看到一個(gè)3D的圓柱,可以用鼠標(biāo)左鍵進(jìn)行旋轉(zhuǎn),鼠標(biāo)右鍵進(jìn)行平移,3D滾輪進(jìn)行縮放,程序運(yùn)行如下圖所示:
在JAVA3D里面,所有的組件構(gòu)成了一個(gè)圖表的結(jié)構(gòu),其中最頂端的就是虛擬宇宙,它只能有一個(gè),然后它下面可以放很多個(gè)節(jié)點(diǎn),節(jié)點(diǎn)下面還可以放節(jié)點(diǎn),其中不但物體可以做為節(jié)點(diǎn),燈光等別的東西也都是一個(gè)節(jié)點(diǎn),附屬在一起,描述出了整個(gè)3D的世界。
其實(shí)3D也沒(méi)有想象中那么難,只要把一些概念搞清楚了就可以了,有些概念我現(xiàn)在也不是很清楚,因?yàn)槲覀円话愕木幊棠J讲粫?huì)用到這些,所以我們對(duì)這方面的知識(shí)就比較缺乏,現(xiàn)在只是盡自己的可能把自己所理解的寫(xiě)出來(lái),一來(lái)可以讓大家也了解一下JAVA3D,二來(lái)也算是自己的一個(gè)學(xué)習(xí)歷程吧。
盡管千里冰封
依然擁有晴空
你我共同品味JAVA的濃香.