📄 mofang.java
字号:
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 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]="D:\\MyWorkSpace\\checkDemo\\src\\com\\scitel\\IMG\\coverRight.jpg";
mianImageFile[1]="D:\\MyWorkSpace\\checkDemo\\src\\com\\scitel\\IMG\\coverLeft.jpg";
mianImageFile[2]="D:\\MyWorkSpace\\checkDemo\\src\\com\\scitel\\IMG\\coverUp.jpg";
mianImageFile[3]="D:\\MyWorkSpace\\checkDemo\\src\\com\\scitel\\IMG\\coverDown.jpg";
mianImageFile[4]="D:\\MyWorkSpace\\checkDemo\\src\\com\\scitel\\IMG\\coverFront.jpg";
mianImageFile[5]="D:\\MyWorkSpace\\checkDemo\\src\\com\\scitel\\IMG\\coverBehind.jpg";
mianImageFile[6]="D:\\MyWorkSpace\\checkDemo\\src\\com\\scitel\\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("新坐标计算并保存
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -