Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: 3d vektori asteluvun pohjalta

nakkikorva [03.03.2005 07:49:06]

#

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.

Metabolix [03.03.2005 08:11:31]

#

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.

hunajavohveli [03.03.2005 13:15:07]

#

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. :)

nakkikorva [03.03.2005 13:48:12]

#

Entäpä jos mukaan otetaan myös Z-akselin ympäri pyöriminen?

Metabolix [04.03.2005 15:50:58]

#

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 (!).

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta