Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Buksy
Založen: 03. 01. 2009 Příspěvky: 19 Bydliště: KE
|
Zaslal: 6. leden 2009, 20:34:13 Předmět: Kamera ? |
|
|
Bry vecer
polozim asi hlupu otazku pre vacsinu,ale riesim to cely den a som z toho uz totalne dopleteny (asi to poznate,ked hladate nejaku chybu a dlho nad tym rozmyslate tak sa vam uz vsetko mily)
snazim sa spravit kameru ktoru by neoplyvnoval gimbal look,teda pomocou quaternionou,a potrebujem "trochu" pomoct
snazil som sa sformulovat dlhy prispevok,ale som uz taky dopleteny , ze uz nad tym neviem ani rozmyslat,pokusim sa ho neskor pridat keby nebolo jasne o co mi ide,ale v skratke,
mam najprv natocit a posunut scenu podla toho kam sa pozera hrac a potom vykreslovat,alebo
najprv posunut a natocit scenu a potom vykreslit,
alebo vykreslit a nakoniec posunut a natocit scenu ?
tym tocenim myslim nasobenie opengl matice maticou z quaternionu
ja viem,asi to znie hlupo
PS: este taka drobnost,ked nenasobim maticu maticou z quaternionu,ale pouzijem len glRotatef okolo Y osi (teda dolava a doprava), tak ked dam posun a potom rotaciu vzdy hned za glLoadIdentity tak mi to funguje spravne,ale ked uz tu rotaciu nahradim rotaciou pomocou quaternionou tak mi to nefunguje (ze by som mal zle vypocty alebo to robim uplne zle ? ) _________________ The Death is only beginning ! |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 6. leden 2009, 22:02:46 Předmět: |
|
|
Po Internetu už nějakou dobu koluje mýtus, že quaterniony vyřeší gimbal lock. Nevyřeší, ty na to ani nemají vliv. Quaterniony jsou dobré akorát v tom, že:
1) neobsahují scale, takže numerické nepřesnosti po jedné hodině výpočtu ti nezvětší objekt (to se u matic stává)
2) umí elegantním způsobem interpolovat mezi dvěma libovolnýma rotacema
Gimbal lock si děláš sám tím, jak ty rotace skládáš. Když ho nechceš, musíš na to úplně jinak. Především se vykašli na výpočet celé matice každý snímek (tzn. nevolat glLoadIdentity). Klíč je v tom, že si vždycky vezmeš matici kamery z minulého snímku a přinásobíš k tomu jen to, co se právě změnilo. A gimbal lock je pryč. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
pcmaster
Založen: 28. 07. 2007 Příspěvky: 1824
|
Zaslal: 6. leden 2009, 23:20:04 Předmět: |
|
|
S tymi kvaternionami... Vsade na nete (aj na ultra-doveryhodnom-zdroji-vykypedyja) sa povaluje kopec kecov o tom, ze kvaterniony 'odstranuju' gimbal lock. Dokonca aj ja som to napisal do svojej bakalarky. Ono je to tak, ze ked nasobis navzajom dva kvaterniony, cize skladas dve rotacie, mozes to robit ako chces a nikdy nijaky gimbal lock nedostanes, ze Ten nedostanes ale ani ked budes nasobit 2 rotacne matice...
Gimbal lock je problem hlavne u eulerovych uhlov a potom ho este mozes dostat, ked budu samotne rotacie (ci uz matica alebo kvaternion) 'napicu'. Co uz je ale tvoja chyba a nie chyba tvojej reprezentacie. Ale to chcel povedat asi aj Eosie a inak ma, zase, pravdu.
(inak sorry, ale zase sa mi podarilo napisat niekolko riadkov a nepovedat v podstate ani hovno ) _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
Návrat nahoru |
|
|
Buksy
Založen: 03. 01. 2009 Příspěvky: 19 Bydliště: KE
|
Zaslal: 6. leden 2009, 23:36:43 Předmět: |
|
|
pcmaster - neva,snaha sa ceni ,ci mam nasobit dve matice,alebo dve kvaterniony,je mne ako studentovy strednej skoly na ktorej som zatial nepreberal ani jedno uplne fuk ... asi skor quaterniony (momentalne je to pre mna vyzva,a ja sa nerad vzdavam )
eosie - noo,keby som nemohol pouzivat glLoadIdentity,tak by sa mi celkovo vykreslovanie dost ztazilo,lebo ja tuto funkciu volam viackrat pocas vykreslovania _________________ The Death is only beginning ! |
|
Návrat nahoru |
|
|
pcmaster
Založen: 28. 07. 2007 Příspěvky: 1824
|
Zaslal: 6. leden 2009, 23:43:06 Předmět: |
|
|
Kludne volaj glLoadIdentity... To nie je problem. Eosie to asi myslel tak, aby si vzdy spocital 'diferencnu' (rozdielovu) maticu a tu prinasobil (glMultMatrix) k starej (ktoru si zapamatas) za staleho pouzitia glPush/PopMatrix - to ale budes pouzivat aj tak.
Este by nam mohol vysvetlit prakticky uzitok proti tomu, ked si vzdy spocitas celu aktualnu maticu _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 7. leden 2009, 01:21:20 Předmět: |
|
|
pcmaster to dobře vystihl (i to s tím, že je reprezentace nebo spíš postup konstrukce matice napiču). Ono totiž násobení čistě rotačních matic je ekvivalentní násobení příšlušných quaternionů. (tzn. to přebírá všechny dobré i špatné vlastnosti) Výpočet rozdílové matice je klíč (ale rozhodně to nedělat rozdílem matic, neboli maticí přechodu či pomocí jiných metod).
Např.:
- když se kurzor nepohne, nic nedělám
- když se kurzor pohne, uložím si vektor, o který se posunul právě tento snímek, a z tohoto vektoru spočítám rotační matici, kterou přínásobím k původní
Problém nastane právě s tou stabilitou, protože se ti po deseti minutách může stát, že objekt je o něco větší nebo menší (nesprávný scale). A tady se ty quaterniony právě hodí, jejich velikost nemá žádný vliv na výslednou rotaci (a zároveň neobsahují ten scale). _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
Buksy
Založen: 03. 01. 2009 Příspěvky: 19 Bydliště: KE
|
Zaslal: 7. leden 2009, 01:53:32 Předmět: |
|
|
hm,pripada mi to zlozite, je taka metoda rychlejsia ako "klasicka" s glLoadIdentity() ?
hm,skusim opisat ako to ja chapem a opravte ma ked nieco napisem zle , ten gimbal lock vlastne sposobuje to ze zavolam viacnasobne po sebe glRotatef(), teda sa mi presunu osi,napr
glRotatef(90.0, 0.0, 1.0, 0.0);
takze teraz sa vlastne Z a X osi prehodili?
no a ked za zavolam glRotatef,ale teraz na x-ovej osi
glRotatef(90.0, 1.0, 0.0, 0.0);
tak vlastne namiesto toho aby som sa otocil okolo x-ovej osi tak sa tocim okolo osi Z lebo sa prehodili,jo ?
takze namiesto toho pouzijem quaternion,ktory si vytvorim z tych rotacii a nakoniec vyslednym quaternionom vynasobim maticu
nedalo by sa to riesit tak,ze by som si spravil triedu,ktora by si pametala rotacie,a automaticky by mi menila osi? teda ak som sa prvy krat tocil okolo osi Y (cize Z a X sa mi prehodili), tak ak sa teraz tocim okolo X, tak by mi ju automaticky prehodilo na Z os ?
PS:nasiel som aj gimbal lock obrazok ale z nie je nejak jasne ktora os sa kam posunie,skor to vyzera ako keby sa Z os presunula na X-ovu a pritom X-ova sa nepohla, ten obrazok mi pripada nejaky vadny, ked ho tak sledujem pripada mi to ako keby sa ta os okolo ktorej sa ta kocka toci menila pocas pohybu _________________ The Death is only beginning ! |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 7. leden 2009, 02:27:48 Předmět: |
|
|
Pro začátek zapomeň na quaterniony. Pokud ti to není jasné s maticema, nebude to jasné ani s ničím jiným.
Moje rada zní:
Nauč se lineární algebru.
Pochybuju, že bys pochopil vysokoškolská skripta (ani já bych to nedal v tvém věku), přesto si myslím, že se to dá zvládnout s nějakou povrchní znalostí analytické geometrie. Budeš muset pohledat nějaký tutoriály, kde je to vysvětleno tak nějak intuitivně. Začni s nehe.ceske-hry.cz, jsou tam nějaký články na matice a možná i něco navíc. Tvým cílem by měla být implementace vlastních funkcí na vektory a matice. Tak lépe pochopíš, co se tam děje. Potom tím úplně nahraď všechny funkce v OpenGL týkající se matic, tzn. funkce jako glLoadIdentity, glTranslatef, glRotatef, gluPerspective atd. nebudeš používat. Použiješ pouze glLoadMatrixf a do ní dáš to, co sis bokem spočítal sám. Případně ještě můžeš použít glMultMatrixf na přinásobení.
Co je to "klasická metoda s glLoadIdentity"? Ta funkce jenom nastaví aktuálně vybranou matici (modelview nebo projection) na identitu vzhledem k násobení matic. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
Buksy
Založen: 03. 01. 2009 Příspěvky: 19 Bydliště: KE
|
Zaslal: 7. leden 2009, 02:44:23 Předmět: |
|
|
to bolo naschval v uvodzovkach, ked si zoberes napr taku nehe 10 (pohyb po scene) tak tam tiez najprv vzdy zavola glLoadIdentity() a potom zrotuje podla x a y a presunie (glTranslatef()) .. to som mal na mysli
noa este taky maly problem,ono teraz ma to dost stve ze mi to nefunguje ,a ja chcem aby to fungovalo , takze potrebujem jednoznacnu odpoved pokial sa to tak neda,inak mam asi chybu vo vypoctoch (co akurat skumam )
PS: ja viem,som nevdacny
PS2: sorry za tych 1 000 000 smajlov,ale som zvyknuty trepat ich na zaciatok a koniec kazdej vety _________________ The Death is only beginning ! |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 7. leden 2009, 03:19:05 Předmět: |
|
|
Buksy> Myslím, že jsem ti poradil dostatečně a pomocí této diskuze bys měl být schopen svůj problém hladce vyřešit. Pokud nerozumíš mému výkladu, pak se obávám, že ti nemám jak pomoci.
pcmaster napsal: |
kvaterniony 'odstranuju' gimbal lock. Dokonca aj ja som to napisal do svojej bakalarky. |
Záleží, jaks to tam formuloval, nemusí to být nutně špatně. Pokud jsi napsal něco jako tohle, mělo by to být v pořádku: Rotace vyjádřená v Eulerových úhlech (pomocí příslušných matic) trpí ztrátou jednoho stupně volnosti (= gimbal lock), zatímco rotace vyjádřená pomocí rotační osy + úhlu (ekvivalentně quaternionu) tím netrpí. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
Khaj
Založen: 16. 01. 2008 Příspěvky: 49
|
Zaslal: 7. leden 2009, 09:39:11 Předmět: |
|
|
Zdravím, zde se poprvé dozvídám o problému matic, což mě docela zarazilo.
Nestačilo by prostě čas od času normalizovat všechny tři vektory (sloupce matice)? Tím by se vyřešil scale problém .... gimbal lock, pokud to chápu dobře, znamená, že se vektory stanou k sobě ne-kolmé ... takže je občas znovu vektorově pronásobit (v matici, kde je chceme skutečně kolmé)?
Anebo je nejlepší jít cestou samostatného ukládání pozice,rotace,scale (+rotace každého vektoru pokud nechci ztratit funkcionalitu) a pak z nich vždy znovu sestrojit matici?
Jak se tenhle problém řeší normálně, bez quaternionů (nemají možnost nepravoúhlé soustavy a scalu, nemam je rád)? |
|
Návrat nahoru |
|
|
pcmaster
Založen: 28. 07. 2007 Příspěvky: 1824
|
Zaslal: 7. leden 2009, 09:42:06 Předmět: |
|
|
Eo: Citoval som tam tento clanok, casti 3.4.1 a 3.5.1 a este zopar dalsich paperov.
Khaj: Ano, myslim, ze obcas (kazdy frame? ) zortogonalizovat ci znormalizovat tu rotacnu submaticu by malo teoreticky stacit, aby si sa vyhol numerickej nepresnosti a explozii. Mozno aj gimbal locku, ale nechce sa mi nad tym rozmyslat, prave som prisiel z odberu krvi, BLEEEE _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
Návrat nahoru |
|
|
Buksy
Založen: 03. 01. 2009 Příspěvky: 19 Bydliště: KE
|
Zaslal: 7. leden 2009, 12:11:54 Předmět: |
|
|
eosie - jj napisal si toho dost dakujem , akurat ze je to dlhsia cesta,mne sa zda ze kedysi mi to fungovalo aj tak ako to teraz robim,len mi to pripada ako keby som niekde mal nejaku chybu,chvilku sa s tym este pohram a ked na nic nepridem tak to spravim tak ako si mi radil _________________ The Death is only beginning ! |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 7. leden 2009, 14:48:05 Předmět: |
|
|
Khaj napsal: |
gimbal lock, pokud to chápu dobře, znamená, že se vektory stanou k sobě ne-kolmé ... takže je občas znovu vektorově pronásobit (v matici, kde je chceme skutečně kolmé)? |
Ne, gimbal lock je něco jinýho. To, co popisuješ, je ortogonalizace, což se dělá buď jak říkáš pronásobením vektorů pomocí vektorového součinu nebo pomocí Gram-Schmidtovy ortogonalizace (a jsou i jiné metody).
Gimbal lock je, když 2 osy splynou v jednu, tzn. rotace kolem jedné osy (např. X) je ekvivalentní rotaci podle druhé osy (např. Z), pak ztratíš stupeň volnosti. Př.: Mějme Eulerovy úhly (alpha, beta, gamma), kde beta = 90 stupňů. Potom pro libovolné úhly alpha,gamma platí, že otočení objektu (alpha, 90, gamma) = (alpha-gamma, 90, 0) = (0, 90, gamma-alpha), takže rotaci stačí popsat jen dvěma čísly (alpha-gamma, 90). Dokázat se to dá rozepsáním součinu třech matic rotací podle os X, Y a Z, dosazením beta = PI/2 a po úpravě to z toho vypadne.
Khaj napsal: |
Anebo je nejlepší jít cestou samostatného ukládání pozice,rotace,scale (+rotace každého vektoru pokud nechci ztratit funkcionalitu) a pak z nich vždy znovu sestrojit matici? |
Tohle s tím nemá mnoho společného. Ukládat si zvlášť pozici, rotaci, scale a zkosení a pak z toho všeho spočítat výslednou matici je docela populární přístup a v 3D grafice v ničem neomezuje. Dokonce bych i řekl, že je efektivnější (např. inverze, skládání transformací, volitelná změna libovolného z parametrů).
Khaj napsal: |
Jak se tenhle problém řeší normálně, bez quaternionů (nemají možnost nepravoúhlé soustavy a scalu, nemam je rád)? |
Viz výše. To, že něco neobsahují, ještě neznamená, že si to nemůžeš uložit bokem. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
|