JAVA3D学习(1) 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,二来也算是自己的一个学习历程吧。

原文:http://www.blogjava.net/hadeslee/archive/2007/10/05/j3d1.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值