博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

点、线、面的生成(四)——面的介绍

Posted on 2009-06-28 15:46  Anna Yang  阅读(541)  评论(0编辑  收藏  举报

同样,在介绍面的生成前,先介绍一下面的基本属性设置方法:PolygonAttributes对象

PolygonAttributes的构造方法有:

 PolygonAttributes()

PolygonAttributes(int polygonMode, int cullFace,  float polygonOffset)

PolygonAttributes(int polygonMode, int cullFace,  float polygonOffset, boolean backFaceNormalFlip)

为了使程序在运行时产生特定的变化效果,可通过setCapability的方法设定一下flags来达到:

ALLOW_CULL_FACE_READ ,         ALLOW_CULL_FACE_WRITE,           ALLOW_MODE_READ,               ALLOW_MODE_WRITE

ALLOW_OFFSET_READ,                ALLOW_OFFSET_WRITE,                  ALLOW_NORMAL_FLIP_READ,     ALLOW_NORMAL_FLIP_WRITE,

PolygonAttributes经常使用的方法有:

setCullFace(int cullFace),                setPolygonMode(int polygonMode);

cullFace有三个值可使用:CULL_BACK(默认值,只能看到正面)       CULL_NONE(正反面均能看到)               CULL_FRONT(只能看到反面)

对于三个点构成的面,判断正、反面的法则: 用右手螺旋法则,右手绕着3个点的顺序抓过去,大拇指所指的方向即为正向,在默认情况下,当正方向指向观察者的方向时,图像可显示,当正方向背离观察者时,图形不可显示。

polygonMode也有3个值可以使用:

POLYGON_FILL(缺省值,以面的形式表示)

POLYGON_POINT(以点的形式表示)  ,在给定的坐标处用点表示,点与点之间不链接,此方法的显示效果也可以通过PointArray来达到。

POLYGON_LINE(以顶点连线的形式来表示) ,顶点与顶点之间用线链接,相当于该图形没有没填充,用LineArray也能达到同样的显示效果,只是相对比较复杂一点。

 Java3D提供的API中,生成平面的对象有:

TriangleArray,  QuadArray,  TriangleStripArray,  IndexedQuadArray,  IndexedTriangleArray,   IndexedTriangleStripArray,   IndexedTriangleFanArray

TriangleArray对象 

构造方法:TriangleArray(int vertexCount, int vertexFormat)

 vertexCount:顶点数组的个数,因为表示的是三角形的面,所以顶点的个数必须为3的倍数

QuadArray对象

构造函数:QuadArray(int vertexCount, int vertexFormat)

该对象用来生成平面,构成平面的顶点必须是四的倍数,每四个顶点构成一个平面。

注意:1.四点应当共面,如果不共面,程序仍然可以编译,但显示的内容为2个三角面

2.四个点组成的面不应该有凹点,如果有凹点,程序的显示结果会比较奇怪。

TriangleStripArray对象

构造函数:TriangleStripArray(int vertexCount, int vertexFormat, int[] stripVertexCounts)

与LineStripArray作用相似,该对象用来生成多组三角面,对于每一组三角面来说,它的头三个点生成一个面,从第四个点开始,每一个点和它紧邻的前面的两个点生成一个新的三角面,stripVertexCounts数组的长度,也就是三角面的组数,每一组下标存放的则是每组用到的顶点数

TriangleFanArray对象

构造函数:TriangleFanArray(int vertexCount, int vetexFormat, int[] stripVertexCounts)

作用:同TriangleStripArray对象一样,用来生成多组三角片面,每组三角片面用一定数量的顶点,每个组生成三角片面时,头3个顶点构成一个三角片面,其余的顶点和紧邻前面的一个顶点及每组的第一个顶点生成一个三角片面,stripVertexCounts和TriangleAtripArray具有同样的意义

IndexedTriangleArray对象

构造方法:IndexedTriangleArray(int vertexCount, int vertexFormat, int indexCount)

作用:从一个顶点数组中挑选一些顶点生成所需要的三角片面。indexCount表示生成的面的顶点个数,数值为三角片面个数的3倍,具体挑选的点的下标放在一个数组index里面。图形的构成是从Index里面的点中构成

IndexedQuadArray对象

作用:该对象和IndexedTriangleArray对象基本一样,只是挑选的点要是4的倍数。

IndexedTriangleStripArray对象

构造方法:IndexedTriangleStripArray(int vertexCount, int vertexFormat, int indexCount, int[] stripIndexCounts)

作用:可以生成多组三角片面,该方法综合了IndexedTriangleArray对象的方法和TriangleStripArray对象的方法。从顶点数组中选择要显示的点,将要显示的顶点的数目放在indexCount中,要显示的顶点的下标放在数组index中,index数组中的头3个顶点生成一个三角面,从第四个开始,每一个点都和紧邻的前面两个点生成一个新的面

IndexedTriangleFanArray对象

其构造方法和IndexedTriangleStripArray对象相似,只是在每组数组生成三角面时,头3个顶点构成一个三角面,从第四个顶点开始,其余的每个顶点和紧邻的前面一个顶点及其每组的第一个顶点构成一个三角面。