Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: Matriisipyöritys

tn [18.04.2004 21:46:30]

#

Kuinkakohan tehdään matriisi, jolla pyöritetään pistettä mielivaltaisen akselin ympäri niin kuin OpenGL:n rotate-käskyillä. Katsoin ogl-redbookin nettiversiosta, muutta en oikein ymmärtänyt siinä esitettyjä kaavoja:

The call glRotate*(a, x, y, z) generates R as follows:
Let v = (x, y, z)T, and u = v/||v|| = (x', y', z')T.

    |  0 -y'  y'|
S = | z'   0 -x'|  and M = uuT(yläindeksi) + (cos a)(I-uuT(yläindeksi)) + (sin a)S
    |-y'  x'   0|

Siis mitä? Mitä ovat nuo uuT:t?

Toinen kysymys:
Saako OpenGL:ssä jotenkin selville mihin kohtaan ruutua se lopulta sijoittaa polygonien kulmapisteet, vai pitääkö niille itse tehdä samat pyoritys- ja siirto-operaatiot laskeakseen lopulliset paikat?

Jaska [19.04.2004 10:53:17]

#

Olkoon u mielivaltainen nxm matriisi. Tällöin u^T on mxn matriisin, jolle (u^T)(i,j)=u(j,i) kaikilla 0<j<n+1, 0<i<m+1. Matriisia u^t sanotaan u:n transpoosiksi tai transponoiduksi matriisiksi.

uu^T tarkoittaa että matriisi u on kerrottu oikealta transpoosillaan.

tn [19.04.2004 17:45:14]

#

Jaa, minä kun luulin, että nuo v ja u ovat vektoreita. Miten ne sitten luodaan x:stä, y:stä sekä z:sta, ja mitä se T niiden perässä tarkoittaa?
Kaippa kun matriisi kerrotaan puhtaalla luvulla (tuossa kosinilla ja sinillä), sen jokainen alkio kerrotaan sillä, vai onko se monimutkaisempi toimenpide?
Kyllähän x', y' ja z' tarkoittavat vektorin yksikkövektoriksi lyhennetyn version komponentteja, vai päättelinkö senkin väärin?

Markus [19.04.2004 21:50:55]

#

Tämä pyörittää vektorin ( u, v, w ) ympäri a astetta.

[ cos(a)+u*u*(1-cos(a))       -w*sin(a)+u*v*(1-cos(a))   v*sin(a)+u*w*(1-cos(a))  ]
[ w*sin(a)+v*u*(1-cos(a))     cos(a)+v*v*(1-cos(a))      -u*sin(a)+v*w*(1-cos(a)) ]
[ -v*sin(a)+w*u*(1-cos(a))    u*sin(a)+w*v*(1-cos(a))    cos(a)+w*w*(1-cos(a))    ]

Jaska [20.04.2004 00:42:35]

#

Vektorit ovat erikoistapauksia matriiseista joten puhuin matriiseista koska transponointi on määritelty myös niille. v saadaan x:stä, y:stä ja z:sta laittamalla kyseiset muuttujat alkioiksi, ja T tarkoittaa transpoosia, 1x3 -vektorin (matriisin) muuntamista 3x1 -vektoriksi (matriisiksi).

Olet tn oikeassa tuon skalaarilla kertomisen ja normittamisen suhteen.

tn [20.04.2004 10:19:26]

#

Tajusin tuon eilen itsekin. En vain aluksi ajatellut tarpeeksi pitkälle ja hoksannut että u*uT -kertolaskusta tuleekin oikean kokoinen matriisi. Tuo kaavahan sieventyy Markuksen esittämään muotoon.

Vastaus

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

Tietoa sivustosta