JAVA3D基础学习.docx_第1页
JAVA3D基础学习.docx_第2页
JAVA3D基础学习.docx_第3页
JAVA3D基础学习.docx_第4页
JAVA3D基础学习.docx_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

java3d整理java3d基础环境配置1.1安装jdk 1.2安装官网下载最新版本简单实例2.1新建java项目2.2导入基本jar包,jar包下载2.3编写代码package measoft.java3d.base;import java.applet.applet;import java.awt.borderlayout;import java.awt.graphicsconfiguration;import javax.media.j3d.appearance;import javax.media.j3d.background;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.transformgroup;import javax.vecmath.color3f;import javax.vecmath.point3d;import javax.vecmath.vector3f;import com.sun.j3d.utils.applet.mainframe;import com.sun.j3d.utils.geometry.cone;import com.sun.j3d.utils.universe.simpleuniverse;/* * 使用了simpleuniverse对象,使得基本步骤比较简单: * 1.创建一个canvas3d对象。 * 2.创建并定制一个simpleuniverse对象,该对象引用前一步创建的canvas3d对象 * 3.构建内容子图 * 4.编译内容子图 * 5.将内容子图插入simpleuniverse的locale中 * * * author j_nan * */public class mycone extends applet public branchgroup createscenegroup()/* * 一、 1.创建一个包含对象的数据结构2.生成坐标系3.将坐标系添加到跟节点上 4.设置场景 的有效范围 */branchgroup objroot = new branchgroup();transformgroup objtrans = new transformgroup();objroot.addchild(objtrans);boundingsphere bounds = new boundingsphere(new point3d(0.0,0.0,0.0),100.0);/* * 二、1. 创建背景颜色 2.设置背景边界 3.添加背景到场景中 */color3f bgcolor = new color3f(0.0f,0.0f,0.0f);background bg = new background(bgcolor);bg.setapplicationbounds(bounds);objroot.addchild(bg);/* * 三、1. 添加平行光 2.给指定的bounds设定光的范围界限 */color3f directionallightcolor = new color3f(1.f,1.f,1.f);vector3f vec = new vector3f(0.f,0.f,-1.0f);directionallight directionallight = new directionallight(directionallightcolor,vec);directionallight.setinfluencingbounds(bounds);objroot.addchild(directionallight);/* * 四、1.设置外观 2.设置材料 3.生成基本圆锥 */appearance app = new appearance();material material = new material(); material.setdiffusecolor(new color3f(10.f,1.0f,0.0f);app.setmaterial(material);cone cone = new cone(.5f,1.0f,1,app);objroot.addchild(cone);/* * 五、 返回objroot */return objroot;public mycone()setlayout(new borderlayout();graphicsconfiguration config = simpleuniverse.getpreferredconfiguration();/* * 第一步:canvas3d类提供了一个3d渲染绘图画布,构造并初始化一个新的canvas3d对象 */canvas3d c = new canvas3d(config);/* * 第二步:创建虚拟空间 */simpleuniverse u = new simpleuniverse(c);/* * 第三步:构建内容子图 */branchgroup scene = createscenegroup();/* * 第四步:编译内容子图 */pile();/* * 第五步:将内容子图插入simpleuniverse的locale中 */u.addbranchgraph(scene);add(center,c);/安放观察点u.getviewingplatform().setnominalviewingtransform();public static void main(string args) new mainframe(new mycone(),400,300);运行效果如图:编写java3d程序的一般步骤:a. scenegraphobject 的子类是构建场景图的基石。基本的java 3d程序由7个步骤组成,如下所示。这7个步骤就是编写java 3d 程序的一般步骤。这些步骤可以用来编写许多有用的java3d 程序。(1) 创建一个canvas3d对象。(2) 创建一个virtualuniverse对象。(3) 创建一个local对象。将它与virtualuniverse对象联系起来。(4) 构造视野子图。a. 创建一个view对象b. 创建一个viewplatform对象。c. 创建一个physicalbody对象d. 创建一个physicalenvironment对象e. 将viewplatform、physicalbody、physicalenvironment和canvas3d对象联系到view对象上(5) 构造内容子图(6) 编译子图(7) 将子图插入到localeb. 使用了simpleuniverse对象使基本步骤更简单。下面列出了基本步骤,其中的第(2)步取代了原来的第(2)(4)步(1) 创建一个canvas3d对象(2) 创建并定制一个simpleuniverse对象,该对象引用前一步创建的canvase3d对象。(3) 构建内容子图(4) 编译内容子图(5) 将内容子图插入simpleuniverse的locale中java 3d 常用类介绍simpleuniverse类使用simpleuniverse类进行java 3d编程可以显著减少创建视野子图所需要的时间和工作量。使程序员可以有更多的时间来考虑场景的内容。 这个类创建了一个最小的用户环境以使java 3d程序可以运行,创建一个视野子图所必须的所有对象。明确地说,这个类创建了locale、virtualuniverse、viewingplatform和viewer对象(都具有特定的默认值)。这些对象默认地被设置为恰当的值,使它们可以构成一个合适的视野子图。simpleuniverse提供了大部分java 3d应用程序所必须的功能。viewer和viewingplatform 是方便的工具类。这些类使用了view和viewplatform核心类simpleuniverse():创建一个简单的虚拟空间simpleuniverse(canvas3d canvas3d):创建一个简单的虚拟空间,并指定一个canvas3d参数simpleuniverse对象创建了一个完整的虚拟世界视野子图。视野子图包括一个图像板(image plate)图像板是一个概念上的矩形,经过渲染系统渲染得到的图像就投影到这个平面上。canvas3d对象就是显示器上窗口中显示的衣服图片对应的对象,同时它可以认为就是图像板块默认的,图像板剧中放置于simpleuniverse的原点。默认的方向是与z轴垂直。从这个位置,x轴水平穿过图像板,右侧是正半轴。y轴垂直地穿过图像板,上面是正半轴。结果点(0,0,0)位于图像版的正中间查看apibranchgroup类该类型的对象用于构建场景图。branchgroup的实例是子图的根节点。branchgroup对象是locale唯一允许的子节点对象。branchgroup对象可以拥有多个子节点。branchgroup对象的子节点可以使其他的group或者leaf对象。 方法 branchgroup()生成branchgroup的实例作为场景图分支的根节点。branchgroup是唯一可以插入到locale的对象。查看apicanvas3d 类canvas3d类继承自awt的canvas类。一个canvas3d对象必须在场景图的视野子图中被渲染。如果想知道关于canvas类的更多信息请查询awt的参考文档canvas3d(graphicsconfiguration graphicsconfiguration)创建并初始化一个新的canvas3d对象,java 3d可以根据一个有效的graphicsconfiguration对象进行渲染。这是awt的canvas类的一个扩充查看apitransform3d 类transform3d 对象表示3d几何体的变换,比如平移和旋转,该对象通常只用于创建transformgroup对象,首先创建一个transform3d对象,当然可能根据若干transform3d对象的组合来创建。然后使用创建出来的transform3d对象创建transformgroup对象。在场景图中是没有transform3d对象的。它只用于指定transformgroup对象的变换, 一个transform3d对象可以表示平移、旋转、缩放或者这些变换的组合。当指定了一个旋转变换是,角度是一弧度来表达的,查看apitransformgroup类作为group类的子类transformgroup的实例用于创建场景图,而且它还可以拥有子节点的几何变换。transfromgroup对象保存的是平移旋转缩放之类的几何变换,通常创建transformgroup的时候需要指定对应的transform3d对象。transformgroup负责保存场景图中的变换,常用方法:transformgroup():创建并初始化一个transformgroup对象,变换矩阵为单位矩阵transformgroup(transform3d t):根据给定的transform3d 参数创建并初始化一个transformgroup对象。查看api简单示例package com.test.java3d;import java.applet.applet;import java.awt.borderlayout;import javax.media.j3d.*;import javax.vecmath.*;import com.sun.j3d.utils.applet.*;import com.sun.j3d.utils.behaviors.mouse.*;import com.sun.j3d.utils.geometry.cone;import com.sun.j3d.utils.universe.simpleuniverse;public class conedisplay extends applet public branchgroup createscenegroup()branchgroup branchgrouproot = new branchgroup();boundingsphere bounds = new boundingsphere(new point3d(0.0,0.0,0.0),100.0);background bg = new background(new color3f(1.0f,1.0f,0.0f);bg.setapplicationbounds(bounds);branchgrouproot.addchild(bg);directionallight directionallight = new directionallight(new color3f(1.0f,0.0f,0.0f),new vector3f(0.0f,0.0f,-1.0f);directionallight.setinfluencingbounds(bounds);branchgrouproot.addchild(directionallight);transformgroup transformgroup = new transformgroup();/* * allow_transform_read * specifies that the node allows access to its objects transform information. * allow_transform_write * specifies that the node allows writing its objects transform information. */transformgroup.setcapability(transformgroup.allow_transform_read);transformgroup.setcapability(transformgroup.allow_transform_write);branchgrouproot.addchild(transformgroup);/* * 旋转 * mouserotate is a java3d behavior object that lets users control the rotation of an object via a mouse */mouserotate mouserotate = new mouserotate(transformgroup);/* * set the behaviors scheduling region to the specified bounds * this is used when the scheduling bounding leaf is set to null */mouserotate.setschedulingbounds(bounds);branchgrouproot.addchild(mouserotate);/* * 缩进 * mousezoom is a java3d behavior object that * lets users control the z axis translation of * an object via a mouse drag motion with the second mouse button */mousezoom mousezoom = new mousezoom(transformgroup);/* * set the behaviors scheduling region to the specified bounds. * this is used when the scheduling bounding leaf is set to null */mousezoom.setschedulingbounds(bounds);branchgrouproot.addchild(mousezoom);/* * 拖动 * mousetranslate is a java3d behavior object that * lets users control the translation (x, y) of * an object via a mouse drag motion with the third mouse button (alt-click on pc). * see mouserotate for similar usage info. */mousetranslate mousetranslate = new mousetranslate(transformgroup);/* * set the behaviors scheduling region to the specified bounds. * this is used when the scheduling bounding leaf is set to null. */mousetranslate.setschedulingbounds(bounds);branchgrouproot.addchild(mousetranslate);appearance appearance = new appearance();material material = new material();material.setdiffusecolor(new color3f(1.0f,0.0f,0.0f);appearance.setmaterial(material);cone cone = new cone(0.5f,1.0f,appearance);transformgroup.addchild(cone);branchgrouprpile();return branchgrouproot;public conedisplay()setlayout(new borderlayout();canvas3d c =new canvas3d(simpleuniverse.getpreferredconfiguration();add(center,c);simpleuniverse u = new simpleuniverse(c);u.addbranchgraph(createscenegroup();u.getviewingplatform().setnominalviewingtransform();public static void main(string args) new mainframe(new conedisplay(),300,300);导入3d图形文件虽说java 3d可以构造出一些漂亮的几何形体,但是要想通过程序来构造复杂的几何形体,其难度是可想而知的。java 3d作为一套优秀的api,考虑到了这一点,提供了一组可以用来导入一些常用的3d图形文件的接口,这些接口可以将这些文件转化为java 3d可以识别的数据结构,这样这程序中就可以显示复杂的几何形体了。loaderjava3d现在还没有自己的文件格式,是一套能够实时渲染3d图形的api,java 3d导入文件是通过loader实现的。loader负责读入文本或者二进制文件,然后转换成java 3d支持的数据结构.obj.obj格式文件下载例子:package measoft.java3d.base;import java.applet.applet;import java.awt.borderlayout;import java.io.filenotfoundexception;import javax.media.j3d.alpha;import javax.media.j3d.ambientlight;import javax.media.j3d.appearance;import javax.media.j3d.background;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.rotationinterpolator;import javax.media.j3d.transform3d;import javax.media.j3d.transformgroup;import javax.vecmath.color3f;import javax.vecmath.point3d;import javax.vecmath.vector3f;import com.sun.j3d.loaders.incorrectformatexception;import com.sun.j3d.loaders.parsingerrorexception;import com.sun.j3d.loaders.scene;import com.sun.j3d.loaders.objectfile.objectfile;import com.sun.j3d.loaders.vrml97.vrmlloader;import com.sun.j3d.utils.applet.mainframe;import com.sun.j3d.utils.behaviors.mouse.mouserotate;import com.sun.j3d.utils.behaviors.mouse.mousetranslate;import com.sun.j3d.utils.behaviors.mouse.mousezoom;import com.sun.j3d.utils.universe.simpleuniverse;public class objloader extends applet public branchgroup createscenegraph(string filename) branchgroup objroot = new branchgroup();boundingsphere bounds = new boundingsphere(new point3d(0.0, 0.0, 0.0),100.0);/背景background bg = new background(new color3f(0.8f, 0.5f, 0.0f);bg.setapplicationbounds(bounds);objroot.addchild(bg);color3f lightcolor1 = new color3f(0.0f, 1.0f, 1.0f);vector3f lightdirection1 = new vector3f(4.0f, -7.0f, -12.0f);color3f lightcolor2 = new color3f(0.3f, 0.3f, 0.4f);vector3f lightdirection2 = new vector3f(-0.6f, -0.2f, -1.0f);color3f ambientcolor = new color3f(0.1f, 0.1f, 0.1f);/ 环境光ambientlight ambientlight = new ambientlight(ambientcolor);ambientlight.setinfluencingbounds(bounds);objroot.addchild(ambientlight);/ 创建两束直射光,并添加到跟分支节点directionallight light1 = new directionallight(lightcolor1,lightdirection1);light1.setinfluencingbounds(bounds);objroot.addchild(light1);directionallight light2 = new directionallight(lightcolor2,lightdirection2);light1.setinfluencingbounds(bounds);objroot.addchild(light2);/ 创建一个变换组叶节点,并添加到分支节点/ 该节点允许 transform_write功能,因此程序可以在运行的时候改变行为transformgroup objtrans = new transformgroup();objtrans.setcapability(transformgroup.allow_transform_write);objroot.addchild(objtrans);/使物体能够旋转alpha rotationalpha = new alpha(-1, alpha.increasing_enable, 0, 0,4000, 0, 0, 0, 0, 0);transform3d yaxis = new transform3d();rotationinterpolator rotator = new rotationinterpolator(rotationalpha,objtrans, yaxis, 0.0f, (float) math.pi * 2.0f);rotator.setschedulingbounds(bounds);objtrans.addchild(rotator);/ 建立导入模型所在的变换组分支节点,添加到跟分支节点transformgroup objtg = new transformgroup();objtg.setcapability(transformgroup.allow_transform_write);objtg.setcapability(transformgroup.allow_transform_read);transform3d g = new transform3d();objtg.gettransform(g);/缩小0.5倍g.setscale(0.5);objtg.settransform(g);objtrans.addchild(objtg);/ 创建objectfile对象,指明属性int flags = objectfile.resize;objectfile f = new objectfile(flags, (float) (49.0 * math.pi / 180.0);/ 创建场景叶节点,导入obj文件scene s = null;try s = f.load(filename); catch (filenotfoundexception e) /处理文件不存在system.out.println(e);system.exit(1);/ 处理分析文件遇到问题的异常 catch (parsingerrorexception e) system.out.println(e);system.exit(1); catch (incorrectformatexception e) system.out.println(e);system.exit(1);/ 将场景叶节点添加到3d模型所在的变换组分支节点objtg.addchild(s.getscenegroup();objrpile();return objroot;public objloader(string filename) / 指明所要导入的文件filename = d:/ateneal.obj;this.setlayout(new borderlayout();canvas3d c = new canvas3d(simpleuniverse.getpreferredconfiguration();this.add(center, c);simpleuniverse u = new simpleuniverse(c);u.addbranchgraph(createscenegraph(filename);u.getviewingplatform().setnominalviewingtransform();public static void main(string args) new mainframe(new objloader(null), 500, 500);运行如图:.wrl下载.wrl格式文件下载vrml97.jar包除了基本的java 3d jar包外再下载vrml97.jar,并导入进项目中import java.applet.applet;import java.awt.borderlayout;import javax.media.j3d.ambientlight;import javax.media.j3d.background;import javax.media.j3d.boundingsphere;import javax.media.j3d.branchgroup;import javax.media.j3d.canvas3d;import javax.media.j3d.directionallight;import javax.media.j3d.transform3d;import javax.media.j3d.transformgroup;import javax.vecmath.color3f;import javax.vecmath.point3d;import javax.vecmath.vector3f;import com.sun.j3d.loaders.scene;import com.sun.j3d.loaders.vrml97.vrmlloader;import com.sun.j3d.utils.applet.mainframe;import com.sun.j3d.utils.behaviors.mouse.mouserotate;import com.sun.j3d.utils.behaviors.mouse.mousetranslate;import com.sun.j3d.utils.behaviors.mouse.mousezoom;import com.sun.j3d.utils.geometry.colorcube;import com.sun.j3d.utils.universe.simpleuniverse;public class wrlloader extends applet public branchgroup createscenegraph(string filename) branchgroup objroot = new branchgroup();boundingsphere bounds = new boundingsphere(new point3d(0.0, 0.0, 0.0),100.0);/背景background bg = new background(new color3f(0.8f, 0.5f, 0.0f);bg.setapplicationbounds(bounds);objroot.addchild(bg);vector3f lightdirection1 = new vector3f(4.0f, -7.0f, -12.0f);color3f ambientcolor = new color3f(0.1f, 0.1f, 0.1f);/ 创建环境光,并添加到跟分支节点ambientlight ambientlight = new ambientlight(ambientcolor);ambientlight.setinfluencingbounds(bounds);objroot.addchild(ambientlight);/ 创建两束直射光,并添加到跟分支节点directionallight light1 = new directionallight(new color3f(new color3f(240,240,120),lightdirection1);light1.setinfluencingbounds(bounds);objroot.addchild(light1);/ 创建一个变换组叶节点,并添加到分支节点/ 该节点允许 transform_write功能,因此程序可以在运行的时候改变行为transformgroup objtrans = new transformgr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论