Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Vektorin pyörittäminen

Kray [21.03.2008 09:04:24]

#

Oletetaan, että minulla on 3d-avaruudessa tietty piste. Minulla on verteksi etäisyydellä n pisteestä. Miten pystyn laskemaan verteksin niin, että liikutan sitä pitäen sen koko ajan etäisyydellä n pisteestä? Eli siis se kiertää pistettä tietyllä etäisyydellä.
Edit: ja miten voin laskea kahden verteksin etäisyyden toisistaan?

Metabolix [21.03.2008 10:30:35]

#

Nyt mahtaisi olla aika opetella hieman vektorilaskentaa.

Pisteiden etäisyys toisistaan selviää Pythagoraan lausetta soveltamalla. Laske ensin pisteiden välinen vektori (eli pisteiden paikkavektoreiden erotus) ja sitten sen pituus.

Pyörittämisessä tulee ensin vähentää vektorista pyörityksen keskipiste, jolloin saatua vektoria v tulee pyörittää origon ympäri. Pyörityksen lopuksi sama arvo tietenkin lisätään saatuun vektoriin. Itse pyörityksessä jaetaan ensin vektori pyöritysakselin suuntaiseen ja ja sitä vastaan kohtisuoraan komponenttiin. Näistä ensimmäinen ei tietenkään muutu pyörityksessä, ja jälkimmäistä on helppo pyörittää. Olkoon tämä vektori c. Sitten tarvitaan vielä akseliin (a) ja c-vektoriin nähden kohtisuora vektori s, joka saadaan ristitulosta a×c. Näiden perusteella saadaan uusi akseliin nähden kohtisuora vektori k = s sin(t) + c cos(t), missä t on pyörityskulma akselin ympäri. Tähän pitää vielä lisätä aiemmin laskettu vektorin akselin suuntainen komponentti, ja lopuksi tilanne vielä palautetaan avaruudessa paikalleen lisäämällä piste, jonka ympäri pyöritys tapahtui.

Tällainen pyöritys ei siis tapahdu tietyn pisteen vaan tietyn suoran ympäri, pitäähän pyöritykseen sisältyä tieto, minne päin pyöritetään.

Pyöritetään pistettä A suoran BC ympäri. Nyt |x| tarkoittaa vektorin x pituutta.
Uusi pyöritettävä vektori:
v = A - B
Pyöritysakseli normalisoituna:
a = (C - B) / |C - B|
Akselin suuntainen komponentti:
va = (v · a) a
Kohtisuorat komponentit:
c = v - va
s = a × c

Yhdistäminen:
k = s sin(t) + c cos(t)
u = k + va
A2 = u + B

User137 [21.03.2008 10:39:20]

#

Edit: Ups, lisätäänpäs vielä 3D, en tosin ymmärrä ensimmäistä kysymystä täysin.

kray kirjoitti:

Miten pystyn laskemaan verteksin niin, että liikutan sitä pitäen sen koko ajan etäisyydellä n pisteestä? Eli siis se kiertää pistettä tietyllä etäisyydellä.

Valitaan kulma pisteestä a-b, radiaaneina (90 astetta vaikka):
kulma = pi/180.0*90.0
etäisyys = 5
pistex = cos(kulma)*etäisyys
pistey = sin(kulma)*etäisyys

kray kirjoitti:

Edit: ja miten voin laskea kahden verteksin etäisyyden toisistaan?

Pythagoraan lausetta soveltamalla neliöjuuri pisteiden välisen vektorin neliöstä:
dx = p2x-p1x
dy = p2y-p1y
dz = p2z-p1z
etäisyys = sqrt(dx*dx+dy*dy+dz*dz)

Kray [23.03.2008 19:34:32]

#

Hmm... Etäisyyden laskeminen toimii, kiitos siitä. Ei aivan selvinnyt tuo itse pyörittäminen, ei Metabolixin eikä User137:n esimerkistä... Mitä et ymmärtänyt?

User137 [23.03.2008 20:56:21]

#

Kerro yksinkertainen esimerkki mihin käytät pyöritystä, "kellon" viisariin, gravitaatiomainen liike hiukkasilla, "peräkärry":mäinen efekti jossa peräkärry pitää aina tasoittaa takapuskuriin kiinni, piste tasolla kuten metaboliksin erimerkissä vai joku muu? Kaikki edellämainitut ovat aivan erilaista matematiikkaa tai riippuu käytännössä monesta asiasta kuinka se tulee toteuttaa. Oma esimerkkini vain luo Z akselin ympärillä pyörivän pisteen tietyssä kulmassa tietyn etäisyyden päähän akselista, eli vastaa kysymykseesi "Eli siis se kiertää pistettä tietyllä etäisyydellä".

Vastaus

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

Tietoa sivustosta