//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==compareWith)
{
presentMianColor=mianColor;
presentImageFile=mianImageFile;
}
else
{
presentMianColor=mianColor[6];
presentImageFile=mianImageFile[6];
//如果颜色为白色,不画该面
//continue则跳过不画
//continue ;
} try
{
//System.in.read();//暂停
}
catch(Exception e)
{
} //计算该面 面心
mianxin.x=mianxinpianyi.x ;
mianxin.y=mianxinpianyi.y ;
mianxin.z=mianxinpianyi.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[j]=new Point3f(SomeShape3D.fangKuaiBanJing*dingdian[j].x ,SomeShape3D.fangKuaiBanJing*dingdian[j].y,SomeShape3D.fangKuaiBanJing*dingdian[j].z);
// }
//color=presentMianColor;
// imageFile=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=new MyPoint(xvec.x-nexyz[0],xvec.y-nexyz[1],xvec.z-nexyz[2]);
//当前位置y点的偏移
chayvec=new MyPoint(yvec.x-nexyz[0],yvec.y-nexyz[1],yvec.z-nexyz[2]);
//当前位置z点的偏移
chazvec=new MyPoint(zvec.x-nexyz[0],zvec.y-nexyz[1],zvec.z-nexyz[2]); System.out.println("---------x点的偏移"+(xvec.x-nexyz[0])+" "+(xvec.y-nexyz[1])+" "+(xvec.z-nexyz[2]));
System.out.println("---------y点的偏移"+(yvec.x-nexyz[0])+" "+(yvec.y-nexyz[1])+" "+(yvec.z-nexyz[2]));
System.out.println("---------z点的偏移"+(zvec.x-nexyz[0])+" "+(zvec.y-nexyz[1])+" "+(zvec.z-nexyz[2]));
//MoFang.myWait(); int[] xZJD=shouSuoXYZRotate(yuanx,yuany,yuanz,nexyz[0],nexyz[1],nexyz[2]); //重新在3D界面中输出 //1,计算坐标
float fx ;
float fy ;
float fz ;
fx=(float)kuaiZhongXinWeizhi*(x-1);
fy=(float)kuaiZhongXinWeizhi*(y-1);
fz=(float)kuaiZhongXinWeizhi*(z-1);
//变换量 transp.setTranslation(new Vector3f(fx,fy,fz));
//MoFang.myWait();
transx.rotX(Math.toRadians(xZJD[0]));//anglex
transy.rotY(Math.toRadians(xZJD[1]));
transz.rotZ(Math.toRadians(xZJD[2])); //生效
if(closeDonghua)
{ //变换生效
transGroupx.setTransform(transx);
transGroupy.setTransform(transy);
transGroupz.setTransform(transz);
transGroupp.setTransform(transp);
} //不刷新,在动画后刷新,可以输出了,但在动画后
canNew=true; //同时更改positionArray
MoFang.positionArray[(nexyz[0]+1)][(nexyz[1]+1)][(nexyz[2]+1)].setBlockId(blockIdX,blockIdY,blockIdZ);
}
int getChujiao(int xyzQian,int xyzHou)
{
int value=0;
if((xyzQian==-1)&&(xyzHou==-1))
{
value= 3*(-1)*45 ;
}
else if((xyzQian==-1)&&(xyzHou==1))
{
value= 5*(-1)*45 ;
}
else if((xyzQian==1)&&(xyzHou==-1))
{
value= 1*(-1)*45 ;
}
else if((xyzQian==1)&&(xyzHou==1))
{
value= 7*(-1)*45 ;
}
else if((xyzQian==0)&&(xyzHou==-1))
{
value= 2*(-1)*45 ;
}
else if((xyzQian==0)&&(xyzHou==1))
{
value= 6*(-1)*45 ;
}
else if((xyzQian==-1)&&(xyzHou==0))
{
value= 4*(-1)*45 ;
}
else if((xyzQian==1)&&(xyzHou==0))
{
value= 0*(-1)*45 ;
}
else if((xyzQian==0)&&(xyzHou==0))
System.out.println("中间块,返回任意初角");
else
System.out.println("参数错误x="+xyzQian+" y="+xyzHou);
return value; }
}
class Position
{
int x ;
int y ;
int z ; int newx ;
int newy ;
int newz ;
boolean haveNew=false ; public Position(int i,int j,int k)
{
x=i ;
y=j ;
z=k ;
} void setBlockId(int blockIdX,int blockIdY,int blockIdZ)
{
newx=blockIdX ;
newy=blockIdY ;
newz=blockIdZ ; haveNew=true ;
//只要设为true,马上会执行newToOld,使他回到false
} void newToOld()
{
x=newx ;
y=newy ;
z=newz ; haveNew=false ;
//保证了每一次操作后全为false
} //得到某块u位置
public static int[] getPxyzFromPositionAy(int x,int y,int z,Position[][][] positionArray)
{
int[] p={0,0,0}; for(int i=0;i<=2;i++)
for(int j=0;j<=2;j++)
for(int k=0;k<=2;k++)
{
if ((positionArray[j][k].x==x)&&(positionArray[j][k].y==y)&&(positionArray[j][k].z==z))
{ p[0]=i;
p[1]=j;
p[2]=k; return p;
} } System.out.println("该方块没有对应的位置");
return p;
//这里不该返回任何东西,该抛出异常
}
}
//Point3f,Vector3f不好用,我自定义的三维变量
class MyPoint
{int x;
int y;
int z;
//构造函数一
MyPoint(int getx,int gety,int getz)
{
x=getx;
y=gety;
z=getz; }
//构造函数二,转化float为int
MyPoint(float getx,float gety,float getz)
{
x=(int)getx;
y=(int)gety;
z=(int)getz; }
} |