.[ ČeskéHry.cz ].
Chybná transformace frusta

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Obecné
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ň

PříspěvekZaslal: 14. listopad 2011, 16:31:58    Předmět: Chybná transformace frusta Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
]semo[



Založen: 29. 07. 2007
Příspěvky: 1526
Bydliště: Telč

PříspěvekZaslal: 14. listopad 2011, 19:42:42    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Poky



Založen: 29. 06. 2009
Příspěvky: 184
Bydliště: Písek / Plzeň

PříspěvekZaslal: 14. listopad 2011, 20:57:08    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
igor



Založen: 28. 07. 2007
Příspěvky: 196

PříspěvekZaslal: 14. listopad 2011, 21:47:58    Předmět: Odpovědět s citátem

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 Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Poky



Založen: 29. 06. 2009
Příspěvky: 184
Bydliště: Písek / Plzeň

PříspěvekZaslal: 14. listopad 2011, 22:40:33    Předmět: Odpovědět s citátem

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 Sad 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ě Evil or Very Mad
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
]semo[



Založen: 29. 07. 2007
Příspěvky: 1526
Bydliště: Telč

PříspěvekZaslal: 15. listopad 2011, 10:29:46    Předmět: Odpovědět s citátem

Dám se podat ;-)
_________________
Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Poky



Založen: 29. 06. 2009
Příspěvky: 184
Bydliště: Písek / Plzeň

PříspěvekZaslal: 15. listopad 2011, 15:41:01    Předmět: Odpovědět s citátem

]semo[ napsal:
Dám se podat Wink


To já taky Very Happy Very Happy Very Happy, ale od koho Rolling Eyes ??
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Poky



Založen: 29. 06. 2009
Příspěvky: 184
Bydliště: Písek / Plzeň

PříspěvekZaslal: 15. listopad 2011, 17:44:37    Předmět: Odpovědět s citátem

Haleluja Very Happy, 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
Zobrazit informace o autorovi Odeslat soukromou zprávu
]semo[



Založen: 29. 07. 2007
Příspěvky: 1526
Bydliště: Telč

PříspěvekZaslal: 16. listopad 2011, 09:54:39    Předmět: Odpovědět s citátem

igor (+1) :-D
_________________
Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
pcmaster



Založen: 28. 07. 2007
Příspěvky: 1827

PříspěvekZaslal: 16. listopad 2011, 09:57:52    Předmět: Odpovědět s citátem

kód:
igor(+1);

igor je nejaky novy datovy typ, na ktory sa da pretypovat z kladnych celych cisel? Very Happy
_________________
Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
]semo[



Založen: 29. 07. 2007
Příspěvky: 1526
Bydliště: Telč

PříspěvekZaslal: 16. listopad 2011, 10:02:16    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Obecné Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna