Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Acer
Založen: 08. 12. 2011 Příspěvky: 10
|
Zaslal: 8. prosinec 2011, 19:23:34 Předmět: Rotační matice |
|
|
Zdravím,
předem se omlouvám za hloupý dotaz, ale začínám.
Dá se nějak určit rotační matice roviny z normálového vektoru této roviny???
Hledal jsem to všude možně, ale našel jsem jenom určení rot. matice z úhlů rotace v jednotlivých osách. Nevím, no. Celkem bych to potřeboval.
Děkuji za odpovědi. |
|
Návrat nahoru |
|
|
cooty125
Založen: 22. 11. 2011 Příspěvky: 40
|
Zaslal: 8. prosinec 2011, 20:02:00 Předmět: Re: Rotační matice |
|
|
Acer napsal: |
Zdravím,
předem se omlouvám za hloupý dotaz, ale začínám.
Dá se nějak určit rotační matice roviny z normálového vektoru této roviny???
Hledal jsem to všude možně, ale našel jsem jenom určení rot. matice z úhlů rotace v jednotlivých osách. Nevím, no. Celkem bych to potřeboval.
Děkuji za odpovědi. |
Ahoj,
jsi si jistý, že to spadá do této sekce? Nevím k jakému prog. jazyku směřuješ, nebo v jakém softwaru pracuješ. JInak bych ti rád pomohl. _________________ Programátor v C# XNA a 3D Grafik.
http://www.xna.mzf.cz/
http://www.czechcode.hu.cz/ |
|
Návrat nahoru |
|
|
Acer
Založen: 08. 12. 2011 Příspěvky: 10
|
Zaslal: 8. prosinec 2011, 20:07:15 Předmět: Rotační matice |
|
|
No dělám v C++, ale nějak nechápu jak to s tím souvisí.
Nejspíš jsem si spletl sekci, jsem tu nový. Tak mi to odpusťte.
Spíš by mě zajímal matematický postup. Neví někdo??? |
|
Návrat nahoru |
|
|
nou
Založen: 28. 07. 2007 Příspěvky: 1047
|
Zaslal: 8. prosinec 2011, 20:15:23 Předmět: |
|
|
no rotacia sa bezne udava vektorom a uhlom o ktory sa ma potocit. alebo teda neviem co ma s rotaciou rovina. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
|
Acer
Založen: 08. 12. 2011 Příspěvky: 10
|
Zaslal: 8. prosinec 2011, 20:19:51 Předmět: Rotační matice |
|
|
Moje chyba. Rovinou jsem myslel nějakou plochu(trojuhelník, ...). Takže, když mám normalizovaný normálový vektor nemůžu z něj určit rotaci (matici) té plochy(bez toho, abych znal úhel) ???
EDIT: Dělám v OpenGL |
|
Návrat nahoru |
|
|
igor
Založen: 28. 07. 2007 Příspěvky: 196
|
Zaslal: 8. prosinec 2011, 22:14:38 Předmět: |
|
|
Ten dotaz moc nedává smysl:
- rotace roviny vůči čemu? Asi vůči nějaké "defaultní" rovině?
- pokud to myslíš takhle, tak takových rotací může být nekonečně mnoho, takže použiješ buď 1 z nich nebo tam dáš nějakou omezující podmínku určenou např. nějakými vektory z trojúhelníka (např. že vektor AB je "v defaultní poloze" ve směru Y a ptáš se na rotaci, která zrotuje "defaultní" normálový vektor na požadovaný normálový vektor a taky tento jednotkový vektor ve směru Y podle poloh vrcholů AB v zdaném trojúhelníku).
Jinak (nebudu teď na základě obsahu dotazu moc přesný a nebudu používat zažité matematické pojmy) rotační matice jsou prostě 3 vektory odpovídající původním "osovým" (bázovým) vektorům (1,0,0), (0,1,0), (0,0,1) tak, jak se mají zrotovat - takže např. při rotaci o 90 stupňů kolem osy Z to budou vektory (0,1,0), (-1,0,0), (0,0,1) - tyto vektory dáš do sloupců matice a máš danou rotační matici (bacha na řádkové/sloupcové uspořádání v daném API/v dané matematické knihovně).
Takže pokud to vezmeš třeba tak, že "defaultní" rovina je YZ a má jako normálový vektor bázový vektor ve směru osy X, tak matice, která ji zrotuje do polohy té tvé roviny P, bude mít v prvním sloupci normalizovaný normálový vektor P, ve druhém sloupci vektor kolmý na P - buď spočítáš třeba z toho trojúhelníka jako B-A nebo ho třeba spočítáš tak, že z normálového vektoru (nx,ny,nz) vytvoříš vektor (0,-nz,ny) (bacha aby nebyl nulový, pokud by to hrozilo, můžeš použit třeba (-nz,0,nx) nebo (-ny,nx,0) - stačí se rozhodnout mezi 2 variantami podle absolutní hodnoty souřadnice, která se "ztratí" a místo ní bude 0 - je vhodnější/nutné takto "ztratit" tu menší souřadnici). Takto vytvořený druhý vektor znormalizuješ a třetí vektor dopočítáš vektorovým součinem (cross product... a bacha na pořadí ve vektorovém součinu - levotočivost/pravotočivost). Ty tři vektory použiješ jako sloupce matice a máš matici, která dělá to, co si myslím, že možná chceš udělat Jestli jako defaultní rovinu budeš brát XY nebo ZX, tak ty vektory dáš akorát do jiných sloupců, pozor na pořadí a levotočivost/pravotočivost.
EDIT:
Nebo pokud ti ten úhel nevadí, tak ho můžeš vytáhnout ze skalárního součinu mezi "defaultním" a "aktuálním" normálovým vektorem a osu z vektorového součinu těchto vektorů (tak to můžeš dělat pro rotaci mezi každými 2 rovinami, první postup by taky pro rotaci mezi 2 rovinami šel použít, akorát by tam ještě bylo násobení jedné matice transpozicí druhé... vždycky tak ale spočítáš 1 z více možných matic, těch možných rotací je nekonečně mnoho pokud ti jde jen o normálové vektory). |
|
Návrat nahoru |
|
|
Acer
Založen: 08. 12. 2011 Příspěvky: 10
|
Zaslal: 9. prosinec 2011, 14:43:34 Předmět: Rotační matice |
|
|
Aha. Nějaký srozumitelný odkaz na web by nebyl??? |
|
Návrat nahoru |
|
|
igor
Založen: 28. 07. 2007 Příspěvky: 196
|
Zaslal: 9. prosinec 2011, 15:19:08 Předmět: |
|
|
Vzhledem k tomu, že ani po druhé výzvě nechceš upřesnit svůj dotaz a celý můj text komentuješ jen slovem "aha" (místo např. sdělení, že je to moc zmateně napsáno nebo že nerozumíš některým pojmům nebo ještě něco jiného), už k tomu nemám dál co říct ani nemám na co odkázat. |
|
Návrat nahoru |
|
|
pcmaster
Založen: 28. 07. 2007 Příspěvky: 1824
|
Zaslal: 9. prosinec 2011, 16:33:33 Předmět: |
|
|
Acer, precital si si, co ti Igor napisal? Povedz nam o sebe nieco... mas za sebou aspon linearnu algebru na vyske, pripadne daval si pozor na matike na strednej skole? Potom ti skusime poradit co najvhodnejsie.
Okrem toho, mohol by si este upresnit dotaz - presne nam povedz, co mas, co sa snazis vytvorit.
Strucna odpoved na tvoj dotaz je: NIE, neda sa to z toho. _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
Návrat nahoru |
|
|
Acer
Založen: 08. 12. 2011 Příspěvky: 10
|
Zaslal: 9. prosinec 2011, 17:15:11 Předmět: Rotační matice |
|
|
Snad to trochu osvětlí tento kód:
kód: |
void rotateMatrix( float x, float y, float z)// x, y, z .. souřadnice normálového vektoru "objektu"..
{
//velikost prumetu vektoru na osy..
float szXZ = sqrt((x * x) + (z * z));
float szXY = sqrt((x * x) + (y * y));
float szYZ = sqrt((y * y) + (z * z));
//sinusy a kosinusy uhlu vektoru...
float sinY = z / szXZ;
float cosY = x / szXZ;
float sinZ = y / szXY;
float cosZ = x / szXY;
float sinX = z / szYZ;
float cosX = y / szYZ;
GLfloat mx[16] = //rotační matice..
{cosY * cosZ, -cosY * sinZ, sinY, 0,
sinX * sinY * cosZ + cosX * sinZ, -sinX * sinY * sinZ + cosX * cosZ, -sinX * cosY, 0,
-cosX * sinY * cosZ + sinX * sinZ, cosX * sinY * sinZ + sinX * cosZ, cosX * cosY, 0,
0, 0, 0, 1};
//násob modelview matici..
glMultMatrixf(mx);
}
|
Takže asi hotovo. Jinak k čemu je to dobré? Netuším. Začínám, tak experimentuju. A tiše doufám, že z toho něco vznikne. Ale myslím, že je dobré něco zkoušet, třeba z toho něco bude
Díky moc za Váš čas. Kdybych měl nějaký další problém, napíšu. |
|
Návrat nahoru |
|
|
igor
Založen: 28. 07. 2007 Příspěvky: 196
|
Zaslal: 9. prosinec 2011, 18:37:41 Předmět: |
|
|
Takhle ten kód určitě není dobře, může tam nastat dělení nulou - pokud normálový vektor bude např. (0,0,1), szXY bude 0, sinZ a cosZ budou NaN ("not a number", který vznikne při dělení .0f/.0f) a některé prvky matice budou NaN.
Nezkoumal jsem to dopodrobna, ale tuším, že ta matice je nějakým vynásobením základních rotací podle os X, Y a Z o úhly, které svírají průměty normálového vektoru na roviny XY, YZ, ZX? Jestli je to takhle, tak to obecně fungovat nebude - každá rotace zrotuje i ten souřadnicový systém, podle kterého proběhne další rotace, takže záleží na jejich pořadí a nemůžeš použit úhly vypočtené v té základní soustavě (před jakoukoliv rotací). Navíc ty roviny bereš jako XY, YZ, XZ, konzistentně by to mělo být XY, YZ, ZX.
A aby toho nebylo málo - každá ta elementární X Y nebo Z rotace souvisí s rotací jiné "defaultní" základní roviny. Pojem "matice rotace roviny" bez dalšího upřesnění fakt moc nedává smysl, zkus si to promyslet.
Příště prosím zkus trochu víc spolupracovat s lidmi, kteří se ti snaží odpovědět. |
|
Návrat nahoru |
|
|
Acer
Založen: 08. 12. 2011 Příspěvky: 10
|
Zaslal: 9. prosinec 2011, 19:09:19 Předmět: Rotační matice |
|
|
Ne, ne. Jde mi o základní rotaci objektu při jeho vytvoření při základní jednotkové matici (proto ta normála). Mělo být spíš: výchozí matice rotace plochy(trojůhelníku). Chtěl jsem vlastně zkusit detekci kolizí pomocí "Backtransformingu". Jako, že bych tuhle matici invertoval a pak už tu kolizi počítal jen z X a Y hodnoty té plochy. Ale k tomu teprve směřuju. Teď dělám takovéhle různé experimenty |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 10. prosinec 2011, 02:15:21 Předmět: Re: Rotační matice |
|
|
Acer napsal: |
Dá se nějak určit rotační matice roviny z normálového vektoru této roviny??? |
Slovo "rovina" bych vypustil. Jinými slovy máš jednotkový vektor a chceš udělat rotační matici takovou, která orotuje nějaký bázový vektor (třeba 0,0,1) tak, že bude shodný s tvým vektorem. Pak je to jednoduché.
Rotační osa = normalizovaný vektorový součin bázového vektoru (např. 0,0,1) a vektoru, na jaký to chceš orotovat.
Rotační úhel = úhel mezi oběma vektory. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
pcmaster
Založen: 28. 07. 2007 Příspěvky: 1824
|
Zaslal: 12. prosinec 2011, 09:04:47 Předmět: |
|
|
Ale furt je tam taky malilinky detail - ze ked "bazovy" vektor zvoli nahodne, nahodne sa mu bude aj jeho objekt este stale tocit okolo toho "normaloveho" vektoru A nic s tym nespravi, pretoze to zadanie je zle. _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
Návrat nahoru |
|
|
|