Biztosan láttál már, QuickTime VR filmet. Ez a QT-nak egy speciális
formája, ahol panoráma szerűen körbe lehet nézni. Szeretnék egy ilyet
csinálni, de nem találok sehol semmien használható leírást, az algoritmusról.
Az biztos, hogy semmien szuper titkos technológia nem kell hozá. Lehet
találni a neten egy tucat programot, ami hasonlóan működik. Még ilyen pár
kbyte-os (5-10kb) (ingyenes) java programkát is letöltöttem ami megcsinálja
ugyan ezt.
Addig jutottam magamtól, hogy van egy speciális lencsével felvett kép (elég
torz, de rajta van a 380 fokos látómező, egy hosszúkás képen), és ennek az
adott részletét valahogy vissza állítják "valódi" képpé. Valami olyasmi
lehet, hogy felhuzzák egy gömb, vagy egy henger palástjára, és a nézőpont
ezen belül van, mindíg egy darabot mutatva a képből.
Elméletileg valami ilyesmi lehet, de gondolom nem számolnak "igazi" 3D
geometriával, csak egy pontot a képen, megfeleltetnek egy másikkal a
képernyőn.
Legacy/TLD
eppen most tanulgatom a JAVA-t, esetleg elkuldened ezt, vagy megadnad az URL-t?
Valoszinuleg nem konstanssal kellene lepegetni a kepre masolagataskor, hanem
szinusztabla szerint, a szeleken nagyobbakat (vizszintesen es fuggolegesen is)
A leggyorsabb ha generalsz egy init rutinnal, egy transzformacios tablat,
ami akkora, mint amekkor a keped es egy-egy erteke azt mondja-meg, hogy
honan vedd a pixelt a texturabol (persze jobb lenne, ha meg interpolalnal
is - de ezt egyelore hagyjuk!).
Ez a tabla azert jo, mert 1. gyors a keprajzolo rutin, 2. ha korbe akarsz
fordulni, akkor maradhat a tablazat, csak egy offset erteket kell
hozzaadnod, ami odebb mutat a texturan.
A tablazatott tapasztalati uton hangold be! Egy domboru lencset kell
szimulalnod, igazabol csak a domburusagat kell megtalalnod.
Amit leirtam az mind csak a sajat fantazmagoriam, de ki tudja, lehet,
hogy megis kozelebb visz a megoldashoz...
udv, TomCat/Abaddon
Sajna "eldobtam" a címeket, de egy-két jobbat tudok adni.
Van egy hasonló profi dolog mint a Quick Time, IPIX-nek hívják, címe:
http://www.ipix.com/
A JAVA-k között elég sok gyenge dolog volt, egyet azért megtartottam, ami
ahoz képest, hogy csak 5-6kbyte-os kis applet egész törhető volt. (igaz
lassú, és kicsi képe van, de működik) Ennek a címét már nemtudom, de
átküldöm ZIP-ben.
Sajna forrást egyik JAVA-hoz sem adtak, pedig éppen én is most kóstólgatom
a témát, és valószínűleg ki tudtam volna hámozni belőle a lényeget.
Van egy pár demó file-om mind IPIX, mind pedig QuickTime alá, ha segít
valamit, és neked nincs, át tudok küldeni egy párat.
Azt hiszem a képet két 8mm (két, egymásnak ellentétes iránybá néző képet
raknak össze, legalábbis az IPIX szerint) lencsével veszik le, ez segít
valamit?
Erröl a lencse dologról nincs valami forrásod. Úgy láttam, hogy a demókban
ez is vissza köszönő téma (volt).
Végül is nem az a célom, hogy megírjam újra a QT, csak látványban hasonlót
akarok csinálni. Ha nem is pont azt az algoritmust használja, de a látvány
valami hasonló, az nekem tökéletesen megfelel.
Egyébként mindenféle flinc-flanc nélül, csak egy képe megjelenítését
szeretnék megcsinálni, még a héten, így ha eszedbe jut még valami, azt
nagyon-nagyon szívesn fogadom.
Készítettem egy kis progit az alapján amit mondtál. Csak elméleti, még nem
próbáltam ki, csak kiváncsi voltam, hogy jó úton haladok-e. (ha nagyon
gyenge, nem kell kiröhögni:)
Úgy csináltam, hogy van egy két dimenziós tömböm, ami meg egyezik a
kimeneti kép (jelen esetben 320x240) méretével. Egyenlőra az egyszerűség
kedvéért, külön tárolja a kép X-Z koordinátáinka az eltolását. (persze
később ez egy érték lessz, csak most így egyszerűbnek tünt) Tehát a mostani
állás szerint, pl. a kép X:0 Y:0 pontjára, a panorámakép edott pontjától
X:-30 Y:-30 -ra lévő pontot teszi ki.
Annyit csináltam még optimizáció kedvéért, hogy mivel szimetrikus, ezért
csak a negyed képernyőre számoltam ki a cuccot, és tükröztem.
#define XRES 320
#define YRES 240
#define HALFXR (XRES/2)
#define HALFYR (YRES/2)
#define MAX_SIN 1.0
#define FOCUS 30
#define ROUND(x) ((int)((x)+0.5))
struct
{
int x;
int y;
}table[XRES][YRES];
void calc_table(void)
{
int x,y;
int sx,sy;
float sinX,sinY;
float deltaX = MAX_SIN/HELFXR;
float deltaY = MAX_SIN/HELFYR;
sinY = MAX_SIN;
for (y=0;y<HELFYR;y++,sinY=-=deltaY)
{
sinX = MAX_SIN;
for (x=0;x<HELFXR;x++,sinX-=deltaX)
{
sx = ROUND(FOCUS * sin(sinX));
sy = ROUND(FOCUS * sin(sinY));
table[x][y].x = -sx;
table[x][y].y = -sy;
table[RESX-x][y].x = sx;
table[RESX-x][y].y = -sy;
table[x][RESY-y].x = -sx;
table[x][RESY-y].y = sy;
table[RESX-x][RESY-y].x = sx;
table[RESX-x][RESY-y].y = sy;
}
}
}
Szerinted jó úton indultam el?
Legacy/TLD
Eloszoris szeretnem osszegyujteni a kiadott forrasaid (ByTeam).
Ugy tudom van egy zsak ilyened es ugy remlik, hogy regebben is
el akartam kerni, csak nem tom mi lett...
elvileg az ftp://eotvos.battanet.hu/pub/byteam/ cimen fenn van
(majd') az osszes kiadott cucc (eltekintve a legujabbaktol, amiket
meg lusta voltam feluploadolni, meg nem igazan ment az upload
funkcio - de mivel ujabban nem csinaltam olyat aminek olyan
nagyon erdemes lett volna kidobni a forrasat, nem is dobtam ki
forrast, ezert ez nem gond :)
(a regiek forrasa se olyan hudejo, dehat kiadtuk.. legalabb nem vesznek
el :)
Kulonoskeppen erdekelne a Wego2, mert vki a panorama effektrol
erdeklodott es ebben mintha lenne ilyen.
ja, a bubbles?
azt en vmi nagy tablazattal oldottam meg.. :)
blala/elvont meg byteam is
Sikerült kitalálnom mi a neve ennek a kérdezett dolognak: "panoramic
projection", így már, hogy tudom, hogyan kell ekresni találtam a neten egy
pár infót róla.
http://www.mhri.edu.au/~pdb/projection/lensdistortion/
http://www.threedee.com/mhedron/html/manual/panorama.htm
Azért köszönöm a te segítségedet is, nem jártál túl messze a megoldástól
kösz, Legacy/TLD