千里冰封
          JAVA 濃香四溢
          posts - 151,comments - 2801,trackbacks - 0
          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.5f00);
                  
          //設置它的位置,為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.2f0.50f,app);
                  
          //把圓柱加入到變換組合中,使它可以被變換
                  objTrans.addChild(box);
                  
          //把整個變換組件加入到分支組合中
                  objRoot.addChild(objTrans);
                  
          //作用的空間范圍 
                  BoundingSphere bounds = new BoundingSphere(new Point3d(0.00.00.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 千里冰封 閱讀(5723) 評論(7)  編輯  收藏 所屬分類: JAVA擴展

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

          打個比方:某地產展示廳樓盤演示系統 在大廳里布置多臺用戶端計算機,集中一臺服務器管理,客戶可以從用戶端通過網頁瀏覽樓盤戶型的3D場景、虛擬漫游,并可查看多種戶型,基于于程序的靈活性,可以實現點取解說等效果。而當展示內容有所更改時只需要在服務器端更換程序即可,對用戶端要求比較低

          我是這么想的~不知還有沒有別的用途  回復  更多評論
            
          # re: JAVA3D學習(1)
          2008-10-02 18:07 |
          版主:向你學習,西安,qq87719230
          cnip@163.com  回復  更多評論
            
          主站蜘蛛池模板: 临城县| 舞钢市| 长岛县| 安康市| 夹江县| 喀什市| 武汉市| 勐海县| 石屏县| 深泽县| 延长县| 湟源县| 兴和县| 文安县| 中西区| 轮台县| 周至县| 德阳市| 曲水县| 鹤岗市| 扶余县| 宜君县| 东乌珠穆沁旗| 富裕县| 和政县| 蒙山县| 和龙市| 筠连县| 凉城县| 揭东县| 景东| 许昌县| 通道| 肥东县| 边坝县| 陆良县| 镇坪县| 宽城| 石景山区| 临城县| 聂拉木县|