Решил я значит заняться одним бесполезным делом - поучиться.
И жертву своей учебы я выбрал Macromedia Flash MX 2004 и Аналитическую геометрию. Короче решил на флеше забацать кубик трехмерный с управлением...
Сначала я долго возился с добавлением третьей оси(не мог придумать как это сделать), потом парился с поворотом осей... И вроде бы все работало пока не стал я его тестить. о чудо оно заработало, все крутиться как надо... Но вот только когда повернеш оси на 90 градусов вверх и на 90 градусов влево, и после этого будешь менять начало координат(посмотрим,вверх а потом влево, а потом пойдем вперед) Кубик сильно расколбасит...
Я конечно понимаю что у меня ошибка в ДНК
Но кто понимает то что я тут написал помогите найти ошибку в коде кубика
Кстати ошибка точно математическая, поэтому в этот раздел и пишу
Вот что у меня написано в первом фрейме:
Код
xc=275;
yc=200;
ix=0;
iy=0;
iz=0;
koef=500;
x=250;
y=250;
z=250;
kx = Array()
ky = Array()
kz = Array()
xnx = Array()
ynx = Array()
znx = Array()
xny = Array()
yny = Array()
zny = Array()
xnz = Array()
ynz = Array()
znz = Array()
gradx=0
grady=0
gradz=0
_root.onEnterFrame = function() {
_root.createEmptyMovieClip("myclip",1);
function xi(fx,fy,fz){
if (fz<(koef-2)){
xk=fx/(1-(fz/koef));
return xc+xk;
} else {
return fx/(1-((koef-2)/koef));
}
}
function yi(fx,fy,fz){
if (fz<(koef-2)){
yk=fy/(1-(fz/koef));
return yc+yk;
} else {
return fy/(1-((koef-2)/koef));
}
}
function preobraz_ox(px,py,pz,grx,gry,grz,ii){
cosi1i = Math.cos(Math.PI/180*0)
cosj1i = Math.cos(Math.PI/180*90)
cosk1i = Math.cos(Math.PI/180*90)
cosi1j = Math.cos(Math.PI/180*90)
cosj1j = Math.cos(Math.PI/180*grx)
cosk1j = Math.cos(Math.PI/180*(270+grx))
cosi1k = Math.cos(Math.PI/180*90)
cosj1k = Math.cos(Math.PI/180*(90+grx))
cosk1k = Math.cos(Math.PI/180*grx)
xnx[ii]=px*cosi1i+py*cosj1i+pz*cosk1i
ynx[ii]=px*cosi1j+py*cosj1j+pz*cosk1j
znx[ii]=px*cosi1k+py*cosj1k+pz*cosk1k
}
function preobraz_oy(px,py,pz,grx,gry,grz,ii){
cosi1i = Math.cos(Math.PI/180*gry)
cosj1i = Math.cos(Math.PI/180*90)
cosk1i = Math.cos(Math.PI/180*(90+gry))
cosi1j = Math.cos(Math.PI/180*90)
cosj1j = Math.cos(Math.PI/180*0)
cosk1j = Math.cos(Math.PI/180*90)
cosi1k = Math.cos(Math.PI/180*(270+gry))
cosj1k = Math.cos(Math.PI/180*90)
cosk1k = Math.cos(Math.PI/180*gry)
xny[ii]=px*cosi1i+py*cosj1i+pz*cosk1i
yny[ii]=px*cosi1j+py*cosj1j+pz*cosk1j
zny[ii]=px*cosi1k+py*cosj1k+pz*cosk1k
}
function preobraz_oz(px,py,pz,grx,gry,grz,ii){
cosi1i = Math.cos(Math.PI/180*grz)
cosj1i = Math.cos(Math.PI/180*(90+grz))
cosk1i = Math.cos(Math.PI/180*90)
cosi1j = Math.cos(Math.PI/180*(270+grz))
cosj1j = Math.cos(Math.PI/180*grz)
cosk1j = Math.cos(Math.PI/180*90)
cosi1k = Math.cos(Math.PI/180*90)
cosj1k = Math.cos(Math.PI/180*90)
cosk1k = Math.cos(Math.PI/180*0)
xnz[ii]=px*cosi1i+py*cosj1i+pz*cosk1i
ynz[ii]=px*cosi1j+py*cosj1j+pz*cosk1j
znz[ii]=px*cosi1k+py*cosj1k+pz*cosk1k
}
kx[1] = (-x+ix)
ky[1] = (y+iy)
kz[1] = (z+iz)
kx[2] = (x+ix)
ky[2] = (y+iy)
kz[2] = (z+iz)
kx[3] = (x+ix)
ky[3] = (-y+iy)
kz[3] = (z+iz)
kx[4] = (-x+ix)
ky[4] = (-y+iy)
kz[4] = (z+iz)
kx[5] = (-x+ix)
ky[5] = (y+iy)
kz[5] = (-z+iz)
kx[6] = (x+ix)
ky[6] = (y+iy)
kz[6] = (-z+iz)
kx[7] = (x+ix)
ky[7] = (-y+iy)
kz[7] = (-z+iz)
kx[8] = (-x+ix)
ky[8] = (-y+iy)
kz[8] = (-z+iz)
for (i=1;i<9;i+=1){
preobraz_ox(kx[i],ky[i],kz[i],gradx,0,0,i);
}
for (k=1;k<9;k+=1){
preobraz_oz(xnx[k],ynx[k],znx[k],0,0,gradz,k);
}
for (j=1;j<9;j+=1){
preobraz_oy(xnz[j],ynz[j],znz[j],0,grady,0,j);
}
x1=xi(xny[1],yny[1],zny[1]);
y1=yi(xny[1],yny[1],zny[1]);
x2=xi(xny[2],yny[2],zny[2]);
y2=yi(xny[2],yny[2],zny[2]);
x3=xi(xny[3],yny[3],zny[3]);
y3=yi(xny[3],yny[3],zny[3]);
x4=xi(xny[4],yny[4],zny[4]);
y4=yi(xny[4],yny[4],zny[4]);
x5=xi(xny[5],yny[5],zny[5]);
y5=yi(xny[5],yny[5],zny[5]);
x6=xi(xny[6],yny[6],zny[6]);
y6=yi(xny[6],yny[6],zny[6]);
x7=xi(xny[7],yny[7],zny[7]);
y7=yi(xny[7],yny[7],zny[7]);
x8=xi(xny[8],yny[8],zny[8]);
y8=yi(xny[8],yny[8],zny[8]);
myclip.lineStyle(1,0x000000);
myclip.moveTo(x1,y1);
myclip.lineTo(x2,y2);
myclip.lineTo(x3,y3);
myclip.lineTo(x4,y4);
myclip.lineTo(x1,y1);
myclip.lineTo(x5,y5);
myclip.lineTo(x6,y6);
myclip.lineTo(x7,y7);
myclip.lineTo(x8,y8);
myclip.lineTo(x5,y5);
myclip.lineTo(x6,y6);
myclip.lineTo(x2,y2);
myclip.lineTo(x3,y3);
myclip.lineTo(x7,y7);
myclip.lineTo(x8,y8);
myclip.lineTo(x4,y4);
}
А вот что в кнопке управления:
Код
on (keyPress "a") {
ix = ix+2*Math.cos(Math.PI/180*grady);
iz = iz-2*Math.sin(Math.PI/180*grady);
}
on (keyPress "d") {
ix = ix-2*Math.cos(Math.PI/180*grady);
iz = iz+2*Math.sin(Math.PI/180*grady);
}
on (keyPress "w") {
iz=iz+2*Math.cos(Math.PI/180*(gradx+grady));
iy=iy-2*Math.sin(Math.PI/180*gradx);
ix=ix+2*Math.sin(Math.PI/180*grady);
}
on (keyPress "s") {
iz=iz-2*Math.cos(Math.PI/180*(gradx+grady));
iy=iy+2*Math.sin(Math.PI/180*gradx);
ix=ix-2*Math.sin(Math.PI/180*grady);
}
on(keyPress "<Down>"){
gradx+=Math.cos(Math.PI/180*grady);
gradz+=Math.sin(Math.PI/180*grady);
}
on(keyPress "<Up>"){
gradx-=Math.cos(Math.PI/180*grady);
gradz-=Math.sin(Math.PI/180*grady);
}
on(keyPress "<Left>"){
grady+=1;
}
on(keyPress "<Right>"){
grady-=1;
}
коэффициент koef=500 подбирал руками, в некоторый момент происходит деление на ноль, но этого незаметно, т.к. "Задние" стенки кубика будут уже "за пределами" экрана(Когда заходим внутрь кубика)...
Файлик с кубиком прикрепил 111.rar
В общем все