📄 simplebillboard.java
字号:
//SimpleBillboard.java
//演示如何使用Billboard对象和OrientedShape3D对象
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Frame;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.behaviors.keyboard.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import java.awt.event.*;
import java.awt.AWTEvent;
import java.awt.Font;
import java.util.Enumeration;
public class SimpleBillboard extends Applet {
//创建二维的树形平面
Shape3D createTree(){
int counts[] = {19};
TriangleFanArray treeGeom = new TriangleFanArray(19,
GeometryArray.COORDINATES
| GeometryArray.COLOR_3,
counts);
treeGeom.setCoordinate( 0, new Point3f( 0.00f, 0.60f, 0.0f ));
treeGeom.setCoordinate( 1, new Point3f(-0.05f, 0.00f, 0.0f ));
treeGeom.setCoordinate( 2, new Point3f( 0.05f, 0.00f, 0.0f ));
treeGeom.setCoordinate( 3, new Point3f( 0.05f, 0.25f, 0.0f ));
treeGeom.setCoordinate( 4, new Point3f( 0.15f, 0.30f, 0.0f ));
treeGeom.setCoordinate( 5, new Point3f( 0.22f, 0.25f, 0.0f ));
treeGeom.setCoordinate( 6, new Point3f( 0.18f, 0.40f, 0.0f ));
treeGeom.setCoordinate( 7, new Point3f( 0.20f, 0.55f, 0.0f ));
treeGeom.setCoordinate( 8, new Point3f( 0.15f, 0.65f, 0.0f ));
treeGeom.setCoordinate( 9, new Point3f( 0.14f, 0.80f, 0.0f ));
treeGeom.setCoordinate(10, new Point3f( 0.08f, 0.95f, 0.0f ));
treeGeom.setCoordinate(11, new Point3f( 0.00f, 1.00f, 0.0f ));
treeGeom.setCoordinate(12, new Point3f(-0.20f, 0.85f, 0.0f ));
treeGeom.setCoordinate(13, new Point3f(-0.22f, 0.70f, 0.0f ));
treeGeom.setCoordinate(14, new Point3f(-0.30f, 0.60f, 0.0f ));
treeGeom.setCoordinate(15, new Point3f(-0.35f, 0.45f, 0.0f ));
treeGeom.setCoordinate(16, new Point3f(-0.25f, 0.43f, 0.0f ));
treeGeom.setCoordinate(17, new Point3f(-0.30f, 0.25f, 0.0f ));
treeGeom.setCoordinate(18, new Point3f(-0.02f, 0.24f, 0.0f ));
//通过不同的颜色,来表示树的立体感
Color3f c = new Color3f(0.1f, 0.9f, 0.0f);
for(int i = 0; i < 19; i++) treeGeom.setColor(i, c);
c.set(0.5f, 0.5f, 0.3f);
treeGeom.setColor( 1, c);
treeGeom.setColor( 2, c);
treeGeom.setColor(18, c);
Shape3D tree = new Shape3D(treeGeom);
return tree;
}
//创建一个地平面
Shape3D createLand(){
LineArray landGeom = new LineArray(44, GeometryArray.COORDINATES
| GeometryArray.COLOR_3);
float l = -50.0f;
for(int c = 0; c < 44; c+=4){
landGeom.setCoordinate( c+0, new Point3f( -50.0f, 0.0f, l ));
landGeom.setCoordinate( c+1, new Point3f( 50.0f, 0.0f, l ));
landGeom.setCoordinate( c+2, new Point3f( l , 0.0f, -50.0f ));
landGeom.setCoordinate( c+3, new Point3f( l , 0.0f, 50.0f ));
l += 10.0f;
}
Color3f c = new Color3f(0.1f, 0.8f, 0.1f);
for(int i = 0; i < 44; i++) landGeom.setColor( i, c);
return new Shape3D(landGeom);
}
//创建场景
public BranchGroup createSceneGraph(SimpleUniverse su) {
//创建根分支节点
BranchGroup objRoot = new BranchGroup();
//创建场景的有效范围
BoundingSphere bounds=new BoundingSphere(new Point3d(),1000.0);
Vector3f translate = new Vector3f();
Transform3D transT3D = new Transform3D();
TransformGroup transTG = null;
TransformGroup rotTG = null;
Billboard billboard = null;
//创建地平面
objRoot.addChild(createLand());
//创建共享组节点
SharedGroup treeSG = new SharedGroup();
//添加共享节点
treeSG.addChild(createTree());
//树的摆放位置数组
float[][] position = {{ 0.0f, 0.0f, -3.0f},
{ 6.0f, 0.0f, 0.0f},
{ 6.0f, 0.0f, 6.0f},
{ 3.0f, 0.0f, -10.0f},
{ 13.0f, 0.0f, -30.0f},
{-13.0f, 0.0f, 30.0f},
{-13.0f, 0.0f, 23.0f},
{ 13.0f, 0.0f, 3.0f}};
//向场景中添加树
for (int i = 0; i < position.length; i++){
translate.set(position[i]);
transT3D.setTranslation(translate);
transTG = new TransformGroup(transT3D);
rotTG = new TransformGroup();
//必须指定这一属性,否则不会自动旋转
rotTG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
billboard = new Billboard(rotTG);
billboard.setSchedulingBounds(bounds);
// billboard.setAlignmentMode(Billboard.ROTATE_ABOUT_POINT);
objRoot.addChild(transTG);
objRoot.addChild(billboard);
transTG.addChild(rotTG);
//使用共享节点
rotTG.addChild(new Link(treeSG));
}
// 创建3D文字
translate.set(0.0f,0.5f,-0.3f);
transT3D.setTranslation(translate);
transTG = new TransformGroup(transT3D);
Appearance textApp = new Appearance();
Material textMat = new Material();
textMat.setLightingEnable(true);
textApp.setMaterial(textMat);
Font3D font3D = new Font3D(new Font("宋体", Font.PLAIN, 1),
new FontExtrusion());
Text3D textGeom = new Text3D(font3D, new String("Tsinghua University"));
//使用OrientedShape3D对象,
OrientedShape3D textShape = new OrientedShape3D();
textShape.setGeometry(textGeom);
textShape.setAppearance(textApp);
textShape.setAlignmentAxis( 0.0f, 1.0f, 0.0f);
objRoot.addChild(transTG);
objRoot.addChild(textShape);
//添加键盘控制功能
transTG=su.getViewingPlatform().getViewPlatformTransform();
// TransformGroup vpTrans = su.getViewingPlatform().getViewPlatformTransform();
translate.set( 0.0f, 0.3f, 0.0f);
transT3D.setTranslation(translate);
transTG.setTransform(transT3D);
// vpTrans.setTransform(T3D);
KeyNavigatorBehavior myKNB = new KeyNavigatorBehavior(transTG);
myKNB.setSchedulingBounds(bounds);
objRoot.addChild(myKNB);
//设置背景
Background bg = new Background();
bg.setColor(1.0f, 1.0f, 1.0f);
bg.setApplicationBounds(bounds);
objRoot.addChild(bg);
//设置环境光
Color3f ambColor = new Color3f(0.1f, 0.1f, 0.1f);
AmbientLight lightA = new AmbientLight(ambColor);
lightA.setInfluencingBounds(bounds);
objRoot.addChild(lightA);
// 设置平行光
Color3f dirColor1 = new Color3f(1.0f, 1.0f, 0.9f);
Vector3f dirLight1 = new Vector3f(1.0f, 1.0f, 1.0f);
DirectionalLight lightD1
= new DirectionalLight(dirColor1, dirLight1);
lightD1.setInfluencingBounds(bounds);
objRoot.addChild(lightD1);
Color3f dirColor2 = new Color3f(1.0f, 1.0f, 0.9f);
Vector3f dirLight2 = new Vector3f(-1.0f, -1.0f, -1.0f);
DirectionalLight lightD2
= new DirectionalLight(dirColor2, dirLight2);
lightD2.setInfluencingBounds(bounds);
objRoot.addChild(lightD2);
//优化场景
objRoot.compile();
return objRoot;
}
public SimpleBillboard() {
setLayout(new BorderLayout());
Canvas3D canvas3D = new Canvas3D(null);
add("Center", canvas3D);
//使用方便的工具类SimpleUniverse
SimpleUniverse simpleU = new SimpleUniverse(canvas3D);
BranchGroup scene = createSceneGraph(simpleU);
simpleU.addBranchGraph(scene);
}
public static void main(String[] args) {
Frame frame = new MainFrame(new SimpleBillboard(), 256, 256);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -