千里冰封
          JAVA 濃香四溢
          posts - 151,comments - 2801,trackbacks - 0
          JAVA3D之HelloWorld

          很早就聽(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.5f00);
                  
          //設(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.2f0.50f,app);
                  
          //把圓柱加入到變換組合中,使它可以被變換
                  objTrans.addChild(box);
                  
          //把整個(gè)變換組件加入到分支組合中
                  objRoot.addChild(objTrans);
                  
          //作用的空間范圍 
                  BoundingSphere bounds = new BoundingSphere(new Point3d(0.00.00.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的濃香.
          posted on 2007-10-05 00:54 千里冰封 閱讀(5723) 評(píng)論(7)  編輯  收藏 所屬分類(lèi): JAVA擴(kuò)展

          FeedBack:
          # re: JAVA3D學(xué)習(xí)(1)
          2007-10-05 02:18 | sonicluo3
          我也寫(xiě)過(guò)一些關(guān)于Java3D的小程序,沒(méi)有太過(guò)深入的研究,但個(gè)人感覺(jué)在效率上面不太高.  回復(fù)  更多評(píng)論
            
          # re: JAVA3D學(xué)習(xí)(1)
          2007-10-05 02:20 | sonicluo3
          我覺(jué)得學(xué)習(xí)Java3D最好就是看它的demo了,不過(guò)要開(kāi)發(fā)比較大的程序的話.單單看demo是不行的  回復(fù)  更多評(píng)論
            
          # re: JAVA3D學(xué)習(xí)(1)
          2007-10-05 08:57 | 千里冰封
          呵呵,其實(shí)對(duì)JAVA3D大家或許有點(diǎn)誤解,JAVA3D其實(shí)也是能做3D游戲的  回復(fù)  更多評(píng)論
            
          # re: JAVA3D學(xué)習(xí)(1)
          2007-10-05 08:57 | 千里冰封
          大型的不一定好做,小型的也挺不錯(cuò)的  回復(fù)  更多評(píng)論
            
          # re: JAVA3D學(xué)習(xí)(1)
          2007-10-05 10:42 | 翔南
          呵呵
          學(xué)習(xí)了!!
          我也去試試!  回復(fù)  更多評(píng)論
            
          # re: JAVA3D學(xué)習(xí)(1)
          2007-10-06 20:00 | 李想
          個(gè)人覺(jué)得其前途還是在網(wǎng)頁(yè)應(yīng)用上

          打個(gè)比方:某地產(chǎn)展示廳樓盤(pán)演示系統(tǒng) 在大廳里布置多臺(tái)用戶端計(jì)算機(jī),集中一臺(tái)服務(wù)器管理,客戶可以從用戶端通過(guò)網(wǎng)頁(yè)瀏覽樓盤(pán)戶型的3D場(chǎng)景、虛擬漫游,并可查看多種戶型,基于于程序的靈活性,可以實(shí)現(xiàn)點(diǎn)取解說(shuō)等效果。而當(dāng)展示內(nèi)容有所更改時(shí)只需要在服務(wù)器端更換程序即可,對(duì)用戶端要求比較低

          我是這么想的~不知還有沒(méi)有別的用途  回復(fù)  更多評(píng)論
            
          # re: JAVA3D學(xué)習(xí)(1)
          2008-10-02 18:07 |
          版主:向你學(xué)習(xí),西安,qq87719230
          cnip@163.com  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 灵川县| 古交市| 凌云县| 平利县| 安溪县| 宝山区| 竹山县| 晴隆县| 监利县| 武义县| 长治县| 志丹县| 高唐县| 伊宁市| 夏邑县| 库车县| 青岛市| 普兰店市| 柳江县| 德惠市| 宜城市| 离岛区| 车致| 星子县| 江永县| 涿州市| 卓资县| 屏南县| 蓬溪县| 东源县| 龙陵县| 南雄市| 子长县| 弥渡县| 天全县| 禹州市| 临城县| 崇文区| 嘉黎县| 新乡县| 威宁|