00000010.htm
来自「水木清华BBS」· HTM 代码 · 共 355 行 · 第 1/2 页
HTM
355 行
<HTML><HEAD> <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>发信人: vrml (3d), 信区: Java <BR>标 题: JAVA3D学习系列(10)--面的生成(下) <BR>发信站: BBS 水木清华站 (Fri Apr 9 22:08:14 1999) <BR> <BR> JAVA3D学习系列(10)----- 面的生成(下) <BR> <BR> <BR> 汕头大学机电系 张杰(<A HREF="mailto:jzhang@mailserv.stu.edu.cn)">jzhang@mailserv.stu.edu.cn)</A> <BR> <BR>***************************************** <BR>JAVA3D学习系列中的例题将有非常多的VRML程序与之相比较,因而 <BR>欢迎购买<<VRML2.0交互式三维图形编程>>一书。 <BR>特殊购书方式: <BR>1。作者售书 <BR>1。网上订购(email address: <A HREF="mailto:jzhang@mailserv.stu.edu.cn)">jzhang@mailserv.stu.edu.cn)</A> <BR>2。可以先获书,后汇款(不满意可退书), <BR> 只需将通信地址及邮编告知作者,即可在最短的时间内得到书。 <BR>3。书价为25元/本,免收邮购费用。 <BR>4。书为16开本,正文161页。 <BR>5. 购书可获盖有出版社财务章的收据。 <BR>6. 如果需要书中所有的源程序,我可以email一个打包程序 <BR>***************************************** <BR> <BR>一. IndexedTriangleArray生成的面 <BR> IndexedTriangleArray对象的定义为: <BR> IndexedTriangleArray (int vertexCount , int vertexFormat, <BR> int indexCount) <BR> 利用这个对象,我们可以从一个顶点数组中挑选一些顶点生成自己 <BR>所需要的三角片面。程序triShape5.java中,有一个10个点的数组,我们 <BR>从这个数组中选择了8个点,生成了三个面,其中有一个点用了两次,如果 <BR>所挑选的点都只用一次,则选择的点的数目必须为3的倍数。 <BR> 另外,在编程时,我们要注意点的旋转顺序,逆时针旋转和顺时针 <BR>旋转有时会产生不同的效果。 <BR> 程序中,vertexCount表示顶点数组顶点的总数,indexCount表示生成 <BR>的面的顶点个数,数值为面的个数的三倍,本例中,生成的面为三个,故 <BR>vertexCount为9。 <BR> <BR>//triShape5.java <BR> <BR>import javax.media.j3d.*; <BR> <BR>public class triShape5 extends Shape3D { <BR> private float vert[] = { <BR> -.6f , .6f ,.0f , <BR> -.6f , -.6f, .0f , <BR> -.3f , .6f ,.0f , <BR> -.3f , -.6f, .0f , <BR> -.0f , .6f ,.0f , <BR> -.0f , -.6f, .0f , <BR> .3f , .6f ,.0f , <BR> .3f , -.6f, .0f , <BR> .6f , .6f ,.0f , <BR> .6f , -.6f, .0f , <BR> }; <BR> <BR> private float color[] = { <BR> 1.0f,0.5f,0.0f, <BR> 1.0f,0.0f,0.5f, <BR> 1.0f,0.8f,0.0f, <BR> 5.0f,1.0f,0.0f, <BR> 0.0f,1.0f,0.5f, <BR> 0.9f,1.0f,0.0f, <BR> 0.5f,0.0f,1.0f, <BR> 0.0f,0.5f,1.0f, <BR> 1.0f,0.5f,0.0f, <BR> 1.0f,0.0f,0.5f, <BR> }; <BR> <BR> public triShape5() { <BR> int[] index={ 0 , 1 , 2 , 4 , 5 , 6 , 6 , 7 , 8 }; <BR> int VertexCount=9; <BR> IndexedTriangleArray tri = new IndexedTriangleArray(10, <BR> IndexedTriangleArray.COORDINATES| <BR> IndexedTriangleArray.COLOR_3 , VertexCount); <BR> tri.setCoordinates(0,vert); <BR> tri.setColors(0,color); <BR> tri.setCoordinateIndices(0,index); <BR> tri.setColorIndices(0,index); <BR> PolygonAttributes pa = new PolygonAttributes(); <BR> pa.setCullFace(PolygonAttributes.CULL_NONE); <BR> Appearance ap = new Appearance(); <BR> ap.setPolygonAttributes(pa); <BR> this.setGeometry(tri); <BR> this.setAppearance(ap); <BR> this.setGeometry(tri); <BR> } <BR>} <BR>//end of triShape5.java <BR> <BR>二. IndexedQuadArray生成的面 <BR> IndexedQuadArray对象的定义为: <BR> IndexedQuadArray (int vertexCount , int vertexFormat, <BR> int indexCount ) <BR> 利用这个对象,我们可以从一个顶点数组中挑选一些顶点生成自己 <BR>所需要的四个点所构成的平面。程序quadShape2.java中,有一个10个点 <BR>的数组,我们从这个数组中选择了7个点,生成了两个面,其中有一个点 <BR>用了两次,如果所挑选的点都只用一次,则选择的点的数目必须为4的倍数。 <BR>这些选中的点构成了数组index。在输入每一个顶点的坐标及颜色时,我们 <BR>用到了下面两种方法: <BR> setCoordinateIndices(0,index); <BR> setColorIndices(0,index); <BR> 程序中,vertexCount表示顶点数组顶点的总数,indexCount表示生成 <BR>的面的顶点个数,数值为面的个数的4倍,本例中,生成的面为两个,故 <BR>vertexCount为8。 <BR> 编写IndexedQuadArray应用程序时,我们仍然要注意下面几个问题。 <BR> 首先是四点应当共面,如果不共面,程序仍然可以编译 <BR>运行,但显示的内容为两个三角面。 <BR> 其次是四个点组成的面不应有凹点,这有点象VRML程序中 <BR>的Extrusion、IndexedFaceSet里的情况,当然,在VRML程序中 <BR>四个点构成的面可以有凹点,这时只需要在相应的节点内加上 <BR>一个参数: <BR> convex TRUE <BR> 而在JAVA3D程序中,如果QuadArray生成的面有凹点时, <BR>程序的显示结果会不正确。 <BR>//quadShape2.java <BR> <BR>import javax.media.j3d.*; <BR> <BR>public class quadShape2 extends Shape3D { <BR> private float vert[] = { <BR> -.6f , .6f , .0f , <BR> -.6f , -.6f, .0f , <BR> -.3f , .6f , .0f , <BR> -.3f , -.6f, .0f , <BR> -.0f , .6f , .0f , <BR> -.0f , -.6f, .0f , <BR> .3f , .6f , .0f , <BR> .3f , -.6f, .0f , <BR> .6f , .6f , .0f , <BR> .6f , -.6f, .0f , <BR> }; <BR> <BR> private float color[] = { <BR> 1.0f,0.5f,0.0f, <BR> 1.0f,0.0f,0.5f, <BR> 1.0f,0.8f,0.0f, <BR> 5.0f,1.0f,0.0f, <BR> 0.0f,1.0f,0.5f, <BR> 0.9f,1.0f,0.0f, <BR> 0.5f,0.0f,1.0f, <BR> 0.0f,0.5f,1.0f, <BR> 1.0f,0.5f,0.0f, <BR> 1.0f,0.0f,0.5f, <BR> }; <BR> <BR> public quadShape2() { <BR> int[] index={ 2 , 1 , 3 , 4 , 4 , 7 , 9 , 6}; <BR> int VertexCount=8; <BR> IndexedQuadArray quad = new IndexedQuadArray(10, <BR> IndexedQuadArray.COORDINATES| <BR> IndexedQuadArray.COLOR_3 , VertexCount); <BR> quad.setCoordinates(0,vert); <BR> quad.setColors(0,color); <BR> quad.setCoordinateIndices(0,index); <BR> quad.setColorIndices(0,index); <BR> PolygonAttributes pa = new PolygonAttributes(); <BR> pa.setCullFace(PolygonAttributes.CULL_NONE); <BR> Appearance ap = new Appearance(); <BR> ap.setPolygonAttributes(pa); <BR> this.setGeometry(quad); <BR> this.setAppearance(ap); <BR> this.setGeometry(quad); <BR> } <BR>} <BR>//end of quadShape2.java <BR> <BR> <BR>三. IndexedTriangleStripArray生成的面 <BR>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?