00000007.htm
来自「水木清华BBS」· HTM 代码 · 共 528 行 · 第 1/3 页
HTM
528 行
<HTML><HEAD> <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>发信人: vrml (3d), 信区: Java <BR>标 题: JAVA3D学习系列(7)--点的生成 <BR>发信站: BBS 水木清华站 (Wed Apr 7 16:18:25 1999) <BR> <BR> JAVA3D学习系列之7---点的生成 <BR> <BR> 汕头大学机电系 张杰(<A HREF="mailto:jzhang@mailserv.stu.edu.cn)">jzhang@mailserv.stu.edu.cn)</A> <BR> <BR> <BR>( 在前面(第6部分)我们介绍了如何编写JAVA3D三维基本形体的) <BR>( 程序,需要指出的是,我们将前面的SimpleCone.java程序修改为) <BR>( 其它形体时,我们需要同时修改import语句的类型,或者干脆将 ) <BR>( 相应的那个import语句修改成: ) <BR>( import com.sun.j3d.utils.geometry.*; ) <BR> <BR> JAVA3D编程过程中,我们经常要编写一些点、线、面,JAVA3D所提供 <BR>的API中有许多这方面的对象,下面我们开始一一介绍它们的使用方法。 <BR> <BR>一. 点的生成 <BR> 我们先用VRML编写一个带有不同颜色的六个点的程序。 <BR>//Point.wrl ----观测点在 (0 0 10) <BR> <BR>#VRML V2.0 utf8 <BR>Shape { <BR> geometry PointSet { <BR> coord Coordinate { <BR> point [.8 .8 .0, -.8, .8 0, .5 0 0, <BR> -.5 0 0, -.8 -.8 0, .8 -.8 0]} <BR> color Color{ <BR> color [ .0 .5 1., .5 .0 1, 0 .8 .2, <BR> 1 0 .3, 0 1 .3, .3 .8 0 ]} <BR> }} <BR> <BR>#end of Point.wrl <BR> 由程序可知,VRML程序中的点非常小,且无法变大。 <BR> <BR> 下面我们改用JAVA3D编写同样的程序,不过由于观测 <BR>点不同,观测效果有差异,VRML程序中的点比较集中,JAVA3D <BR>程序中的点比较分散,程序如下: <BR>//Point1.java -----观测点在( 0 0 2.41 ) <BR> <BR>import java.applet.Applet; <BR>import java.awt.BorderLayout; <BR>import com.sun.j3d.utils.applet.MainFrame; <BR>import com.sun.j3d.utils.universe.*; <BR>import javax.media.j3d.*; <BR>import javax.vecmath.*; <BR> <BR>public class Point1 extends Applet { <BR> <BR> public BranchGroup createSceneGraph() { <BR> BranchGroup objRoot = new BranchGroup(); <BR> <BR> float vert[] = { <BR> .8f, 0.8f,0.0f, <BR> -0.8f, 0.8f,0.0f, <BR> 0.5f, 0.0f,0.0f, <BR> -0.5f, 0.0f,0.0f, <BR> -0.8f,-0.8f,0.0f, <BR> 0.8f,-0.8f,0.0f, <BR> }; <BR> <BR> float color[] = { <BR> 0.0f,0.5f,1.0f, <BR> 0.5f,0.0f,1.0f, <BR> 0.0f,0.8f,0.2f, <BR> 1.0f,0.0f,0.3f, <BR> 0.0f,1.0f,0.3f, <BR> 0.3f,0.8f,0.0f, <BR> }; <BR> Shape3D shape = new Shape3D(); <BR> PointArray point = new PointArray(6, PointArray.COORDINATES <BR> |PointArray.COLOR_3); <BR> point.setCoordinates(0,vert); <BR> point.setColors(0,color); <BR> shape.setGeometry(point); <BR> <BR> objRoot.addChild(shape); <BR> objRoot.compile(); <BR> return objRoot; <BR> } <BR> <BR> public Point1() { <BR> setLayout(new BorderLayout()); <BR> Canvas3D c = new Canvas3D(null); <BR> add("Center", c); <BR> BranchGroup scene = createSceneGraph(); <BR> SimpleUniverse u = new SimpleUniverse(c); <BR> u.getViewingPlatform().setNominalViewingTransform(); <BR> u.addBranchGraph(scene); <BR> } <BR> <BR> public static void main(String[] args) { <BR> new MainFrame(new Point1(), 400,400); <BR> } <BR>} <BR> <BR>//end of Point1.java <BR> <BR> 我们来分析一下上面的Point1.java。 <BR> 我们知道,编写JAVA3D程序实际上是编写一个特定的场景图, <BR>给出了场景图中带有形体及其属性的一个分支(BranchGrou)和 <BR>表示观察位置等数据的另一个分支(View Platform)。一般来说, <BR>表示观测位置的分支可以用JAVA3D的UTILITY来完成,因而我们可 <BR>以看到,在Point1.java中,构造函数Point1和前面介绍的 <BR>SimpleCone.java的构造函数SimpleCone内容完全一样。两个程序 <BR>的不同之处在于形体构造及处理分支,即createSceneGraph方法的 <BR>定义。 <BR> 我们来看一下Point1.java的createScendGraph方法的定义。 <BR> 在这个方法里,程序先定义了一个分支objRoot,然后用数组 <BR>的形式定义了六个顶点坐标vert和六种颜色color,再用PointArray <BR>定义了一组点point,并将顶点坐标及颜色赋值给point,由于JAVA3D <BR>中的PointArray点是Shape3D的子类,它不能直接放入一个BranchGroup, <BR>因而我们还要先定义一个Shape3D对象shape,再将point赋予shape, <BR>这样point就可以放入BranchGroup类型的对象objRoot中了。 <BR> <BR>二. PointArray、IndexedPointArray介绍 <BR> JAVA3D提供的API中,可用于生成Point的对象有: <BR> PointArray <BR> IndexedPointArray <BR> <BR>1. PointArray <BR> PointArray的构造函数为: <BR> PointArray( int vertexCount, int vertexFormat ); <BR> 这里,vertexCount表示应生成的点的数目, <BR> vertexFormat表示所需要的顶点的格式。 <BR> <BR> 点、线、面几何体所需要的顶点的格式有: <BR> COORDINATES 顶点坐标数组 <BR> NORMALS 顶点法向数组 <BR> COLOR_3 不带alpha值的颜色数组 <BR> COLOR_4 带alpha值的颜色数组 <BR> TEXTURE_COORDINATE_2 二维纹理坐标数组 <BR> TEXTURE_COORDINATE_3 三维纹理坐标数组 <BR> Point1.java程序用到了COORDINATES和COLOR_3。 <BR> <BR>2. IndexedPointArray <BR> IndexedPointArray的构造函数为: <BR> IndexedPointArray( int vertexCount, int vertexFormat, <BR> int indexCount ); <BR> 利用本函数,我们可以从众多的点中,选择特定的点来显示。 <BR> 这里,vertexCount表示顶点坐标数组所提供的点的总个数, <BR> indexCount表示最终应生成的点的个数。 <BR> <BR>三. 20像素大小的点的生成 <BR> JAVA3D可以生成任意大小的点,并且可以使点为方点或圆点。 <BR> 下面的程序生成了一个20像素大小的程序。 <BR>//Point2.java <BR>import java.applet.Applet; <BR>import java.awt.BorderLayout; <BR>import com.sun.j3d.utils.applet.MainFrame; <BR>import com.sun.j3d.utils.universe.*; <BR>import javax.media.j3d.*; <BR>import javax.vecmath.*; <BR> <BR>public class Point2 extends Applet { <BR> <BR> public BranchGroup createSceneGraph() { <BR> BranchGroup objRoot = new BranchGroup(); <BR> <BR> float vert[] = { <BR> .8f, 0.8f,0.0f, <BR> -0.8f, 0.8f,0.0f, <BR> 0.5f, 0.0f,0.0f, <BR> -0.5f, 0.0f,0.0f, <BR> -0.8f,-0.8f,0.0f, <BR>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?