Fisheye skevhet för sfärisk spegel fulldome projektion

link: http://paulbourke.net/dome/warpingfisheye/

Skrivet av Paul Bourke
Juli 2012

Följande är ett försök till en teknisk beskrivning av hur fisheye-bilder är skev för användning i en kupol med sfärisk spegel projektion teknik. Det finns för närvarande ett antal paket för att stödja denna skevhet, de har författarna warpplayer, World Wide Teleskop, Programvara Bisque, en patch för Quartz Composer, Mixer, och Unity3D implementationer … och andra.

Innan man inför den skevhet en kort diskussion om hur fisheye och skev fisheye-baserade prognoser är i allmänhet konfigureras i ett planetarium (eller andra kupoler som iDome). Beroende på om datorn innehåller en display (bärbara datorer eller iMac) eller om det är en dator med ett grafikkort och två grafik rör, operatören inte (i allmänhet) använd kupolen för att navigera utan snarare en personlig platt skärm. De två vanligaste driftsformer då är följande:

  • Operatörer bildskärmen och den projicerade skärmen speglas. Det GRAFISKA element får inte vara skeva, det är operatörernas ansvar att hålla uppkomsten av sådana element ur bild av publik visning av kupolen. Utvecklare bör vara att ge tangenttryckning eller stöd för skript för att underlätta detta. En alternativ strategi är att försöka placera GUI-element utanför fisheye cirkel. Eftersom speglingen utförs av OS, det är viktigt att de aktörer som visas är samma upplösning eller högre som projektorn, som är, i de flesta genomförandet av spegling i den slutliga resolutionen på kupolen kommer att vara det lägsta av skärmen och projektorns upplösning.

  • Två skärmar är inte spegelvänd, i detta fall verksamhetsutövaren visa kan vara olika på projicerade bilder. I fall av skevhet detta gör att de aktörer som anser att potentiellt kunna vara en unwarped fisheye. Det GRAFISKA element får inte vara skeva. Observera att det i allmänhet inte är optimal för att fånga fisheye från de aktörer som visa och warp till projektorn visar, detta är eftersom upplösningen av den skeva fisheye kommer att vara begränsad till den vertikala upplösningen av operatörerna display som sällan kommer att vara tillräcklig.

Det är författarna råd att fisheye bör göras till en konsistens av tillräcklig upplösning (se senare) och sedan presenteras/skev på både föraren och projicerade skärmen. Om operatörerna displayen är fisheye och projektorn visas är skev, eller både skev är en fråga för de utvecklare som bygger på att underlätta genomförande och/eller resultat, båda är acceptabla. Observera att data projektorer har förmåga att spegla bilden vertikalt eller horisontellt, vilket det inte behöver vara en angelägenhet för programvaran. Men för att underlätta kompatibilitet med andra program, horisontell spegling till projektorn visas kan vara till hjälp. I alla fall bilden på operatör skärmen får inte vara spegelvänt.

Den Här diskussionen kommer att starta från den position av att ha ett fisheye-bild, tekniker för att skapa ett fisheye med nuvarande realtid grafik-Api: er (t.ex.: OpenGL och DirectX är en separat diskussion. De innebär i allmänhet antingen multipass rendering av cubic ansikten (miljö kartor) som sedan monteras ihop till en fisheye, eller innebär en vertex shader. Några diskussioner om detta finns här för Unity3D och här Blender.

Motivation för detta uppstod från utvecklarna av Stellarium och NightShade, två astronomi visualisering paket som även de har med ojämna stöd för sfärisk spegel, det var genomföras på ett annat sätt. Den föreslagna metoden tar fisheye bild, i allmänhet det skulle vara som levererats till en off-screen textur, denna textur appliceras sedan till ett nät som genomför den önskade skevhet. Det finns några mycket viktiga konsekvenser för detta är:

  • Program inte behöver veta något om optik eller geometri i systemet, är det helt enkelt gäller fisheye som en textur till ett nät där mesh noder och struktur koordinater bestämma den slutliga skeva resultat.

  • Den teknik som är mycket mer generell än bara för användning med en sfärisk spegel. Det kan användas för att förvränga fisheye-bilder och korrigera för icke-linjära förhållanden mellan latitud och radie på fisheye bild, kan man ta itu med några avkortade fisheye-arrangemang (i motsats till att behandla dessa som särskilda fall), det kan även göra konstiga saker som att tänja i andra former som rektangulärt rum (sovrum planetarium).

figure2

Den “magiska” självklart förekommer i detaljer i mesh-filen. Författaren kommer att innehålla några standard mesh-filer som för närvarande är i gemensam användning. Men helst en mesh-filen måste skapas med kunskap om projektorn/mirror/dome geometri samt optik för några av dessa komponenter. I nuvarande version av Stellarium och Nightshade, geometri och optisk specifikation av projection system är inbyggda i koden användaren matar in ett antal parametrar tills bilden ser ut korrekt på kupolen. Författaren hävdar att det bästa sättet att göra detta är att ha en extern applikation som skapar warp mesh-filer (för de fall där provet mesh-filer är otillräckligt), på detta sätt alla applikationer kan dela en skev beskrivning. Det bör noteras att den aktuella parametern är inställd i Stellarium och Nightshade är otillräcklig på två fronter: det finns parametrar som är relevanta för prognosen optik som inte omfattas, och de parametrar som används är något godtyckligt i den meningen att de inte följer standard metoder för att beskriva projektorn optik. Just nu finns det minst tre alternativ för att skapa exakta warp mesh-filer, är baserad på en Mixer, och en är författarnas egen meshmapper som levereras med warpplayer programvara.

Här Nedan finns några “standard” mesh-filer som har använts fram till nu. Notera att med standard warp mesh-filer: den fysiska geometri av projektorn och spegeln behöver justeras, medan den egna mesh-filen kalibrering innebär att en mesh-fil kan skapas som riktar sig till en viss geometrisk/optiska arrangemang. I allmänhet standard mesh-filer är ofta tillfredsställande för uppblåsbara kupoler medan fast kupoler garanterar ett bättre resultat.

Mesh-fil Projektorn resolutioner
4×3 XGA: 1024 x 768 (rekommenderas Inte)
SXGA+: 1400×1050
5×4 SXGA: 1280×1024
16 x 9 WXGA: 1280×720 (rekommenderas Inte)
HD: 1920×1080
16×10 UXGA+: 1920×1200

Observera att sfärisk spegel projektion är bara meningsfullt för dataprojektion och sedan när projektorn körs i fullskärmsläge. Den form av mesh är inte en funktion av projektorn resolution, utan snarare av bildförhållande. Detta förklarar varför det finns bara tre standard warp-filer som anges ovan, att de motsvarar de tre mest förekommande dataprojektor bildförhållanden. En aspekt av 5×4 ingår inte, eftersom de är relativt ovanliga i dag och inte perfekt sfärisk spegel projektion.

Om läsaren laddar ner en av varpen mesh-filerna ovan de kommer att iakttas för att vara ren ASCII-textfiler. Den första raden visar den inmatade bilden typ, som är “2” för fisheye-bilder … kom ihåg denna grundläggande teknik som kan användas för ingående bild prognoser andra som fisheye, till exempel standard perspektiv filer, sfäriska (equirectangular) prognoser, cylindriska, etc. Men i fallet av ett planetarium och skevhet ett fisheye-bild den första raden är alltid “2”, detta kan också användas som test att en vald warp-fil är lämpligt. Den andra raden innehåller två siffror som anger mått av 2D-mesh, den första siffran är antalet noder horisontellt (Nx) och den andra antalet noder vertikalt (Ny). Detta och andra aspekter illustreras i nästa figur. De följande raderna i filen innehåller 5 nummer de är:

  • Positionen av nod (x,y). Dessa ges i normaliserad tv med koordinater, så att den horisontella sortiment kommer att vara -aspekt för aspekt, det vertikala området kommer att vara -1 till 1. Normaliserade koordinater innebär att om den mesh visas med en ortografisk kamera av bredd -aspekt aspekt horisontellt och -1 till 1 vertikalt sedan mesh kommer att fylla en skärm av samma aspekt. I OpenGL denna kamera kan vara något i stil med:
       glViewport(0,0,width,height);
       glOrtho(-width/(double)height,width/(double)height,-1.0,1.0,0.1,10);
    
  • Texture-koordinat (u,v) för nod, var och en av dessa intervallet 0 till 1 och gäller fisheye bild som kommer att tillämpas till mesh.

  • En multiplikativ intensitet värde i intervallet 0 till 1, detta gör att man kan klara sig med en ljusstyrka för olika ljusstrålen längd och täthet på kupolen (till exempel: bleknar bilden mot “baksidan” av kupolen). Observera att ett negativt värde på denna intensitet värde som anges mesh node bör inte dras, faktiskt hela mesh grid quad (eller triangel) inte bör dra.

figure1

Observera att medan (x,y) positioner i de noder här bilda ett regelbundet rutnät, de behöver inte. Ibland är det lättare att genomföra varp med en vanlig (x,y) grid och varierande (u,v), ibland en variabel (x,y) – arrangemanget är att föredra, även om det fortfarande är topologiskt ett rutnät.

 Det är bara två parametrar som användaren måste ange, de är:

  • Upplösning i pixlar av off-screen konsistens som fisheye är att återges. Det exakta värdet kan ändras för prestanda skäl, utan för HD eller UXGA+ projektorn resolutioner som normalt rekommenderas skulle vara 2048 (om befogenheter 2 krävs) eller 1600 pixlar (om befogenheter två är inte obligatoriskt).

  • Namnet på det nät warp-fil, alternativt inklusive vägen om det inte är föreskrivet.

Mus val

Musen för att klicka på en skev fisheye behöver några speciella hantering. Medan det finns ett antal olika sätt objekt val kan hanteras i realtid Api: er, är det i allmänhet så att de kräver pixel position innan skevhet. Så här kommer det att antas ansökan redan kan hantera musen för att klicka på och objekt val i fisheye utrymme, kommer följande att sedan beskriva hur man härleda pixel position i fisheye ges en pixel position i skeva fisheye.

figure3

Gett konventionen i ovanstående figur förfarandet är som följer.

  • Låt (iw,jw) att det klickade pixel position i den skeva bilden. de respektive område från 0 för att visa bredden och höjden.
  • Konvertera dessa till normala skärmen koordinater xw och yw som följer
    xw = 2 * aspekt * (iw / displaywidth – 1/2)
    yw = 2 * (jw / displayheight – 1/2)
  • Nu xw och yw som är i samma koordinatsystem (x,y) koordinater av nät, ett måste nu hitta quad eller triangeln i mesh som innehåller punkten (xw,yw).
  • När quad eller triangel har hittats på exakt motsvarande struktur samordna motsvarande punkt (xw,yw) kan interpoleras med hänsyn till de relativa (x,y) position för den punkt i quad eller triangel, och (u,v) struktur koordinater på varje vertex.
  • Denna struktur koordinat (uf,vf) är ett index som till fisheye bild, det bara måste omvandlas för att ge bilden koordinat (if,jf) för fisheye, eftersom uf vf som båda sträcker sig från 0 till 1 detta är helt enkelt
    if = fisheyewidth * uf
    jf = fisheyeheight * vf