Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: 3D-verteksit tottelemaan skeletonia

kayttaja-3842 [11.06.2009 14:14:01]

#

Terve kaikki,

Eli väsäsin tuossa äsken aikani kuluksi simppelin skeleton järjestelmän, joka siis laskee luurangon uusia sijainteja. Esim jos kyynärvartta liikutetaan liikkuu käden muun osa mukana. Seuraavaksi aloin pähkäilee kuinka saada modellin verteksit tottelemaan skeletonia. Eli ongelmani on se, että en keksi miten saada tietyt verteksit tottelemaan tiettyä skeletonin osaa. Esim. ranteen ympärillä olevat verteksien tulisi totella ranteen jointtia eikä esim lanteen jointtia.

Onko idea jotenkin sillai, että ranteen lähellä olevat ovat laitettu tottelemaan rannetta esim. id avulla ranteen jointin id on esim. 3 ja tämän lähettyvillä olevat verteksit tottelevat jointtia jonka id on 3 eli ranne.

...toivottavasti ymmärsitte mitä tarkoitin?

Kiitos.

Metabolix [11.06.2009 14:49:38]

#

Joka luulla on oma koordinaatistonsa (origo luun tyvessä ja akselit valitsemallasi tavalla; helpointa on, jos yksi akseli osoittaa luun suuntaan). Kun luu liikkuu, tämän koordinaatiston origo liikkuu, ja kun luu kääntyy, koordinaatisto kääntyy.

Aloita siitä, että jokainen verteksi on sidottu yhteen luuhun. Laske sen sijainti suhteessa luun alkuperäiseen koordinaatistoon (vähennä luun sijainti ja pyöritys suhteessa malliin) ja sitten tästä sijainti siirretyssä ja käännetyssä koordinaatistossa (pyöritä ja siirrä takaisin). Laskut ovat samat kuin silloin, kun luussa on kiinni toinen luu (esimerkiksi olkavarressa käsivarsi), jota pitää kääntää ja liikuttaa suhteessa ensimmäiseen luuhun eikä suhteessa keskiruumiiseen.

Hienoissa malleissa verteksit liittyvät useampaan luuhun erilaisilla painokertoimilla, jottei esimerkiksi ranteen taivuttaminen jätä selkäpuolelle yksittäistä pitkää rakoa vaan venytys jakautuu tasaisemmin nivelen lähiympäristöön.

Markus [11.06.2009 18:25:30]

#

Sinun pitää "käsin" määrätä mikä verteksi liikkuu minkäkin luun mukana, eli annat jokaiselle verteksille luun indeksin. Voit tietenkin yrittää automatisoida tämän vaikka antamalla jokaiselle verteksille luuksi aina lähimmän luun, mutta tämä toimii vain yksinkertaisimmissa tapauksissa.

Kun olet määrännyt verteksille luun, liikutetaan verteksiä luun mukana seuraavasti. Laske luulle matsiisit M0 eli luun matriisi perusasennossa ja Mt eli luun matriisi uudessa asennossa. Saat kuvattua verteksin v, matriisin virittämään koordinaatistoon laskemalla M0^-1*v ja sitten kuvattua sen uuteen asentoon kertomalla tulos matriisilla Mt. Lopullinen kaava on siis Mt*M0^-1*v. Voit esilaskea matriisin Mt*M0^-1 jokaiselle luulle, joten verteksia kohden tarvitsee tehdä vain yksi kertolasku (Mt*M0^-1)*v.

Vastaus

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

Tietoa sivustosta