| Zobrazit předchozí téma :: Zobrazit následující téma |
| Autor |
Zpráva |
Poky

Založen: 29. 06. 2009 Příspěvky: 184 Bydliště: Písek / Plzeň
|
Zaslal: 14. listopad 2011, 16:31:58 Předmět: Chybná transformace frusta |
|
|
Zdravím, mám opět další dotaz, na který se mi, dokonce ani společně s VODOu, nepodařilo vyřešit (ani si ho neumíme vysvětlit)
Mám octree (pro test viditelnosti meshe) spočítáný v local-spacu, ale není ovlivněn pozicí ani rotací ani scalem. Pro vypočítání vyditelnosti sem si spočítal inverzní matici iPRS pro tento mesh (PS: Ověřeno, že je tato matice skutečně inverzní). Potom takto spočítám clip matici pro výpočet frusta:
| kód: |
glGetFloatv(GL_MODELVIEW_MATRIX, this->modl.m);
glGetFloatv(GL_PROJECTION_MATRIX, this->proj.m);
this->clip = (this->modl * iPRS) * this->proj;
this->plane[FP_RIGHT].set(this->clip.m[3] - this->clip.m[0], this->clip.m[7] - this->clip.m[4], this->clip.m[11] - this->clip.m[8], this->clip.m[15] - this->clip.m[12]);
this->plane[FP_LEFT].set(this->clip.m[3] + this->clip.m[0], this->clip.m[7] + this->clip.m[4], this->clip.m[11] + this->clip.m[8], this->clip.m[15] + this->clip.m[12]);
this->plane[FP_BOTTOM].set(this->clip.m[3] + this->clip.m[1], this->clip.m[7] + this->clip.m[5], this->clip.m[11] + this->clip.m[9], this->clip.m[15] + this->clip.m[13]);
this->plane[FP_TOP].set(this->clip.m[3] - this->clip.m[1], this->clip.m[7] - this->clip.m[5], this->clip.m[11] - this->clip.m[9], this->clip.m[15] - this->clip.m[13]);
this->plane[FP_FAR].set(this->clip.m[3] - this->clip.m[2], this->clip.m[7] - this->clip.m[6], this->clip.m[11] - this->clip.m[10], this->clip.m[15] - this->clip.m[14]);
this->plane[FP_NEAR].set(this->clip.m[3] + this->clip.m[2], this->clip.m[7] + this->clip.m[6], this->clip.m[11] + this->clip.m[10], this->clip.m[15] + this->clip.m[14]);
|
Výpočet frusta i kolize: frustum versus AABB jsou vpořádku (pro iPRS = identitě), ale když nastavím jakoukoli jinou pozici, rotaci nebo scale, výpočet viditelnosti nefunguje - jakoby frustum bylo vypočítáno špatně. A absolutně netušíme čím to je!!! Nesetkal ste se někdo s něčím podobným??? |
|
| Návrat nahoru |
|
 |
]semo[

Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 14. listopad 2011, 19:42:42 Předmět: |
|
|
Asi blbost, určitě si zkoušel...ale:
glGetFloatv(GL_MODELVIEW_MATRIX, this->modl.m); Určitě vrátí View matici kamery? (Voláš ve správný čas?). Neni ta matice už vynásobená matící toho modelu?
Tipy pro debug: asi bych zkusil nastavit pozici jen o strašně malej kousek jinou, než nulovou a díval bych se, co to dělá. Třeba Tě něco napadne. Pak bych asi taky zkusil "this->modl * iPRS" přehodit :-). Nejsem moc matematik, tak občas takhle přehazuju, když si nejsem jist. No a nakonec....když nic nefunguje, tak vykreslit celej problém přes nějaký debug čáry...a podívat se na něj :-) _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
| Návrat nahoru |
|
 |
Poky

Založen: 29. 06. 2009 Příspěvky: 184 Bydliště: Písek / Plzeň
|
Zaslal: 14. listopad 2011, 20:57:08 Předmět: |
|
|
Díky, ale kromě vykreslení frusta jsem zkoušel vše.
A glGetFloatv(GL_MODELVIEW_MATRIX, this->modl.m); se updatne hned po nastavení kamery přes glLookAt(blabla); , takže tam by měla být jen transformace kamery |
|
| Návrat nahoru |
|
 |
igor

Založen: 28. 07. 2007 Příspěvky: 196
|
Zaslal: 14. listopad 2011, 21:47:58 Předmět: |
|
|
No a má tam vystupovat inverze matice pro mesh? Nemá tam být v neinvertované podobě (takže asi jakoby PRS místo iPRS)? Možná je to blbost kolosálních rozměrů, nějak podrobně jsem to nestudoval abych se přiznal  |
|
| Návrat nahoru |
|
 |
Poky

Založen: 29. 06. 2009 Příspěvky: 184 Bydliště: Písek / Plzeň
|
Zaslal: 14. listopad 2011, 22:40:33 Předmět: |
|
|
Logicky by neměla, protože PRS transofrmací posunu objekt tam kde se má vykreslit, ovšem jeho octree pořád leží v pozici 0,0,0, takže já frustum musím transformovat inverzní maticí, abych docílil toho, že bude správně vůči tomu octree... jenomže to mi nějak vůbec nefunguje přitom sme to s Vodou procházeli několikrát, všechny možný testy sme prováděli a mělo by to být správně  |
|
| Návrat nahoru |
|
 |
]semo[

Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 15. listopad 2011, 10:29:46 Předmět: |
|
|
Dám se podat ;-) _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
| Návrat nahoru |
|
 |
Poky

Založen: 29. 06. 2009 Příspěvky: 184 Bydliště: Písek / Plzeň
|
Zaslal: 15. listopad 2011, 15:41:01 Předmět: |
|
|
| ]semo[ napsal: |
Dám se podat  |
To já taky , ale od koho ?? |
|
| Návrat nahoru |
|
 |
Poky

Založen: 29. 06. 2009 Příspěvky: 184 Bydliště: Písek / Plzeň
|
Zaslal: 15. listopad 2011, 17:44:37 Předmět: |
|
|
Haleluja , přišli sme na to!
Neuvědomili jsme si, že inverzní matice objektu je pro kameru normální matice. Proto kameru musíme transformovat normální maticí modelu a né inverzní.
| kód: |
glGetFloatv(GL_MODELVIEW_MATRIX, this->modl.m);
glGetFloatv(GL_PROJECTION_MATRIX, this->proj.m);
this->clip = (PRS * this->modl) * this->proj; // !!!! PRS matice !!!
this->plane[FP_RIGHT].set(this->clip.m[3] - this->clip.m[0], this->clip.m[7] - this->clip.m[4], this->clip.m[11] - this->clip.m[8], this->clip.m[15] - this->clip.m[12]);
this->plane[FP_LEFT].set(this->clip.m[3] + this->clip.m[0], this->clip.m[7] + this->clip.m[4], this->clip.m[11] + this->clip.m[8], this->clip.m[15] + this->clip.m[12]);
this->plane[FP_BOTTOM].set(this->clip.m[3] + this->clip.m[1], this->clip.m[7] + this->clip.m[5], this->clip.m[11] + this->clip.m[9], this->clip.m[15] + this->clip.m[13]);
this->plane[FP_TOP].set(this->clip.m[3] - this->clip.m[1], this->clip.m[7] - this->clip.m[5], this->clip.m[11] - this->clip.m[9], this->clip.m[15] - this->clip.m[13]);
this->plane[FP_FAR].set(this->clip.m[3] - this->clip.m[2], this->clip.m[7] - this->clip.m[6], this->clip.m[11] - this->clip.m[10], this->clip.m[15] - this->clip.m[14]);
this->plane[FP_NEAR].set(this->clip.m[3] + this->clip.m[2], this->clip.m[7] + this->clip.m[6], this->clip.m[11] + this->clip.m[10], this->clip.m[15] + this->clip.m[14]); |
PRS (normální matice modelu) se musí konstruovat v pořadí:
| kód: |
| Matrix4 PRS = (scale * (rotation * position)); |
|
|
| Návrat nahoru |
|
 |
]semo[

Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 16. listopad 2011, 09:54:39 Předmět: |
|
|
igor (+1) :-D _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
| Návrat nahoru |
|
 |
pcmaster

Založen: 28. 07. 2007 Příspěvky: 1827
|
Zaslal: 16. listopad 2011, 09:57:52 Předmět: |
|
|
igor je nejaky novy datovy typ, na ktory sa da pretypovat z kladnych celych cisel?  _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
| Návrat nahoru |
|
 |
]semo[

Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 16. listopad 2011, 10:02:16 Předmět: |
|
|
O pár příspěvků výš odpovídal igor správné řešení..:) ..jinak igor() je funkce, která bere jako parametr celé kladné číslo (vrací správnou odpověď ;-) ) _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
| Návrat nahoru |
|
 |
|