java3d面生成体_JAVA3D学习系列(10)--面的生成(下)

JAVA3D学习系列(10)----- 面的生成(下)

汕头大学机电系    张杰(jzhang@mailserv.stu.edu.cn)

*****************************************

JAVA3D学习系列中的例题将有非常多的VRML程序与之相比较,因而

欢迎购买<>一书。

特殊购书方式:

1。作者售书

1。网上订购(email address: jzhang@mailserv.stu.edu.cn)

2。可以先获书,后汇款(不满意可退书),

只需将通信地址及邮编告知作者,即可在最短的时间内得到书。

3。书价为25元/本,免收邮购费用。

4。书为16开本,正文161页。

5. 购书可获盖有出版社财务章的收据。

6. 如果需要书中所有的源程序,我可以email一个打包程序

*****************************************

一. IndexedTriangleArray生成的面

IndexedTriangleArray对象的定义为:

IndexedTriangleArray (int vertexCount , int vertexFormat,

int indexCount)

利用这个对象,我们可以从一个顶点数组中挑选一些顶点生成自己

所需要的三角片面。程序triShape5.java中,有一个10个点的数组,我们

从这个数组中选择了8个点,生成了三个面,其中有一个点用了两次,如果

所挑选的点都只用一次,则选择的点的数目必须为3的倍数。

另外,在编程时,我们要注意点的旋转顺序,逆时针旋转和顺时针

旋转有时会产生不同的效果。

程序中,vertexCount表示顶点数组顶点的总数,indexCount表示生成

的面的顶点个数,数值为面的个数的三倍,本例中,生成的面为三个,故

vertexCount为9。

//triShape5.java

import javax.media.j3d.*;

public class triShape5 extends Shape3D {

private float vert[] = {

-.6f ,  .6f ,.0f ,

-.6f , -.6f, .0f ,

-.3f ,  .6f ,.0f ,

-.3f , -.6f, .0f ,

-.0f ,  .6f ,.0f ,

-.0f , -.6f, .0f ,

.3f ,  .6f ,.0f ,

.3f , -.6f, .0f ,

.6f ,  .6f ,.0f ,

.6f , -.6f, .0f ,

};

private float color[] = {

1.0f,0.5f,0.0f,

1.0f,0.0f,0.5f,

1.0f,0.8f,0.0f,

5.0f,1.0f,0.0f,

0.0f,1.0f,0.5f,

0.9f,1.0f,0.0f,

0.5f,0.0f,1.0f,

0.0f,0.5f,1.0f,

1.0f,0.5f,0.0f,

1.0f,0.0f,0.5f,

};

public triShape5() {

int[] index={ 0 , 1 ,  2 , 4 , 5 , 6 , 6 , 7 , 8 };

int VertexCount=9;

IndexedTriangleArray tri = new IndexedTriangleArray(10,

IndexedTriangleArray.COORDINATES|

IndexedTriangleArray.COLOR_3 , VertexCount);

tri.setCoordinates(0,vert);

tri.setColors(0,color);

tri.setCoordinateIndices(0,index);

tri.setColorIndices(0,index);

PolygonAttributes pa = new PolygonAttributes();

pa.setCullFace(PolygonAttributes.CULL_NONE);

Appearance ap = new Appearance();

ap.setPolygonAttributes(pa);

this.setGeometry(tri);

this.setAppearance(ap);

this.setGeometry(tri);

}

}

//end of triShape5.java

二. IndexedQuadArray生成的面

IndexedQuadArray对象的定义为:

IndexedQuadArray (int vertexCount , int vertexFormat,

int indexCount )

利用这个对象,我们可以从一个顶点数组中挑选一些顶点生成自己

所需要的四个点所构成的平面。程序quadShape2.java中,有一个10个点

的数组,我们从这个数组中选择了7个点,生成了两个面,其中有一个点

用了两次,如果所挑选的点都只用一次,则选择的点的数目必须为4的倍数。

这些选中的点构成了数组index。在输入每一个顶点的坐标及颜色时,我们

用到了下面两种方法:

setCoordinateIndices(0,index);

setColorIndices(0,index);

程序中,vertexCount表示顶点数组顶点的总数,indexCount表示生成

的面的顶点个数,数值为面的个数的4倍,本例中,生成的面为两个,故

vertexCount为8。

编写IndexedQuadArray应用程序时,我们仍然要注意下面几个问题。

首先是四点应当共面,如果不共面,程序仍然可以编译

运行,但显示的内容为两个三角面。

其次是四个点组成的面不应有凹点,这有点象VRML程序中

的Extrusion、IndexedFaceSet里的情况,当然,在VRML程序中

四个点构成的面可以有凹点,这时只需要在相应的节点内加上

一个参数:

convex  TRUE

而在JAVA3D程序中,如果QuadArray生成的面有凹点时,

程序的显示结果会不正确。

//quadShape2.java

import javax.media.j3d.*;

public class quadShape2 extends Shape3D {

private float vert[] = {

-.6f , .6f , .0f ,

-.6f , -.6f, .0f ,

-.3f , .6f , .0f ,

-.3f , -.6f, .0f ,

-.0f , .6f , .0f ,

-.0f , -.6f, .0f ,

.3f , .6f , .0f ,

.3f , -.6f, .0f ,

.6f , .6f , .0f ,

.6f , -.6f, .0f ,

};

private float color[] = {

1.0f,0.5f,0.0f,

1.0f,0.0f,0.5f,

1.0f,0.8f,0.0f,

5.0f,1.0f,0.0f,

0.0f,1.0f,0.5f,

0.9f,1.0f,0.0f,

0.5f,0.0f,1.0f,

0.0f,0.5f,1.0f,

1.0f,0.5f,0.0f,

1.0f,0.0f,0.5f,

};

public quadShape2() {

int[] index={ 2 , 1 , 3 , 4 , 4 , 7 , 9 , 6};

int VertexCount=8;

IndexedQuadArray quad = new IndexedQuadArray(10,

IndexedQuadArray.COORDINATES|

IndexedQuadArray.COLOR_3 , VertexCount);

quad.setCoordinates(0,vert);

quad.setColors(0,color);

quad.setCoordinateIndices(0,index);

quad.setColorIndices(0,index);

PolygonAttributes pa = new PolygonAttributes();

pa.setCullFace(PolygonAttributes.CULL_NONE);

Appearance ap = new Appearance();

ap.setPolygonAttributes(pa);

this.setGeometry(quad);

this.setAppearance(ap);

this.setGeometry(quad);

}

}

//end of quadShape2.java

三. IndexedTriangleStripArray生成的面

IndexedTriangleStripArray对象的定义为:

IndexedTriangleStripArray( int vertexCount, int vertexFormat,

int indexCount, int stripIndexCounts[])

利用IndexedTriangleStripArray对象,我们可以生成多组三角片面,

对于每一组三角片面来说,它的头三个点生成一个面,从第四个点

开始,每一个点都和前两个点生成一个新的面。这些点可以通过一个数组index

从一个顶点数组中任意选取,它和TriangleStripArray的差别在于

TriangleStripArray对顶点没有选择权,而IndexedTriangleStripArray

对顶点具有选择权,其它的都一样。

程序triShape6.java给出了一个16个数构成的顶点数组,从中挑选了

两组数,每一组都有6个顶点构成并生成了相连的四个三角片面。

//triShape6.java

import javax.media.j3d.*;

public class triShape6 extends Shape3D {

int StripCount[] = new int[2];

private float vert[] = {

-.6f ,  .6f ,  .1f ,

-.6f ,  .2f ,  .2f ,

-.6f , -.2f ,  .1f ,

-.6f , -.6f ,  .2f ,

-.0f ,  .6f , -.1f ,

-.0f ,  .2f , -.2f ,

-.0f , -.2f , -.1f ,

-.0f , -.6f , -.2f ,

.6f ,  .6f ,  .1f ,

.6f ,  .2f ,  .2f ,

.6f , -.2f ,  .1f ,

.6f , -.6f ,  .2f ,

};

private float color[] = {

1.0f,0.5f,0.0f,

1.0f,0.0f,0.5f,

1.0f,0.8f,0.0f,

5.0f,1.0f,0.0f,

0.0f,1.0f,0.5f,

0.9f,1.0f,0.0f,

0.5f,0.0f,1.0f,

0.0f,0.5f,1.0f,

1.0f,0.5f,0.0f,

1.0f,0.0f,0.5f,

0.9f,1.0f,0.0f,

0.5f,0.0f,1.0f,

};

public triShape6() {

int[] index={ 0 , 1 , 4 , 5 , 8 , 9 , 2 , 3 , 6 , 7 , 10  }

;

StripCount[0] = 6;

StripCount[1] = 5;

int indexCount=11;

IndexedTriangleStripArray tri = new IndexedTriangleStripArray(

12,

IndexedTriangleStripArray.COORDINATES|

IndexedTriangleStripArray.COLOR_3 , indexCount ,

StripCount);

tri.setCoordinates(0,vert);

tri.setColors(0,color);

tri.setCoordinateIndices(0,index);

tri.setColorIndices(0,index);

PolygonAttributes pa = new PolygonAttributes();

pa.setCullFace(PolygonAttributes.CULL_NONE);

Appearance ap = new Appearance();

ap.setPolygonAttributes(pa);

this.setGeometry(tri);

this.setAppearance(ap);

this.setGeometry(tri);

}

}

//end of Shape6.java

四. IndexedTriangleFanArray生成的面

IndexedTriangleFanArray对象的定义为:

IndexedTriangleFanArray ( int vertexCount, int vertexFormat,

int indexCount, int stripIndexCounts[])

利用这一对象,我们可以从一组顶点数组中挑选我们所需要的

顶点,生成多组三角片面,每组三角片面占用一定数量的顶点,每个组

在生成三角片面时,头三个顶点构成一个三角片面,其余的顶点和前面

的顶点及每组第一个顶点生成一个三角片面。下面的triShape7.java程

序中,我们生成了两组三角片面,头5个点生成了三个相连的三角片面,

后6个点生成了四个相连的三角片面。形状就像两把扇子,一大一小。

程序中所用的数组为20个点的顶点数组。

IndexedTriangleFanArray对象和TriangleFanArray的应用方法很相似,

它们之间的不同在于IndexedTriangleFanArray对象可以从顶点数组中挑选

自己所需要的顶点,而TriangleFanArray对象没有挑选权,只能被动地使用

顶点数组中的数据。

//triShape7.java

import javax.media.j3d.*;

public class triShape7 extends Shape3D {

int StripCount[] = new int[2];

private float vert[] = {

-.6f , .8f , -.1f ,

-.6f , .4f , -.0f ,

-.6f , .0f ,  .1f ,

-.6f , -.8f , -.1f ,

-.4f , .8f , .1f ,

-.4f , .4f , .1f ,

-.4f , .0f ,  -.1f ,

-.4f , -.8f , .1f ,

-.0f , .8f , -.1f ,

-.0f , .4f , -.0f ,

-.0f , .0f ,  .1f ,

-.0f , -.8f , -.1f ,

.4f , .8f , .1f ,

.4f , .4f , -.05f ,

.4f , .0f ,  -.1f ,

.4f , -.8f , .1f ,

.6f , .8f , -.1f ,

.6f , .4f , -.0f ,

.6f , .0f ,  .1f ,

.6f , -.8f , -.1f ,

};

private float color[] = {

1.0f,0.5f,0.0f,

1.0f,0.0f,0.5f,

1.0f,0.8f,0.0f,

0.5f,1.0f,0.0f,

0.0f,1.0f,0.5f,

0.9f,1.0f,0.0f,

0.5f,0.0f,1.0f,

0.0f,0.5f,1.0f,

1.0f,0.5f,0.0f,

1.0f,0.0f,0.5f,

0.9f,1.0f,0.0f,

0.5f,0.0f,1.0f,

0.0f,1.0f,0.5f,

0.9f,1.0f,0.0f,

0.5f,0.0f,1.0f,

0.0f,0.5f,1.0f,

1.0f,0.5f,0.0f,

1.0f,0.0f,0.5f,

0.9f,1.0f,0.0f,

0.5f,0.0f,1.0f,

};

public triShape7() {

int[] index={ 9 , 4 , 8 , 12 , 16 , 11 , 2 , 6 , 10 , 14 ,

18};

StripCount[0] = 5;

StripCount[1] = 6;

int indexCount=11;

IndexedTriangleFanArray tri = new IndexedTriangleFanArray(20,

IndexedTriangleFanArray.COORDINATES|

IndexedTriangleFanArray.COLOR_3 , indexCount , S

tripCount);

tri.setCoordinates(0,vert);

tri.setColors(0,color);

tri.setCoordinateIndices(0,index);

tri.setColorIndices(0,index);

PolygonAttributes pa = new PolygonAttributes();

pa.setCullFace(PolygonAttributes.CULL_NONE);

Appearance ap = new Appearance();

ap.setPolygonAttributes(pa);

this.setGeometry(tri);

this.setAppearance(ap);

this.setGeometry(tri);

}

}

/end of triShape7.java

--

※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.192.159.19]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值