Ahoj ! Bohužel mi nefunguje backface culling. Nemůžu přijít na to, kde mam chybu.
Jediné co mi přijde divné je to, když si necham vypsat invertovanou transformační
matici, tak bod, který má sloužit k zjištění zda je daný face před nebo za ním,
leží mimo teleso a je dokonce za kamerou. Používám DJGPP a pro kreslení poligonů
používám allegro. Nemohl by jste ten backface culling trošku více rozepsat? Nebo mi
napsat v čem by mohla být chyba ?
|
No, konečně někdo kdo rozchodil allegro. To s tou matici je úplně spravně. Je to matice
kamery krát objektu, takže bod by ani neměl ležet v objektu, je to pozice kamery,
ale v objectspace. Pokud je objekt prave inicializovaný, matice jsou :
Jinak nemůžu nic moc dělat když nevím co to vlastně dělá.. |
Tak už jsem přišel na to, kde byla chyba. Měl jsem zadané body rovin ve špatném pořadí.
Je na to nějaké pravidlo? Nebo pokaždé když si vytvořim těleso musím ozkoušet v jakém
pořadí mam zadat body do rovin? Nepoužívám na vytváření těles program, který by to
udělal za mě. Proto jestli je na to nějaké pravidlo, nemohl by jste ho přidat do vašich
stránek ?
|
Předně - všichni mi TYJKEJTE ! Je mi 17 a je mi nepříjemný když mi nekdo vyká. Pravidlo
jako takové na to není. Ale můžeš si pomoct jednoduchou fintou : pokud jsi zkoumal
výpočet normály, tak jsi musel přijít na to že to je vektorový součin dvou vektorů a tam
je pravidlo pro ten vzorec, že vektory vytvoří pravotočivou (nebo někdy levo v druhé
verzi vzorce) soustavu. Krychli upravíš jednoduše - prostě vezmeš každej face a spočítáš
rovinu a určíš, kde leží zbytek krychle (stačí vertexy) - pokud leží za (a na ní), je to
OK, ale pokud leží před tak musíš prohodit dva vertexy a přepočítat normálu. To bude
fungovat u všech konvexních věcí, ale když zacneš mít objekty kde část vertexů leží
před a část za, tak to nebude fungovat (ale takové objekty se většinou vytvářeji z
několika objektů konvexních, takže už se při modelování nemusí kontrolovat a přehazovat
vrcholy) Jak sis asi všiml ve wellcome, chystá se zdroják pro nahrávání spousty různých
formátů.
|
Naprogramoval jsem Backface culling a problém je s rovinnými objekty. Když třeba pustím
to tvoje letadlo s palmou tak mu nejsou vidět křídla ani zem není vidět. Nejdřív mi to dělalo
problémy, že jsem to blbě napsal ale pak jsem přišel na to, že když objekty otočím tak se tam
křídla "objeví". Prostě, když otáčím letadlem, tak tam ty křídla nejsou a potom zase jo a při
další otočce zase zmizí. Chtěl bych proto přidat ještě něco, abych poznal takové rovinné útvary
(facy v jedné rovině) a přiradil bych jim do jejich proměnné, kterou bych vyjádřil třeba jako
BOOL a nazval ji alwaysvisible nebo nějak jinak česky a pokud by tato hodnota u facu byla
pravdivá, tak by tyto facy neprocházely Backface cullingem a byly by prostě vždy vidět. Mám
ale problémy třeba se zahnutou rovinou (plane) která by měla mít také tyto požadované
vlastnosti. Jedná se prostě o 2d objekty (i zahnuté), které ale nejsou uzavřené.
|
S rovinnými objekty ... existuje tzv. Eulerovo pravidlo pro konvexní objekty - vezme se počet
ploch (= počet faců), počet vrcholů (pozor ! různých vrcholů -> musíš porovnávat xyz, protože
některé vertexy se liší jen souřadnicí textury) a počet hran (tzn. zase různých hran, lišících
se pozicemi hraničních bodů) Potom součet hran + vertexů + faců = 2 platí jen pokud je objekt
konvexní (krychle, koule ....) a backface culling se může zapnout ...
Dejme tomu krychli. Ta má dvanáct faců, osm vertexů a osmnáct hran (jsou to facy). To máme : 12 + 8 = 18 + 2 Takže počet faců + počet vertexů = počet hran + 2 Hotovo, krychle bude testovaná backface cullingem ... Oproti tomu rovina. Ta má dva facy, čtyři vertexy a pět hran. 2 + 4 != 5 + 2 Tudíž rovina se bude kreslit oboustranně ! ... jinak ve 3d maxu se to řeší tak, že modelář nastavuje double-sided materiál pro určité textury, takže to jestli backfacem projde nebo neprojde záleží na tom, jakou má na sobě texturu. ... doufám, že to bylo srozumitelné ... |