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 + -
显示快捷键?