Mapování textury na čtyřúhelník (2 trojúhelníky)

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod pucmeloudek 19. 3. 2014 11:47

linearni je linearni, proste y = ax + by po cely plose daneho utvaru, s patricnyma a, b podle velikosti a zkoseni toho utvaru.

ad "nikoliv": tak jak teda? tak, jak navrhuju? maji ty pixely ktery spadaj do "obdelnikove obalky" toho lichobezniku mizet? jestli jo, tak mas preci po problemu, ne? jestli ne, tak nevim, jak jinak...
pucmeloudek
Junior

Odeslat příspěvekod Elfman 19. 3. 2014 11:51

Ad lineární/nelineární:

já umím zatím mapovat jen pomocí dvou metod:

To horní je textura:

Textura.jpg
Textura.jpg (31.4 ) Zobrazeno 1792 krát


a) textura se rotáhne podle tvaru polygonu (prostřední) - prostě, mám texturu čtverec a chci zní mít třeba obecný 4 úhelník

b) textura se roztáhne pouze podle horní vodorovné a levé svislé hrany, ale jinak je na tvaru polygonu nezávislá (takto to možná dělají starší hry) a co je mimo polygon, to se prostě ořízne, např. chci složit složité dveře z polygonů, které nejsou čtvercové (když to takto zjednoduším).

V obou případech dovedu spočítat UV na vrcholech čtverce, ale oba příklady selžou při kreslení jako trojúhelníky, pokud použiji lineární interpolaci.

Já se o deformaci nesnažím, je tam jaksi sama ;)

Ale uvidím, až doma konečně dopíšu tu korekci. Třeba to bude fungovat a téma bude vyřešeno.

-- 19. 3. 2014 12:01 --

Tomu lineárnímu y=ax+by by tedy odpovídala ta druhá mapovací metoda. Zkosení je samozřejmě pak dané hranami u vrcholu A (možno změnit rotací textury, že se přesune na jiný bod).

Ad mizení pixelů: samozřejmě, u kratší strany budou buď pixely oříznuty, a nebo v prvním případě některé vynechány (ale řádka si přibližně zachování původní podobu - chová se to jako klasické zmenšení naklopené zdi v prostoru), to ale není problém, který potřebuji vyřešit :(
Elfman
Junior

Odeslat příspěvekod pucmeloudek 19. 3. 2014 12:09

slava.
a) je prave ono "borceni" o kterym mluvim, ve kterym te podporovat nebudu, anzto jsem to nikdy nedelal a nechci delat, protoze to neni jednoznacny - tam si muzes tech zpusobu mapovani pixelu vymyslet milion.

b) preci nemuze selhat, to tam delas neco spatne. pokud si udelas opsanej obdelnik, namapujes celou texturu na nej a ten kus, kterej je v tom opsanym navic, jednoduse nekreslis, tak to musi jit.
pucmeloudek
Junior

Odeslat příspěvekod Elfman 19. 3. 2014 12:39

ad b) může..

pokud vezmu 4 úhelníkový polygon a naflákám do něj čtvercovou texturou, to skutečně nemůže selhat, jak píšete..
DlazdicoveMapovani.jpg
DlazdicoveMapovani.jpg (13.17 ) Zobrazeno 1757 krát


Jenže to proto, protože interpolujeme mezi 4 vrcholy a 4 body textury. Doteď vše OK.

A teď ten polygon rozdělíme na 2 trojúhelníky, a budeme mapovat 3 body textury mezi 3 vrcholy polygonu. Na okrajích to bude v pořádku, ale na nově vzniklé hraně to udělá přesně to samé, co je v prvním příspěvku ;) A to se právě snažím vyřešit..
Elfman
Junior

Odeslat příspěvekod pucmeloudek 19. 3. 2014 13:12

nebude, kdyz ten posledni vrchol textury bude namapovanej mimo ten trojuhelnik, na misto, ktery z toho utvaru udela rovnobeznik.

-- 19. 3. 2014 13:19 --

proste pred delenim na trojuhelniky ten utvar doplnis na rovnobeznik (nejak, to uz je na tobe, jak)
pucmeloudek
Junior

Odeslat příspěvekod Elfman 19. 3. 2014 13:46

Tedy, má úcta :) A děkuji.

Jsem si to musel nakreslit (jsem tomu nevěřil). Skutečně, u lineárního mapování se to chová tak jak popisujete.. takže si s tím lineární interpolace hravě poradí.

LinearniMapovani.jpg


Alespoň teda jedna věc je z krku. Vypočítat správné UV do vrcholu už zvládnu :)

-- 19. 3. 2014 13:50 --

Pravda totiž je, že jak přepisuji algoritmy, tak jsem se k lineárnímu mapování na trojúhelníky ještě nedostal (zůstal jsem viset u nelineárního), tak jsem to nemohl zatím vyzkoušet v praxi. :(
Elfman
Junior

Odeslat příspěvekod geal 19. 3. 2014 14:00

pucmeloudek píše:ja furt nechapu, v jake prakticke situaci poterbujes mapovat pravouhlou texturu na nepravouhly tvar...

Na tvar nepravoúhlý v model space, nebo nepravoúhlý ve screen space? V tom prvním případě při troše snahy nikdy, ale v tom druhém skoro neustále, že?
geal
Junior

Odeslat příspěvekod pucmeloudek 19. 3. 2014 14:11

@geal: samozrejme, ze model space. btw. uz jsme mezitim dospeli k tomu, ze misto pravouhleho staci rovnobeznik :)
pucmeloudek
Junior

Odeslat příspěvekod Elfman 19. 3. 2014 14:18

Je pravda, že lineární mapování lze s úspěchem použít v 95% případů, kdy chci něco namapovat na polygon (například texturu zdi), a nelineární mapování je možná ten zbytek, kdy ho chci například použít jako mapu přestavění u obrázku (udělám si mřížku, a z původně čtverců udělám nepravidelné 4 úhelníky) nebo když budu natahovat zvýkačku :) a nechci o těch pár pixelů v rohu po zmenšení přijít :) Časem na to určitě přijdu, beztak to již někdo vyřešil..
Elfman
Junior

Odeslat příspěvekod geal 19. 3. 2014 14:33

Je pravda, že lineární mapování lze s úspěchem použít v 95% případů, kdy chci něco namapovat na polygon (například texturu zdi)

Určitě ně při rasterizaci (ve screen space). Ono třeba perspektivní promítání nejenže není lineární, ono dokonce není ani afinní (což je slabší omezení). Mám svoje pochybnosti o tom, co že ten linkovaný obrázek LinearniMapovani.jpg má znamenat, ale každé afinní zobrazení promítá rovnoběžky jako rovnoběžky, a tudíž i každé lineární zobrazení je tak musí promítat, ale ten obrázek na to tak prostě nevypadá.

Mimochodem, něco o promítání textur na čtyřúhelníky je tady: http://webcache.googleusercontent.com/search?q=cache:MmxG7-AX0-AJ:www.reedbeta.com/blog/2012/05/26/quadrilateral-interpolation-part-1/+&cd=2&hl=en&ct=clnk&gl=cz&client=firefox-a, včetně hezkého vysvětlení, proč to nefunguje s trojúhelníkovou UV projekcí (nespojitost derivací na diagonále).
geal
Junior

Odeslat příspěvekod pucmeloudek 19. 3. 2014 14:53

btw. perspektiva samozrejme neni linearni, celou dobu se samozrejme mluvi o linearite mapovani textury na objekt jeste v 3d. pak uz to promitnout perspektivne na obrazovku je brnkacka - renderuju po radkach a ta cara, ze ktery vybiram pixely textury, se proste s kazdou renderovanou radkou posouva o vetsi a vetsi kus po texture (resp. mensi a mensi, kdybych renderoval smerem k pozorovateli) a vybiram pixely dal a dal od sebe (resp. bliz a bliz)
pucmeloudek
Junior

Odeslat příspěvekod Elfman 19. 3. 2014 15:24

geal: ano, podle této stránky se budu pokoušet "srovnat" tu svou nelineární interpolaci. Takže pokud to zabere, tak lineární mapování bude vlastně klasická linerání interpolace doplněná o perspektivní korekci, a nelineární bude muset přidat ještě korekci tvaru polygonu (teoreticky by ale jen stačilo sloučit výpočet Q a 1/Z a samotná interpolace by se už nemusela měnit, ale to předbíhám).
Elfman
Junior

Odeslat příspěvekod Elfman 20. 3. 2014 07:37

Takže děkuji všem, zdá se, že to funguje. Postupně přepíšu ještě lineární mapování. Kdyby byl ještě nějaký problém, tak se zeptám ;) (řádově do 1-2 týdne).

Ještě menší poznámka pro začínající programátory nebo lidi, co k tomu sednou večer a dostanou okno: Pokud autor textu předpokládá, že umíte spočítat průsečík úhlopříček, tak nejde o nic jiného, než že nejprve u každé přímky (známe 2+2 body) vyřešíte soustavu lineárních rovnic, abyste dostali A a B, a pak řešíte soustavu dvou rovnic o dvou neznámých Y=AX+B abyste dostali XY (průsečík). Je to "blbost", ale jak je člověk mimo (a nemá po ruce internet), tak mu chvíli zabere, než prolistuje staré sešity ze školy :)
Elfman
Junior

Předchozí stránka

Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků