3deng qa 03

Q :
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 ?

A :
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 :


camera = camera
object = 1 (1-kova matice)
 
m = inv(camera) * 1 = inv(camera)
im = inv(m) = inv(inv(camera)) = camera

Jinak nemůžu nic moc dělat když nevím co to vlastně dělá..



Q :
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 ?

A :
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ů.



Q :
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é.

A :
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é ...


Moc toho ještě nepřišlo, tak pište !

Zpátky


Valid HTML 4.01!
Valid HTML 4.01