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);