mysimpleuniverse.java
来自「java2参考大全上的例子的源码和自己的理解.」· Java 代码 · 共 1,951 行 · 第 1/5 页
JAVA
1,951 行
//System.in.read();//暂停
//
myThread.sleep(donghuaDelay);
}
catch (Exception e) {
}
//在这里才放出令牌
selectDonghuaId++;
selectDonghuaId %= 9;
}
}
void startDonghuaY() {
//动画模块
int chuJiao;
int oneTime;
int bianJiao;
int nowJiao;
//测试
//totateArg=90;
chuJiao = getChujiao(yuanz, yuanx);
if (totateArg == -90) {
oneTime = -15;
}
else {
oneTime = 15;
//System.out.println("chuJiao="+chuJiao);
//System.out.println("totateArg="+totateArg);
//nowJiao=chuJiao+bianJiao ;
//这是目前角度公式,可见,据坐标可以判断它的角度嘛
}
for (bianJiao = 0; bianJiao != (totateArg + oneTime); bianJiao += oneTime) {
if (!closeDonghua) {
while (myDonghuaId != selectDonghuaId) { //动画同步相关轮到自己时才执行,把令牌交给下一个
; //System.out.println("我是"+myDonghuaId+"号,而令牌现在是"+selectDonghuaId+"号,我要等...");
try {
//System.in.read();//暂停
myThread.sleep(whileDelay);
}
catch (Exception e) {
}
}
}
//计算x,y和角度输出
float fx;
float fy;
float fz;
//半径
float r;
if (yuanz == 0 && yuanx == 0) {
r = 0; //(x,y)不变,故不用计算,直接给(0,0),初角返回任何值都可;
}
else {
if (yuanz == 0 || yuanx == 0) {
r = 1.0f;
}
else {
r = 1.414f;
}
}
nowJiao = chuJiao + bianJiao;
//使用初角直为了计算当前(x,y)位置,当前jiaodu1与他无关,只与老角有关
//(-1,-1)距离原点为根2,约1.732
//0.3指定了1点在0.3,-0.3处
fz = (float) kuaiZhongXinWeizhi * r *
(float) Math.cos(Math.PI * nowJiao / 180);
fx = (float) kuaiZhongXinWeizhi * r *
(float) Math.sin(Math.PI * nowJiao / 180);
fy = (float) kuaiZhongXinWeizhi * (yuany);
//z坐标不变,这里的z早减过了1
//计算出了全部数据,OK,开始刷新
//用变换量
//transz.rotZ(Math.toRadians(anglez));
//transy.rotY(Math.toRadians(bianJiao+oldJiaoDu));
//transx.rotX(Math.toRadians(anglex));
transp.setTranslation(new Vector3f(fx, fy, fz));
//生效
//transGroupz.setTransform(transz);
//transGroupy.setTransform(transy);
//transGroupx.setTransform(transx);
transGroupp.setTransform(transp);
//停不了,只能使用多线程或定时
//System.out.println("bianJiao="+bianJiao);
try {
//System.in.read();//暂停
//
myThread.sleep(donghuaDelay);
}
catch (Exception e) {
}
//在这里才放出令牌
selectDonghuaId++;
selectDonghuaId %= 9;
}
}
void startDonghuaZ() {
//动画模块
int chuJiao;
int oneTime;
int bianJiao;
int nowJiao;
//测试
//totateArg=90;
chuJiao = getChujiao(yuanx, yuany);
if (totateArg == -90) {
oneTime = -15;
}
else {
oneTime = 15;
//System.out.println("chuJiao="+chuJiao);
//System.out.println("totateArg="+totateArg);
//nowJiao=chuJiao+bianJiao ;
//这是目前角度公式,可见,据坐标可以判断它的角度嘛
}
for (bianJiao = 0; bianJiao != (totateArg + oneTime); bianJiao += oneTime) {
if (!closeDonghua) {
while (myDonghuaId != selectDonghuaId) { //动画同步相关轮到自己时才执行,把令牌交给下一个
; //System.out.println("我是"+myDonghuaId+"号,而令牌现在是"+selectDonghuaId+"号,我要等...");
try {
//System.in.read();//暂停
myThread.sleep(whileDelay);
}
catch (Exception e) {
}
}
}
//计算x,y和角度输出
float fx;
float fy;
float fz;
//半径
float r;
if (yuanx == 0 && yuany == 0) {
r = 0; //(x,y)不变,故不用计算,直接给(0,0),初角返回任何值都可;
}
else {
if (yuanx == 0 || yuany == 0) {
r = 1.0f;
}
else {
r = 1.414f;
}
}
nowJiao = chuJiao + bianJiao;
//使用初角直为了计算当前(x,y)位置,当前jiaodu1与他无关,只与老角有关
//(-1,-1)距离原点为根2,约1.732
//0.3指定了1点在0.3,-0.3处
fx = (float) kuaiZhongXinWeizhi * r *
(float) Math.cos(Math.PI * nowJiao / 180);
fy = (float) kuaiZhongXinWeizhi * r *
(float) Math.sin(Math.PI * nowJiao / 180);
fz = (float) kuaiZhongXinWeizhi * (yuanz);
//z坐标不变,这里的z早减过了1
//计算出了全部数据,OK,开始刷新
//用变换量
//transz.rotZ(Math.toRadians());
//transy.rotY(Math.toRadians());
//transx.rotX(Math.toRadians());
transp.setTranslation(new Vector3f(fx, fy, fz));
//生效
//transGroupz.setTransform(transz);
//transGroupy.setTransform(transy);
//transGroupx.setTransform(transx);
transGroupp.setTransform(transp);
//停不了,只能使用多线程或定时
//System.out.println("bianJiao="+bianJiao);
try {
//System.in.read();//暂停
//
myThread.sleep(donghuaDelay);
}
catch (Exception e) {
}
//在这里才放出令牌
selectDonghuaId++;
selectDonghuaId %= 9;
}
}
//center点仅用来计算颜色
void add3DCube(int centerx, int centery, int centerz,
TransformGroup myTransGroup) {
//System.out.println("正在画该块.....");
//颜色数据结构
int[] compare = new int[6];
compare[0] = centerx;
//x
compare[1] = centerx;
//x
compare[2] = centery;
//y
compare[3] = centery;
//y
compare[4] = centerz;
//z
compare[5] = centerz;
//z
int[] compareWith = new int[6];
compareWith[0] = 1;
compareWith[1] = -1;
compareWith[2] = 1;
compareWith[3] = -1;
compareWith[4] = 1;
compareWith[5] = -1;
Color3f presentMianColor;
//面图
String presentImageFile;
mianImageFile[0] = "IMG\\coverRight.jpg";
mianImageFile[1] = "IMG\\coverLeft.jpg";
mianImageFile[2] = "IMG\\coverUp.jpg";
mianImageFile[3] = "IMG\\coverDown.jpg";
mianImageFile[4] = "IMG\\coverFront.jpg";
mianImageFile[5] = "IMG\\coverBehind.jpg";
mianImageFile[6] = "IMG\\coverCenter.jpg";
//点数据结构
Vector3f mianxin = new Vector3f();
Vector3f[] mianxinpianyi = new Vector3f[6];
mianxinpianyi[0] = new Vector3f(1, 0, 0);
mianxinpianyi[1] = new Vector3f( -1, 0, 0);
mianxinpianyi[2] = new Vector3f(0, 1, 0);
mianxinpianyi[3] = new Vector3f(0, -1, 0);
mianxinpianyi[4] = new Vector3f(0, 0, 1);
mianxinpianyi[5] = new Vector3f(0, 0, -1);
Vector3f[] dingdianPianyiX = new Vector3f[4];
dingdianPianyiX[0] = new Vector3f(0.0f, 1.0f, 1.0f);
dingdianPianyiX[1] = new Vector3f(0.0f, -1.0f, 1.0f);
dingdianPianyiX[2] = new Vector3f(0.0f, -1.0f, -1.0f);
dingdianPianyiX[3] = new Vector3f(0.0f, 1.0f, -1.0f);
Vector3f[] dingdianPianyiY = new Vector3f[4];
dingdianPianyiY[0] = new Vector3f(1.0f, 0.0f, 1.0f);
dingdianPianyiY[1] = new Vector3f(1.0f, 0.0f, -1.0f);
dingdianPianyiY[2] = new Vector3f( -1.0f, 0.0f, -1.0f);
dingdianPianyiY[3] = new Vector3f( -1.0f, 0.0f, 1.0f);
Vector3f[] dingdianPianyiZ = new Vector3f[4];
dingdianPianyiZ[0] = new Vector3f(1.0f, 1.0f, 0.0f);
dingdianPianyiZ[1] = new Vector3f( -1.0f, 1.0f, 0.0f);
dingdianPianyiZ[2] = new Vector3f( -1.0f, -1.0f, 0.0f);
dingdianPianyiZ[3] = new Vector3f(1.0f, -1.0f, 0.0f);
//通过for,集合到三个数组
Point3f[][] vert = new Point3f[6][4];
Color3f[] color = new Color3f[6];
String[] imageFile = new String[6];
for (int i = 0; i <= 5; i++) {
//计算该面 颜色和贴图
if (compare[i] == compareWith[i]) {
presentMianColor = mianColor[i];
presentImageFile = mianImageFile[i];
}
else {
presentMianColor = mianColor[6];
presentImageFile = mianImageFile[6];
//如果颜色为白色,不画该面
//continue则跳过不画
//continue ;
}
try {
//System.in.read();//暂停
}
catch (Exception e) {
}
//计算该面 面心
mianxin.x = mianxinpianyi[i].x;
mianxin.y = mianxinpianyi[i].y;
mianxin.z = mianxinpianyi[i].z;
//计算该面 四个点
Vector3f[] dingdian = new Vector3f[4];
for (int j = 0; j <= 3; j++) {
dingdian[j] = new Vector3f();
if (i == 0 || i == 1) {
dingdian[j].x = mianxin.x + dingdianPianyiX[j].x;
dingdian[j].y = mianxin.y + dingdianPianyiX[j].y;
dingdian[j].z = mianxin.z + dingdianPianyiX[j].z;
}
else if (i == 2 || i == 3) {
dingdian[j].x = mianxin.x + dingdianPianyiY[j].x;
dingdian[j].y = mianxin.y + dingdianPianyiY[j].y;
dingdian[j].z = mianxin.z + dingdianPianyiY[j].z;
}
else if (i == 4 || i == 5) {
dingdian[j].x = mianxin.x + dingdianPianyiZ[j].x;
dingdian[j].y = mianxin.y + dingdianPianyiZ[j].y;
dingdian[j].z = mianxin.z + dingdianPianyiZ[j].z;
}
}
//用顶点和颜色画 该面
//建面方法一,把vector3D对象传进去,在里面转化为float数组
//Shape3D shape=SomeShape3D.mian1of6CubeShape3D(observer,dingdian,presentImageFile,presentMianColor);
//建面方法二,把vector3D在这里转化为point3f数组,再传进去,转换更简单
Point3f[] vert1 = new Point3f[4];
Point3f[] vert2 = new Point3f[4];
//4个点的信息
for (int k = 0; k <= 3; k++) {
vert1[k] = new Point3f(SomeShape3D.fangKuaiBanJing * dingdian[k].x,
SomeShape3D.fangKuaiBanJing * dingdian[k].y,
SomeShape3D.fangKuaiBanJing * dingdian[k].z);
vert2[3 -
k] = new Point3f(SomeShape3D.fangKuaiBanJing * dingdian[k].x,
SomeShape3D.fangKuaiBanJing * dingdian[k].y,
SomeShape3D.fangKuaiBanJing * dingdian[k].z);
}
Shape3D shape1 = SomeShape3D.shapeMaker(observer, presentImageFile, vert1);
Shape3D shape2 = SomeShape3D.shapeMaker(observer, presentImageFile, vert2);
//两方法结果一样
//消失现象 可以避免,原因是各面衔接点不重合,dingdian[k].x乘上SomeShape3D.fangKuaiBanJing后有数据问题
//挂到自己的坐标系
myTransGroup.addChild(shape1);
myTransGroup.addChild(shape2);
//测试3
// for(int j=0;j<=3;j++)
// {
// vert[i][j]=new Point3f(SomeShape3D.fangKuaiBanJing*dingdian[j].x ,SomeShape3D.fangKuaiBanJing*dingdian[j].y,SomeShape3D.fangKuaiBanJing*dingdian[j].z);
// }
//color[i]=presentMianColor;
// imageFile[i]=presentImageFile;
}
//测试3
// SomeShape3D.box3D(observer,myTransGroup,vert,color,imageFile);
//System.out.println("第"+whickBlockPainted+"块完毕。");
System.out.print('.');
whickBlockPainted++;
}
//该块改变位置
//Floor:0,1,2
//totateArg:90 180 -90
//为了方便计算,先平移(坐标全减1),变换后,再平移还原(坐标全加1)
//该块改变位置
//Floor:0,1,2
//totateArg:90 180 -90
//为了方便计算,先平移(坐标全减1),变换后,再平移还原(坐标全加1)
void xyzChange(char doType, int mYtotateArg) {
//
totateArg = mYtotateArg;
//在处理过程中,原坐标先平移
x -= 1;
y -= 1;
z -= 1;
//动画预处理
yuanx = x;
yuany = y;
yuanz = z;
if (closeDonghua) { //startDonghuaX();
}
else
//换为用线程执行
{
selectedC = doType;
myThread = new Thread(this, "Rotate");
myThread.start();
}
System.out.println("新轴点x计算并保存。。。");
//新轴点计算并保存
//System.out.println("。。。"+xvec.x+xvec.y+xvec.z);
int[] newvecx = jisuanNextXYZ(doType, totateArg, xvec.x, xvec.y, xvec.z);
//System.out.println("。。。");
xvec.x = newvecx[0];
xvec.y = newvecx[1];
xvec.z = newvecx[2];
System.out.println("新轴点y计算并保存。。。");
int[] newvecy = jisuanNextXYZ(doType, totateArg, yvec.x, yvec.y, yvec.z);
yvec.x = newvecy[0];
yvec.y = newvecy[1];
yvec.z = newvecy[2];
int[] newvecz = jisuanNextXYZ(doType, totateArg, zvec.x, zvec.y, zvec.z);
zvec.x = newvecz[0];
zvec.y = newvecz[1];
zvec.z = newvecz[2];
System.out.println("新坐标计算并保存。。。");
//新坐标计算
nexyz = jisuanNextXYZ(doType, totateArg, x, y, z);
//输出处理结果
System.out.println("\n块" + (blockIdX - 1) + (blockIdY - 1) + (blockIdZ - 1) +
"从" + x + y + z + " 变到 " + nexyz[0] + nexyz[1] +
nexyz[2]);
//新坐标保存
x = nexyz[0] + 1;
y = nexyz[1] + 1;
z = nexyz[2] + 1;
System.out.println("搜寻旋转角度量。。。");
//搜寻旋转角度量
//当前位置x点的偏移
chaxvec
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?