⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 simplebillboard.java

📁 包括了JAVA3D(全世界都能看到的网络三维动画)的源代码部分! 很多基础但是却很精彩的例子!有什么不明白的也可以和我交流MSN:guorui0728@hotmail.com
💻 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 + -