Miten saan määritettyä vektorin kahden asteluvun pohjalta (x ja y)? Vektorin x- ja y-arvot on helppo laskea, mutta z tuottaa onkelmia, koska siihen vaikuttavat molemmat.
Eikun eipäs olekkaan helppoa, kyllähän niihin kaikkiin vaikuttaa molemmat.
Hehe :) Pähkäilin tuota aika pitkään.
movX = sin(radSivu) * cos(radYlos); movY = sin(radYlos); movZ = cos(radSivu) * cos(radYlos);
Tuo siis toimii oikeassa 3D-koordinaatistossa, jossa Z kasvaa poispäin, X oikealle ja Y ylös.
Ja minä kun olen aina miettinyt, mitä vektorit ovat. Ja kuitenkin olen joskus ajat sitten pähkäillyt itsekin nuo kolme riviä ja käyttänyt niitä 3D-ohjelmoinnissa. :)
Entäpä jos mukaan otetaan myös Z-akselin ympäri pyöriminen?
2-ulotteisella tasolla (paperilla) voi kääntyä yhden akselin ympäri, mutta toisen ympäri kääntyminen vie pois tältä tasolta eli 3. ulottuvuuden suuntaan. Vastaavasti Z-akselin ympäri pyörimisen lisääminen edelliseen kaavaan tekisi siitä 4-ulotteisen :)
Jos tarkoitat kuitenkin sitä, että voisi kääntyä Z-akselin ympäri niin, että roikkuisikin 180 asteen jälkeen pää alaspäin akselin alapuolella, se on aivan oma kaavansa eikä liity tuohon mitenkään. Jos haluat muuttaa vain liikesuuntaa sen mukaan, kaava on seuraava (en testannut, toivottavasti toimii :), jos taas haluat huomioida jo olemassaolevan sijainnin eli liikkua kaaressa Z-akselia kiertäen, joudut keksimään itse.
// Aiemmat laskut on siis jo tehty... // ensin pythagoraan lauseella X:ää ja Y:tä yhteensä liikuttava matka Sade = sqrt((movX * movX) + (movY * movY)); // Jos Sade = 0, on turha jatkaa (ja atan tekee virheen) // Sitten lasketaan, paljonko on jo ikään kuin pyöritty Z-akselin ympäri // esim. jos liike on yläoikealle, ei olla Z-akselin yläpuolella OlevaKulma = atan(movX / movY); // HUOM! Jos movY < 0, pitää lisätä kulmaan 180 astetta. // (-1 / -1) on eri asia kuin (1 / 1) movX = Sade * sin(OlevaKulma + KulmaZ); movY = Sade * cos(OlevaKulma + KulmaZ);
Yllättävää, atan laskee kulman oikein, vaikka sivujen suhde olisi negatiivinen ja vaikka movY olisi nolla, jolloin jakolaskusta tulee ääretön.
0/0 on määrittelemätön, joten se kannattaa oikeasti tarkistaa. 1/0 on ääretön, ja se toimii oikein (!).
Aihe on jo aika vanha, joten et voi enää vastata siihen.