//存为MoFang.java
import java.applet.Applet ; import java.awt.*;
import com.sun.j3d.utils.applet.MainFrame ; 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(\
//创建变换组,无用的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,\魔方\Point3f(-7.0f,6.0f,6.0f),0.1f,new Color3f(1.0f,0.0f,0.0f),1);
//初始化数据结构
System.out.println(\载入方块,并向变换组中加入每个方块的坐标系和方
块...\
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(\ //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(\ }
//测试码
//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,\
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 {

