mysimpleuniverse.java

来自「java2参考大全上的例子的源码和自己的理解.」· Java 代码 · 共 1,951 行 · 第 1/5 页

JAVA
1,951
字号
package java_3d_魔方源代码;



/**
 * <p>Title: </p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2005</p>
 * <p>Company: </p>
 * @author not attributable
 * @version 1.0
 */

//存为MoFang.java

import java.applet.Applet;
import java.awt.*;
import com.sun.j3d.utils.applet.e;
import java.awt.BorderLayout;
import com.sun.j3d.utils.universe.SimpleUniverse;
import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.behaviors.mouse.*;
import com.sun.j3d.utils.behaviors.keyboard.*;
import com.sun.j3d.utils.picking.behaviors.*;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.image.TextureLoader;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.JFrame.*;
import javax.swing.*;

class mySimpleUniverse
    extends Applet {
  BranchGroup createSceneGraph(Canvas3D canvas)

  {

    //System.out.print("**1**");

    //创建变换组,无用的t3D
    Transform3D t3d = new Transform3D();
    TransformGroup trans = new TransformGroup(t3d);
    trans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
    trans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
    //创建分枝组
    BranchGroup objRoot = new BranchGroup();

    //测试
    //SomeShape3D.book3D( this, trans);
    SomeShape3D.addText3DDonghua(trans, "魔方", new Point3f( -7.0f, 6.0f, 6.0f),
                                 0.1f, new Color3f(1.0f, 0.0f, 0.0f), 1);

    //初始化数据结构
    System.out.println("\n\n载入方块,并向变换组中加入每个方块的坐标系和方块...");
    for (int i = 0; i <= 2; i++) {
      for (int j = 0; j <= 2; j++) {
        for (int k = 0; k <= 2; k++) {
          int[] p;
          p = Position.getPxyzFromPositionAy(i, j, k, MoFang.positionArray);
          MoFang.blockArray[i][j][k] = new Block(i, j, k, p[0], p[1], p[2],
                                                 trans, t3d, objRoot, this);
        }
      }
    }
    System.out.println("加入每个方块的坐标系和方块,完成.\n");

    //创建大坐标轴,自动加到主坐标系
    SomeShape3D.zuoBiaoZhuBigXShape3D(trans);
    SomeShape3D.zuoBiaoZhuBigYShape3D(trans);
    SomeShape3D.zuoBiaoZhuBigZShape3D(trans);

    //创建边界对象
    BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100);

    //创建鼠标pick行为,加到分支组objRoot
    PickRotateBehavior pickRotate = new PickRotateBehavior(objRoot, canvas,
        bounds);
    PickTranslateBehavior pickTranslate = new PickTranslateBehavior(objRoot,
        canvas, bounds);
    PickZoomBehavior pickZoom = new PickZoomBehavior(objRoot, canvas, bounds);
    //objRoot.addChild(pickRotate);
    objRoot.addChild(pickTranslate);
    //objRoot.addChild(pickZoom);

    //创建鼠标旋转行为
    MouseRotate behavior = new MouseRotate();
    behavior.setTransformGroup(trans);
    behavior.setSchedulingBounds(bounds);

    //创建鼠标平移行为
    //MouseTranslate myMouseRotate=new MouseTranslate();
    //myMouseRotate.setTransformGroup(trans);
    //myMouseRotate.setSchedulingBounds(bounds);

    //创建鼠标缩放行为
    MouseZoom myMouseZoom = new MouseZoom();
    myMouseZoom.setTransformGroup(trans);
    myMouseZoom.setSchedulingBounds(bounds);

    //创建键盘默认行为
    KeyNavigatorBehavior keyNavBeh = new KeyNavigatorBehavior(trans);
    keyNavBeh.setSchedulingBounds(bounds);
    objRoot.addChild(keyNavBeh);

    //白色背景
    Background bg = new Background(new Color3f(0.0f, 0.0f, 0.0f));
    bg.setApplicationBounds(bounds);
    objRoot.addChild(bg);

    //创建带材质的背景
    //TextureLoader bgTexture=new TextureLoader("bg3.jpg",this);
    //Background bg=new Background(bgTexture.getImage());
    //bg.setApplicationBounds(bounds);
    //trans.addChild(shape1);//3D物体 加到 变换组
    //trans.addChild(shape2);//3D物体 加到 变换组
    objRoot.addChild(trans);
    //变换组 加到 分枝组
    objRoot.addChild(behavior);
    //鼠标行为  加到 分枝组
    //objRoot.addChild(myMouseRotate);
    //objRoot.addChild(myMouseZoom);
    //objRoot.addChild(bg);//背景 加到 分枝组
    //编译
    objRoot.compile();
    //回送创建好的带3D物体的分枝组
    return objRoot;

  }

  mySimpleUniverse() {
    //创建带控制的画布
    GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
    Canvas3D c = new Canvas3D(config);
    //创建以画布为依托的简单场景图对象,没有多个Locale
    SimpleUniverse u = new SimpleUniverse(c);
    u.getViewingPlatform().setNominalViewingTransform();
    //创建分支组对象
    BranchGroup scene = createSceneGraph(c);
    //组装,分支组 对象加到 场景图
    u.addBranchGraph(scene);

    //带场景图的画布 加到 本applet中
    setLayout(new BorderLayout());
    add("Center", c);
  }

  //测试码
  //public static void main(String aregs[])
  //{new MainFrame(new mySimpleUniverse(),200,200);//加applet到应用程序界面
  //}
}

class SomeShape3D {
  public static float zuoBiaoZhouSmallDingDian = 0.09f; //小坐标顶点位置
  public static float zuoBiaoZhouSmallDingXi = 0.02f; //小坐标顶点伞的半径
  public static float zuoBiaoZhouSmallDingChang = 0.07f; //小坐标顶点伞的长度
  public static float zuoBiaoZhouSmallWeiDian = -0.09f; //小坐标尾巴的位置
  public static float zuoBiaoZhouBigDingDian = 1.0f; //大坐标顶点位置
  public static float zuoBiaoZhouBigDingXi = 0.04f; //大坐标顶点伞的半径
  public static float zuoBiaoZhouBigDingChang = 0.8f; //大坐标顶点伞的长度
  public static float zuoBiaoZhouBigWeiDian = -1.0f; //大坐标尾巴的位置
  public static float fangKuaiBanJing = 0.18f; //每个方块的半径
  public static void zuoBiaoZhuBigXShape3D(TransformGroup trans) {

    //创建大坐标轴对象

    int i;
    float x1, x2, y1, y2, z1, z2;

    SomeShape3D.addText3DDonghua(trans, "X",
                                 new Point3f(zuoBiaoZhouBigDingDian * 10, 0.0f,
                                             0.0f), 0.1f, Block.mianColor[0], 0);

    Point3f[] vert = new Point3f[41];
    Color3f[] colors = new Color3f[41];
    for (i = 0; i < 27; i++) {
      if (i == 0) {
        vert[i] = new Point3f(zuoBiaoZhouBigDingDian, 0.0f, 0.0f);
        colors[i] = Block.mianColor[0];
      }
      else {
        z1 = (float) (zuoBiaoZhouBigDingXi * Math.cos(i * 2 * Math.PI / 25));
        x1 = zuoBiaoZhouBigDingChang;
        y1 = (float) (zuoBiaoZhouBigDingXi * Math.sin(i * 2 * Math.PI / 25));
        vert[i] = new Point3f(x1, y1, z1);
        colors[i] = Block.mianColor[0];
      }
    }

    for (i = 0; i < 14; i++) {
      if (i == 0) {
        vert[27 + i] = new Point3f(zuoBiaoZhouBigDingDian, 0.0f, 0.0f);
        colors[27 + i] = Block.mianColor[0];
      }
      else {
        z1 = (float) (0.01f * Math.cos(i * 2 * Math.PI / 12));
        x1 = zuoBiaoZhouBigWeiDian;
        y1 = (float) (0.01f * Math.sin(i * 2 * Math.PI / 12));
        vert[27 + i] = new Point3f(x1, y1, z1);
        colors[27 + i] = Block.mianColor[1];
      }
    }
    int count[] = new int[2];
    count[0] = 27;
    count[1] = 14;

    TriangleFanArray tri = new TriangleFanArray(
        vert.length,
        TriangleFanArray.COORDINATES | TriangleStripArray.COLOR_3,
        count
        );
    tri.setCoordinates(0, vert);
    tri.setColors(0, colors);

    Appearance app = new Appearance();

    PolygonAttributes polyAttrib = new PolygonAttributes();
    polyAttrib.setCullFace(PolygonAttributes.CULL_NONE);
    //polyAttrib.setPolygonMode(PolygonAttributes.POLYGON_LINE);
    app.setPolygonAttributes(polyAttrib);

    Shape3D shape = new Shape3D(tri, app);
    System.out.print("zuoBiaoZhuBigX 创建 完成\n");

    trans.addChild(shape);

    //到这里,大坐标轴对象创建完成

  }

  public static void zuoBiaoZhuBigYShape3D(TransformGroup trans) {

    //创建大坐标轴对象

    int i;
    float x1, x2, y1, y2, z1, z2;

    SomeShape3D.addText3DDonghua(trans, "Y",
                                 new Point3f( -1.0f,
                                             zuoBiaoZhouBigDingDian * 10, 0.0f),
                                 0.1f, Block.mianColor[2], 0);

    Point3f[] vert = new Point3f[41];
    Color3f[] colors = new Color3f[41];
    for (i = 0; i < 27; i++) {
      if (i == 0) {
        vert[i] = new Point3f(0.0f, zuoBiaoZhouBigDingDian, 0.0f);
        colors[i] = Block.mianColor[2];
      }
      else {
        x1 = (float) (zuoBiaoZhouBigDingXi * Math.cos(i * 2 * Math.PI / 25));
        y1 = zuoBiaoZhouBigDingChang;
        z1 = (float) (zuoBiaoZhouBigDingXi * Math.sin(i * 2 * Math.PI / 25));
        vert[i] = new Point3f(x1, y1, z1);
        colors[i] = Block.mianColor[2];
      }
    }

    for (i = 0; i < 14; i++) {
      if (i == 0) {
        vert[27 + i] = new Point3f(0.0f, zuoBiaoZhouBigDingDian, 0.0f);
        colors[27 + i] = Block.mianColor[2];
      }
      else {
        x1 = (float) (0.01f * Math.cos(i * 2 * Math.PI / 12));
        y1 = zuoBiaoZhouBigWeiDian;
        z1 = (float) (0.01f * Math.sin(i * 2 * Math.PI / 12));
        vert[27 + i] = new Point3f(x1, y1, z1);
        colors[27 + i] = Block.mianColor[3];
      }
    }
    int count[] = new int[2];
    count[0] = 27;
    count[1] = 14;

    TriangleFanArray tri = new TriangleFanArray(
        vert.length,
        TriangleFanArray.COORDINATES | TriangleStripArray.COLOR_3,
        count
        );
    tri.setCoordinates(0, vert);
    tri.setColors(0, colors);
    Appearance app = new Appearance();

    PolygonAttributes polyAttrib = new PolygonAttributes();
    polyAttrib.setCullFace(PolygonAttributes.CULL_NONE);
    //polyAttrib.setPolygonMode(PolygonAttributes.POLYGON_LINE);
    app.setPolygonAttributes(polyAttrib);

    Shape3D shape = new Shape3D(tri, app);

    System.out.print("zuoBiaoZhuBigY 创建 完成\n");

    trans.addChild(shape);

    //到这里,大坐标轴对象创建完成

  }

  public static void zuoBiaoZhuBigZShape3D(TransformGroup trans) {

    //创建大坐标轴对象

    int i;
    float x1, x2, y1, y2, z1, z2;
    SomeShape3D.addText3DDonghua(trans, "Z",
                                 new Point3f( -1.0f, 0.0f,
                                             zuoBiaoZhouBigDingDian * 10), 0.1f,
                                 Block.mianColor[4], 0);

    Point3f[] vert = new Point3f[41];
    Color3f[] colors = new Color3f[41];
    for (i = 0; i < 27; i++) {
      if (i == 0) {
        vert[i] = new Point3f(0.0f, 0.0f, zuoBiaoZhouBigDingDian);
        colors[i] = Block.mianColor[4];
      }
      else {
        y1 = (float) (zuoBiaoZhouBigDingXi * Math.cos(i * 2 * Math.PI / 25));
        z1 = zuoBiaoZhouBigDingChang;
        x1 = (float) (zuoBiaoZhouBigDingXi * Math.sin(i * 2 * Math.PI / 25));
        vert[i] = new Point3f(x1, y1, z1);
        colors[i] = Block.mianColor[4];
      }
    }

    for (i = 0; i < 14; i++) {
      if (i == 0) {
        vert[27 + i] = new Point3f(0.0f, 0.0f, zuoBiaoZhouBigDingDian);
        colors[27 + i] = Block.mianColor[4];
      }
      else {
        y1 = (float) (0.01f * Math.cos(i * 2 * Math.PI / 12));
        z1 = zuoBiaoZhouBigWeiDian;
        x1 = (float) (0.01f * Math.sin(i * 2 * Math.PI / 12));
        vert[27 + i] = new Point3f(x1, y1, z1);
        colors[27 + i] = Block.mianColor[5];
      }
    }
    int count[] = new int[2];
    count[0] = 27;
    count[1] = 14;

    TriangleFanArray tri = new TriangleFanArray(
        vert.length,
        TriangleFanArray.COORDINATES | TriangleStripArray.COLOR_3,
        count
        );
    tri.setCoordinates(0, vert);
    tri.setColors(0, colors);
    Appearance app = new Appearance();

    PolygonAttributes polyAttrib = new PolygonAttributes();
    polyAttrib.setCullFace(PolygonAttributes.CULL_NONE);
    //polyAttrib.setPolygonMode(PolygonAttributes.POLYGON_LINE);
    app.setPolygonAttributes(polyAttrib);

    Shape3D shape = new Shape3D(tri, app);
    System.out.print("zuoBiaoZhuBigZ 创建 完成\n");

    trans.addChild(shape);
    //到这里,大坐标轴对象创建完成
  }

  public static void zuoBiaoZhuSmallXShape3D(TransformGroup trans) {
    //创建小坐标轴对象

    int i;
    float x1, x2, y1, y2, z1, z2;

    Point3f[] vert = new Point3f[41];
    Color3f[] colors = new Color3f[41];
    for (i = 0; i < 27; i++) {
      if (i == 0) {
        vert[i] = new Point3f(zuoBiaoZhouSmallDingDian, 0.0f, 0.0f);
        colors[i] = Block.mianColor[0];
      }
      else {
        z1 = (float) (zuoBiaoZhouSmallDingXi * Math.cos(i * 2 * Math.PI / 25));
        x1 = zuoBiaoZhouSmallDingChang;
        y1 = (float) (zuoBiaoZhouSmallDingXi * Math.sin(i * 2 * Math.PI / 25));
        vert[i] = new Point3f(x1, y1, z1);
        colors[i] = Block.mianColor[0];
      }
    }

    for (i = 0; i < 14; i++) {
      if (i == 0) {
        vert[27 + i] = new Point3f(zuoBiaoZhouSmallDingDian, 0.0f, 0.0f);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?