转载http://www.blogjava.net/hadeslee/archive/2007/10/05/j3d1.html
来源:互联网 发布:建筑软件开发公司 编辑:程序博客网 时间:2024/05/21 10:15
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();
}
}
* 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场景、虚拟漫游,并可查看多种户型,基于于程序的灵活性,可以实现点取解说等效果。而当展示内容有所更改时只需要在服务器端更换程序即可,对用户端要求比较低
我是这么想的~不知还有没有别的用途 回复 更多评论
打个比方:某地产展示厅楼盘演示系统 在大厅里布置多台用户端计算机,集中一台服务器管理,客户可以从用户端通过网页浏览楼盘户型的3D场景、虚拟漫游,并可查看多种户型,基于于程序的灵活性,可以实现点取解说等效果。而当展示内容有所更改时只需要在服务器端更换程序即可,对用户端要求比较低
我是这么想的~不知还有没有别的用途 回复 更多评论
# re: JAVA3D学习(1)
2008-10-02 18:07 | 陈
版主:向你学习,西安,qq87719230
cnip@163.com 回复 更多评论
cnip@163.com 回复 更多评论
- 转载http://www.blogjava.net/hadeslee/archive/2007/10/05/j3d1.html
- 生成随机数(转贴) http://www.blogjava.net/flyleer/archive/2007/10/05/150582.html
- VC连接数据库 --转载于http://www.blogjava.net/blogpig/archive/2007/06/15/124429.html
- Ibatis学习随笔 --转载http://www.blogjava.net/pdw2009/archive/2007/01/04/91844.html
- Webdings字体图案 http://www.blogjava.net/majianan/archive/2007/05/04/88726.html
- http://www.blogjava.net/cheneyfree/archive/2007/05/26/120168.html
- 多线程Java Socket编程示例(http://www.blogjava.net/sterning/archive/2007/10/15/152940.html)
- Java基于Socket文件传输示例 --- (http://www.blogjava.net/sterning/archive/2007/10/13/152508.html)
- 理解Java ClassLoader机制(转自http://www.blogjava.net/pandawang/archive/2007/10/05/64639.html)
- 理解Java ClassLoader机制 (转载http://www.blogjava.net/pandawang/archive/2006/08/20/64639.html)
- 转载请注明出处: http://www.blogjava.net/zh-weir/archive/2013/08/14/402821.html
- javascript语言中的闭包http://www.blogjava.net/zkjbeyond/archive/2006/05/19/47025.html
- http://www.blogjava.net/auditionlsl/archive/2009/05/26/278011.html
- http://www.blogjava.net/zh-weir/archive/2011/05/01/349360.html
- http://www.blogjava.net/yongboy/archive/2015/11/05/410636.html
- http://www.blogjava.net/robbie/archive/2009/04/05/264003.html
- lucene的中文分词器http://www.blogjava.net/dreamstone/archive/2007/06/22/125726.html
- Compass学习文档 (转) ,来自http://www.blogjava.net/liuwentao253/archive/2007/02/06/98210.html
- hp -ux 下不能显示中文方法
- 信任是最好的管理
- Submit The Form When The User Presses Enter
- 从概念设计到信息架构
- 高EQ谈判技巧的学习
- 转载http://www.blogjava.net/hadeslee/archive/2007/10/05/j3d1.html
- 盘点:10个你需要知道的开源服务器技术
- java mysql 中文乱码
- WiMax与Wi-Fi、3G的区别
- 大型网站架构系列
- 喜欢上本多孝好的文字
- 函数
- weblogic
- C/C++传递二维数组[转载]