Только пожалуйста не надо бить ногами по лицу сразу lol.gif

Решил я значит заняться одним бесполезным делом - поучиться.
И жертву своей учебы я выбрал Macromedia Flash MX 2004 и Аналитическую геометрию. Короче решил на флеше забацать кубик трехмерный с управлением... lol.gif

Сначала я долго возился с добавлением третьей оси(не мог придумать как это сделать), потом парился с поворотом осей... И вроде бы все работало пока не стал я его тестить. о чудо оно заработало, все крутиться как надо... Но вот только когда повернеш оси на 90 градусов вверх и на 90 градусов влево, и после этого будешь менять начало координат(посмотрим,вверх а потом влево, а потом пойдем впередsmile.gif) Кубик сильно расколбасит...

Я конечно понимаю что у меня ошибка в ДНК lol.gif
Но кто понимает то что я тут написал помогите найти ошибку в коде кубика smile.gif
Кстати ошибка точно математическая, поэтому в этот раздел и пишу

Вот что у меня написано в первом фрейме:
Код


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

В общем все rolleyes.gif