Yossarian
Založen: 28. 07. 2007 Příspěvky: 274 Bydliště: Šalingrad
|
Zaslal: 20. říjen 2008, 19:06:39 Předmět: 'Sklopeni' bitmapy do lichobezniku se zachovanim perspektivy |
|
|
Zdravim,
potreboval bych poradit s nasledujicim:
Mam bitmapu (obrazek), a chci ji sklopit defakto do lichobezniku, aby vypadala, jako by clovek koukal rovnobezne kolem ni..
Nazorne:
Sedive je dany obrazek (ctverec!), oranzove je zamysleny vysledek (uhlopricky jsou namalovany jen tak pro zjednodusseni), zelene vysrafovana je ubeznice, a modre oznaceny 2d rozmery toho co znam..
potreboval bych vzit bod [x,y] v originalnim ctverci, a ziskat bod [a,b] v lichobezniku, a vice versa.. bez perspektivni korekce (defakto linearne zmenseno) to vypada velice skarede
bile je uhlopricka, cervene je to, kde by mela byt.
Podarilo se mi vymyslet prepocet x->a, ale nijak jsem nevymyslel jakym zpusobem spocitat pomer vzdalenosti b->y.. Poradi nekdo? Diky.[/img] |
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 20. říjen 2008, 20:36:29 Předmět: |
|
|
Bez homogenních souřadnic to asi nepůjde, ty potřebuješ právě pro tu perspektivu, jinak to vždycky bude vypadat divně. Samozřejmě existuje bijekce mezi oběma obrázky, ale v principu tam ztrácíš pixely, protože je jich v tom lichoběžníku méně. Z hlavy ti teď nedám přesnej návod, už je to celkem dávno, co jsem to řešil. Obecně: Mějmě 4 vertexy a k nim koordináty. Obecně jsem si ty koordináty zavedl ve tvaru (x,y,z,w), kde za x,y jsem dal souřadnice v rozsahu <0,1> (no spíš teda 0,0 pro jeden roh, 1,0 pro další atd), do z,w jsem dal 1, potom jsem x,z přenásobil jedním koeficientem a y,w druhým koeficientem (ty si nějak vymysli, pro různý čtyřúhelník budou jiné, ale uděláš tak prakticky projekci na libovolném čtyřúhelníku, i nekonvenčním). Poté si vybereš pixel a uděláš lineární interpolaci mezi koordináty všech 4 vrcholů podle vzdálenosti pixelu od všech vrcholů čtyřúhelníku (na to je takovej škaredej vzorec), tím získáš koordináty pro danej pixel. 2D koordináty na daném pixelu jsou (x/z, y/w) v rozsahu <0,1>. Toť vše, snad jsem na nic nezapomněl. Řešení je určitě víc, tohle je hodně 3DAPI-friendly. DX9 efekt v RenderMonkey prezentující tento algoritmus jsem dal ke stažení tady: http://storm.unas.cz/13_non-linearmapping.rfx
Dalším řešením by bylo udělat prostorou perspektivní projekci, postup je podobný - tentokrát nemáš homogenní souřadnice pro jednotlivé složky koordinátů ale přímo pozice, kde pro každý pixel na konci dělíš lineárně interpolovanou pozici (x,y,z,w) hodnotou w. _________________ AMD Open Source Graphics Driver Developer |
|