AVA3D学习系列之7---点的生成

  • 格式:docx
  • 大小:19.92 KB
  • 文档页数:12

JAVA3D学习系列之7---点的生成

汕头大学机电系 张杰(jzhang@)

( 在前面(第6部分)我们介绍了如何编写JAVA3D三维基本形体的)

( 程序,需要指出的是,我们将前面的SimpleCone.java程序修改为)

( 其它形体时,我们需要同时修改import语句的类型,或者干脆将 )

( 相应的那个import语句修改成: )

( import com.sun.j3d.utils.geometry.*; )

JAVA3D编程过程中,我们经常要编写一些点、线、面,JAVA3D所提供

的API中有许多这方面的对象,下面我们开始一一介绍它们的使用方法。

一. 点的生成

我们先用VRML编写一个带有不同颜色的六个点的程序。

//Point.wrl ----观测点在 (0 0 10)

#VRML V2.0 utf8

Shape {

geometry PointSet {

coord Coordinate {

point [.8 .8 .0, -.8, .8 0, .5 0 0,

-.5 0 0, -.8 -.8 0, .8 -.8 0]}

color Color{

color [ .0 .5 1., .5 .0 1, 0 .8 .2,

1 0 .3, 0 1 .3, .3 .8 0 ]}

}}

#end of Point.wrl

由程序可知,VRML程序中的点非常小,且无法变大。

下面我们改用JAVA3D编写同样的程序,不过由于观测

点不同,观测效果有差异,VRML程序中的点比较集中,JAVA3D

程序中的点比较分散,程序如下:

//Point1.java -----观测点在( 0 0 2.41 )

import java.applet.Applet;

import java.awt.BorderLayout;

import com.sun.j3d.utils.applet.MainFrame;

import com.sun.j3d.utils.universe.*;

import javax.media.j3d.*;

import javax.vecmath.*;

public class Point1 extends Applet {

public BranchGroup createSceneGraph() {

BranchGroup objRoot = new BranchGroup();

float vert[] = {

.8f, 0.8f,0.0f,

-0.8f, 0.8f,0.0f,

0.5f, 0.0f,0.0f,

-0.5f, 0.0f,0.0f,

-0.8f,-0.8f,0.0f,

0.8f,-0.8f,0.0f,

};

float color[] = {

0.0f,0.5f,1.0f,

0.5f,0.0f,1.0f,

0.0f,0.8f,0.2f,

1.0f,0.0f,0.3f,

0.0f,1.0f,0.3f,

0.3f,0.8f,0.0f,

};

Shape3D shape = new Shape3D();

PointArray point = new PointArray(6, PointArray.COORDINATES

|PointArray.COLOR_3);

point.setCoordinates(0,vert);

point.setColors(0,color);

shape.setGeometry(point);

objRoot.addChild(shape);

pile();

return objRoot;

}

public Point1() {

setLayout(new BorderLayout());

Canvas3D c = new Canvas3D(null);

add("Center", c);

BranchGroup scene = createSceneGraph();

SimpleUniverse u = new SimpleUniverse(c);

u.getViewingPlatform().setNominalViewingTransform();

u.addBranchGraph(scene);

}

public static void main(String[] args) {

new MainFrame(new Point1(), 400,400); }

}

//end of Point1.java

我们来分析一下上面的Point1.java。

我们知道,编写JAVA3D程序实际上是编写一个特定的场景图,

给出了场景图中带有形体及其属性的一个分支(BranchGrou)和

表示观察位置等数据的另一个分支(View Platform)。一般来说,

表示观测位置的分支可以用JAVA3D的UTILITY来完成,因而我们可

以看到,在Point1.java中,构造函数Point1和前面介绍的

SimpleCone.java的构造函数SimpleCone内容完全一样。两个程序

的不同之处在于形体构造及处理分支,即createSceneGraph方法的

定义。

我们来看一下Point1.java的createScendGraph方法的定义。

在这个方法里,程序先定义了一个分支objRoot,然后用数组

的形式定义了六个顶点坐标vert和六种颜色color,再用PointArray

定义了一组点point,并将顶点坐标及颜色赋值给point,由于JAVA3D

中的PointArray点是Shape3D的子类,它不能直接放入一个BranchGroup,

因而我们还要先定义一个Shape3D对象shape,再将point赋予shape,

这样point就可以放入BranchGroup类型的对象objRoot中了。

二. PointArray、IndexedPointArray介绍

JAVA3D提供的API中,可用于生成Point的对象有:

PointArray

IndexedPointArray

1. PointArray

PointArray的构造函数为:

PointArray( int vertexCount, int vertexFormat );

这里,vertexCount表示应生成的点的数目,

vertexFormat表示所需要的顶点的格式。

点、线、面几何体所需要的顶点的格式有:

COORDINATES 顶点坐标数组

NORMALS 顶点法向数组

COLOR_3 不带alpha值的颜色数组

COLOR_4 带alpha值的颜色数组

TEXTURE_COORDINATE_2 二维纹理坐标数组

TEXTURE_COORDINATE_3 三维纹理坐标数组

Point1.java程序用到了COORDINATES和COLOR_3。

2. IndexedPointArray

IndexedPointArray的构造函数为:

IndexedPointArray( int vertexCount, int vertexFormat, int indexCount );

利用本函数,我们可以从众多的点中,选择特定的点来显示。

这里,vertexCount表示顶点坐标数组所提供的点的总个数,

indexCount表示最终应生成的点的个数。

三. 20像素大小的点的生成

JAVA3D可以生成任意大小的点,并且可以使点为方点或圆点。

下面的程序生成了一个20像素大小的程序。

//Point2.java

import java.applet.Applet;

import java.awt.BorderLayout;

import com.sun.j3d.utils.applet.MainFrame;

import com.sun.j3d.utils.universe.*;

import javax.media.j3d.*;

import javax.vecmath.*;

public class Point2 extends Applet {

public BranchGroup createSceneGraph() {

BranchGroup objRoot = new BranchGroup();

float vert[] = {

.8f, 0.8f,0.0f,

-0.8f, 0.8f,0.0f,

0.5f, 0.0f,0.0f,

-0.5f, 0.0f,0.0f,

-0.8f,-0.8f,0.0f,

0.8f,-0.8f,0.0f,

};

float color[] = {

0.0f,0.5f,1.0f,

0.5f,0.0f,1.0f,

0.0f,0.8f,2.0f,

1.0f,0.0f,0.3f,

0.0f,1.0f,0.3f,

0.3f,0.8f,0.0f,

};

Shape3D shape = new Shape3D();

PointArray point = new PointArray(6, PointArray.COORDINATES

|PointArray.COLOR_3);

point.setCoordinates(0,vert);