00000007.htm

来自「水木清华BBS」· HTM 代码 · 共 528 行 · 第 1/3 页

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

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?