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


尽管千里冰封
依然拥有晴空

你我共同品味JAVA的浓香.

posted on 2007-10-05 00:54 千里冰封 阅读(1562) 评论(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  回复  更多评论
  

转载http://www.blogjava.net/hadeslee/archive/2007/10/05/j3d1.html相关推荐

  1. http://www.blogjava.net/pdw2009/archive/2007/10/08/151180.html

    编辑器加载http://www.blogjava.net/pdw2009/archive/2007/10/08/151180.html中... 转载于:https://www.cnblogs.com/ ...

  2. http://www.blogjava.net/beansoft/archive/2007/03/09/102812.html

    http://www.blogjava.net/beansoft/archive/2007/03/09/102812.html

  3. 成功的背后!(给所有IT人)(转载来自http://blog.csdn.net/ysuncn/archive/2007/10/07/1814127.aspx)

    成功的背后,有着许多不为人知的故事,而正是这些夹杂着泪水和汗水的过去,才成就了一个个走向成功的普通人.   凌晨两点半,早已习惯了一个人坐在电脑前的我,望着屏幕,任思绪在暗夜的包容下静静流淌,时光仿佛 ...

  4. (转自http://www.blogjava.net/moxie/archive/2006/10/20/76375.html)WebWork深入浅出

    (转自http://www.blogjava.net/moxie/archive/2006/10/20/76375.html) WebWork深入浅出 本文发表于<开源大本营> 作者:钱安 ...

  5. Eclipse Rcp系列 http://www.blogjava.net/dreamstone/archive/2007/02/08/98706.html

    Eclise Rcp 系列一 第一个SWT程序 写在开始: 由于工作须要,做了一周时间的Rcp开发,发现由于Eclipse开发方面的中文资料较少,对入门者来说有些困难, 所以把自己一周的内容放上,共享 ...

  6. 六种异常处理的陋习(转自http://www.blogjava.net/freeman1984/archive/2007/09/27/148850.html)...

    六种异常处理的陋习 你觉得自己是一个Java专家吗?是否肯定自己已经全面掌握了Java的异常处理机制?在下面这段代码中,你能够迅速找出异常处理的六个问题吗? 1 OutputStreamWriter ...

  7. 归并排序(转载http://www.cnblogs.com/jillzhang/archive/2007/09/16/894936.html)

    归并排序是利用递归和分而治之的技术将数据序列划分成为越来越小的半子表,再对半子表排序,最后再用递归步骤将排好序的半子表合并成为越来越大的有序序列,归并排序包括两个步骤,分别为: 1)划分子表 2)合并 ...

  8. swt入门---http://www.blogjava.net/dreamstone/archive/2007/08/02/134074.html

    swt入门 --常用组件的使用 swt的常用组件button ,text ,combo,list ,还有一些容器类composite ,group,这里选择几个,列写简单的用法 不写解释了,因为代码很 ...

  9. http://www.blogjava.net/woxingwosu/archive/2008/01

    Java克隆Clone ☆什么是Clone Clone就是得到一个对象x的副本,而且x.clone() != x.Clone分为两种:浅度克隆Shallow Clone和浅度克隆Deep Clone ...

最新文章

  1. Android控件ActionBar浅析及适配2.x的方法介绍
  2. 启动非java虚拟机方式下运行matlab
  3. Android网络图片加载缓存处理库的使用---第三方库学习笔记(五)
  4. python 字符串替换_Python基础教程,第四讲,字符串详解
  5. Win7+VMware10.0+CentOS 6.4+Tomcat,Win7访问不了CentOS6.4上的Tomcat
  6. python自动化读取和写入文件_基于Python的接口自动化实战-基础篇之读写配置文件...
  7. spring催办业务_业务后台系统之流程设计
  8. Unity3D 学习教程 14 C# 旋转镜头
  9. 整理30份酷炫可视化大屏模板,一个代码不用敲,半天学不会来找我
  10. stringstream常见用法介绍
  11. 中断linux命令快捷键_基于Linux终端命令行的快捷键的详细解析
  12. Redis实战(11)高级特性(3)持久化
  13. 修改hadoop配饰文件文件后导致hive无法找到原有的dfs文件
  14. 手写minist的DataLoader
  15. 全网首发C++ OBS源码分析与屏幕录制软件开发视频教程
  16. Android常见面试题字节跳动、阿里、腾讯2019实习生Android岗部分面试题
  17. HC-SR501 人体红外感应模块 单片机
  18. BZOJ3387栅栏(另一种解法:spfa)
  19. 旅行商问题(遗传算法)
  20. cad黑色背景变成白色_盘点CAD中你可能不知道的实用小技巧

热门文章

  1. FlatList 更新指定的Item
  2. 三星970evp pro 在 usb3.x gen2接口下的表现
  3. 【自学Java】Java语言数组赋值
  4. 苹果应用雷达提供对苹果App Store排名的宏观分析服务
  5. stata语言是用C语言开发,在Stata中编写估计命令:编写C语言插件
  6. 第一次使用Egret开发微信小游戏经验总结(包括排行榜排序,每周一数据清零,超越好友等处理)
  7. android功耗iphone,iPhone到底比Android好在哪,你知道吗?
  8. php 微信公众号自定义菜单
  9. 笔记本电脑在AHCi模式下识别不到硬盘2
  10. docker将已有的镜像打包成.tar.gz以及载入镜像