Biztos többen is olvastátok Steve, ksgy üzengetését velem, még LHOY beharangozásánál, hogy hiányzik LHBP scenery és meg kéne csinálni. Eléggé beleástam magam a témába és nagyon gyorsan eljutottam odáig, hogy MESH -el érdemes kezdeni egy nagyobb repteret.

Első körben Steve által leírt Fotorealisztikus scenery készítéssel próbálkoztam, nagyon jó a leírás, ismételten csak ajánlani tudom mindenkinek.

Egyetlenegy dolog zavart csak az eljárásban, hogy a 2048x2048-as szeletek south-east koordinátáját rábökéssel, szemre kell eltalálni (jobb eljárás híján).

Kis olvasgatás után kitaláltam, hogy majd sima aránypárral szépen kiszámolom, hogy a 3200x2400 -as ptsim ből lementett szeletből hova esik 2048x2048-as szelet south-east pontja. Írtam erre egy bash scriptet és működni is látszott a dolog.

A script heveny számítást végez és pixel pontosan egymás mellé és alá pakolgatja az elkészült szeleteket a .dsf.txt-ben, majd a DSFTool -al átkonvertáltam a .dsf.txt-t .dsf -é, megnéztem OE-ben és hézagokat láttam a szeletek között. Rövid tesztelgetés után rájöttem, hogy a DSFTool a felelős a dologért, konvertálás közben rosszul "kerekíti" a koordináták tizedes jegyeit.

Letöltöttem a forrását a DSFTool-nak és meg is találtam, hogy hol van a hiba, kijavítottam és mint jó rendszergazda, írtam a fejlesztőjének, hogy van egy ilyen hiba és szeretném a scriptemet publikálni és hogy működjön az én scriptem, neki javítani kéne ezt a pontatlanságot. Rövid levelezgetés után azt javasolta a fejlesztő, hogy van egy sokkal jobb megoldás sok és nagy fotókból álló scenery készítésre és használjak Meshtool-t, annak is a beta változatát.

Szerinte jóval gyorsabb lesz az ezzel a tool-al generált scenery.
Erre felkaptam a fejem és gondoltam, hogy most akkor megmutatom a "világnak", hogy milyen gyors scenery-t tudok csinálni. :-)
Arról szerencsére nem szólt a levelezésünk, hogy a teljes 1 fokos szeletet meg kell csinálnom, mert azon nyomban el is vetettem volna a tool használatát, hisz nem ez volt az eredeti terv.

Merthogy Steve és ezen leírás között az óriási különbség, hogy itt egy 1 fokos szeletben gondolkodunk, míg Steve leírása által készített .dsf csak egy kisebb területet fed le. Eddig csak kis repterek készültek, ahol kisebb pontatlanságok nem látványosak vagy észrevehetetlenek.

Meshtool-ba először az LHBP 140 fotó-szeletét raktam be, és szépen meg is csinálta a dolgokat, de a reptér körül vagy víz volt, vagy egy az x-plane library-ból összerakott város (semmiképpen nem Budapest). Nagyon elégedetlen voltam az eredménnyel, mert a repülőtér közelében lévő város egyáltalán nem hasonlított Budapestre, a fotókat nem is tudtam volna szépen beilleszteni ebbe a környezetbe.

Elkeseredésemben nekiálltam lefotózni a reptér környékét, hogy majd még egy réteget csinálok, ami kicsit nagyobb mint Ferihegy és akkor eljutottam a Dunáig és a víz kérdésig. A global scenery-ben pl. a Kis-Duna ág (Csepel sziget) nincs végig meg, ezt én nagyon hiányoltam, hisz ez magasról is jól látszik.

A végén aztán elkeseredésemben nekiálltam a teljes 1 fok fotókkal lefedéséhez. Próbáltam a korábban emlegetett scriptemet alkalmazni, de sajnos a számítási pontatlanságok miatt nem lett jó a végeredmény és pl. a Duna a global scenery-hez képest jó 500 méterrel arébb folytatódott a következő 1 fokos szeleten, amihez már nem akartam nyúlni. Úgyhogy kellett egy megoldás a még pontosabb számításra, vagy inkább a még pontosabb illesztésre. Ekkor a bash scriptemet teljesen el is hagytam, a MESH készítéshez többé már nem volt rá szükség a pontatlansága miatt.

Utólag örülök neki, hogy belevágtam, de hetekig elég bosszús voltam, mert a dokumentációk heveny módon vannak megírva és a számuk is elég csekély. Example meg aztán végképp fehér holló. A MeshTool által használatos kapcsolók és script formátuma ma is tartalmaz homályos pontokat számomra, de nagyon sok mindent sikerült megértenem.

Mi az a MESH?

Terrain Meshnek nevezik azt az 1 fokos szeletet, melynek a domborzata van a scenery-ben, röviden MESH. A MESH az overlay szint alatt van, gyakorlatilag minden olyan helyen, ahol csak a global scenery-d van, a MESH-t látod, domborzattal, vízzel és natural objektumokkal (fa, kaktuszt, cserje).

Minden leírás amit találtam, elirányított több gyönyörű szép oldalra, ahonnan államok szerint le lehet tölteni a teljes USA orthophotót, európa, de pláne Magyarország abszolút fehér folt. Esetleg meg lehet venni az fotókat, de ki tudja milyen minőségű, stb...

Egy ihlet útján valahogy a jó öreg Linux-hoz fordultam, ahol is a leírások szerint geológiai programok tömkelege áll rendelkezésre. Illetve x-plane.org -on post -oltak a global scenery készítői és emlegettek programokat érintőlegesen. Végül ezek segítségével sikerült összeállítanom a MESH-t.

Csapjunk bele!

1. A fotók

Első lépésként Steve által is használt ptsim oldalról szerezzük be a fotókat.
A módszer ugyanaz, mint amit Steve leírt, annyi különbséggel, hogy a minden egy es lementett képhez a koordinátákat írjuk ki, mert szükségünk lesz rá később.

Nem a középpont koordinátáira lesz szükségünk, hanem ezekre.

Én PNG-ket készítettem, de BMP vagy más formátum sem gond.

2. Utómunka

A lementett fotókkal egy kis utómunkát kell csinálnunk, különböző dolgokat kell leszednünk róla, eltüntetni ezt-azt. :-)
Nagyon vigyázzunk rá, hogy kép mérete ne változzon (felbontás, oldalak aránya/mérete).

3. GDAL

Töltsük le a GDAL alkalmazást, telepítsük fel. A telepítést nem vesézném itt ki, a http://www.gdal.org oldalon minden ehhez szükséges dolgot meg találtok.

GDAL alkalmazással, a lementett a PNG-kből iszonyatosan gyorsan tudunk geotiffet készíteni, a parancs formátuma:

gdal_translate -of format -a_ullr ulx uly lrx lry path/inputfile path/outputfile

-of kapcsoló: output format, megmondja, hogy milyen formátumban kérjük a kimeneti file-t.
Nekünk geotiff-re van szükségünk, az elnevezése itt GTiff.

-a_ullr kapcsoló: a fotó koordinátáit adjuk meg vele, sorrendben upper left x, upper left y, lower rigth x és lower rigth y.

Borzasztó egyszerű helyzetben vagyunk, a lementett fotóhoz tartozó koordinátákat csak be kell írnunk.

ulx=West
uly=North
lrx=East
lry=South

példa:

gdal_translate -of GTiff -a_ullr 19.181184768676758 47.46918175979224 19.249849319458008 47.43435798933268 /tmp/0_0.png /tmp/00.tif

4. Egyesítés

Az elkészült .tif -eket most egyesíteni fogjuk egy a GDAL -hoz adott python scriptel.
A python script használata:

./gdal_merge.py -o outputfile infiles1 infiles2 infiles3 ...

-o kapcsoló a kimeneti file nevét adja meg

Az összes többi file -t csak felsorolásszerűen, szóközzel elválasztva mögé kell írni(érdemes a fotók fájlneveiben a szóközt hanyagolni, mert itt gondok lehetnek vele).

Megjegyzés:

- A script használatát megelőzően telepíteni kell egy python gdal modult, mely a gdal csomag része, ha ez nincs fenn, a script nem fut le. Ajánlott a gdal README elolvasása/átfutása.
- A script nincs benne a standard path-ban, én oda másoltam a fotók mappájába, hogy ne kelljen végigírni a path-t az input - output file -oknál.
- Az összerakott .tif -ünk (mint ahogy a .tif formátum is) elég nagy lesz. A +47 +019 -es szelet, olyan 1,2 GB körül mozog.

5. Színek

Ezután megint egy kis fotó munka jön, a nagy .tif -en egy kis színkorrekcióra van szükség, mert a DDS -é konvertáláskor veszít a színéből, fakóbb lesz egy kicsit.
Nagyjából a következő értékekkel érdemes "megtoldani" a MESH fotót:

Contrast: +15 - +20
Gamma correction: +0.01 - +0.05
Color correction red: +10
Color correction green: 0
Color correction blue: +15

6. Darabolás

A következő lépés a darabolás, melyre egyelőre ingyenes megoldást nem találtam. Hosszú keresgélés után bukkantam rá egy "Geographic Imager" Photoshop pluginra, mely nagyon nagy használatot tehetne, de sajnos nagyon drága, ha jól láttam, akkor 700 dollár környékén van.

A jó hír, hogy a teljes verzió fenn van az oldalon, melyet (regisztráció után) ingyenesen le lehet tölteni és minden funkciójával együtt lehet használni 2 hétig (evolution verzióként).

Bővebben:
http://www.avenza.com/

Amint lesz ingyenes megoldás a darabolásra, ezt a pontot kiegészítem.
A mellékelt fotón látható ikonra kattintva feljön egy kis ablak és ott az adatokat kitöltve elkészíti a 2048x2048 -as szeleteket.

7. MESH "kellékek"

A MESH hez szükségünk van még SRTM elevation tif -re, DEM -nek nevezik a térképészek és 1 helyet találtam, ahonnan le lehet tölteni az egész földet 1 fokos szeletenként.

http://srtm.csi.cgiar.org/SELECTION/inputCoord.asp

Nemes egyszerűséggel le kell tölteni egy geotif-et, amelyikre szükséged van.
Linux-al egy kicsit még át kell dolgozni, de gyakorlatilag csak egy jól irányzott parancs kell hozzá, hogy használható file -od legyen.

A letöltött file neve pl. : SRTM_ff03_n047e019.tif.gz

Ezt nyilván gzip -el ki kell csomagolni

gzip -d SRTM_ff03_n047e019.tif.gz

majd egy

geotifcp -s SRTM_ff03_n047e019.tif SRTM_ff03_n047e019-scanline.tif

parancsal scanline formátumba rendezzük a geotifben lévő adatokat.

A geotifcp parancs a Debian-ban a geotiff-bin és általában a libgeotiff csomagban található meg.

Ezen kívül szükségünk van még az adott szelet klíma file-jára, melyet az X-Plane a rendelkezésünkre bocsát, innen kell letölteni a szükséges file -t: http://update.x-plane.com/MeshTool/

Nekem a +47+019.zip-et kellett letöltenem, melyet kicsomagolva, egy +47+019.xes file-t kaptam.

8. Meshtool használat

A Meshtool parancs formátuma:

MeshTool <script file> <climate file> <DEM file> <dump directory> <output file>

script file: végére hagyom, ez a legnehezebb és leghosszabb volumenű talán
climate file: ezt csak simán le kell tölteni az x-plane.com oldalról, semmi dolgunk vele
DEM file: letöltöttük és scanline formátumban a rendelkezésünkre áll
dump directory: gyakorlatilag mint egy temp könyvtár, kötelező megadni, de gyakorlatilag ha végzett a Meshtool, akkor törölhető
output file: .dsf file helye/neve.

példa:

MeshTool LHBP.txt +47+019.xes SRTM_ff03_n047e019-scanline.tif dump +47+019.dsf

A Meshtool-t érdemes a készülő MESH -ünk főkönyvtárában elhelyezni, én pl. "LHBP terrain" nevet adtam a MESH -nek.
Ezen a könyvtáron belül, szükségünk van egy "Earth nav data" könyvtárra, ezen belül a nagyobb un. tile nevét kell megadni, LHBP esetében "+40+010", és ez alá a könyvtár alá kell majd raknunk a Meshtool által elkészített .dsf file-t.

Ezen kívül szükségünk lesz még egy könyvtárra, - mint ahogy a képen is látható -, ahol a textúráinkat fogjuk tárolni.
Én "textures" nevet adtam neki, de bármi lehet, ide másoljuk be a már előkészített .tif fileokat.

Majd ha a 9. pontban lévő script fileunk is megvan, akkor indíthatod a scriptet és elmehetsz ebédelni az első indításkor, mert a .tif file -okból meg fogja csinálni a DDS fileokat és ez elég hosszú időt vesz igénybe. A hosszú idő persze relatív, LHBP 72 db fotóját kb. 1 óra alatt csinálta meg.

Megjegyzés:

Meshtoolnak szüksége van egy config mappára, ami az xptools csomagban megtalálható, azt feltétlenül a Meshtool-al együtt kell másolni.

9.Mestool script file

Külön szekciót hagytam neki, mert nem egyszerű és nagyon sokat kell olvasgatni a Meshtool README-t, hogy egy kicsit is megértse az ember.
Gyakorlatilag a scriptfile formátuma mint az overlay rétegben a dsf.txt file. Csak más kapcsolók vannak benne, illetve nem is kapcsolók, hanem talán utasítások.

A script-ben a sorrendjük nagyon fontos, mert sorrendben lentről felfelé így fognak elhelyezkedni a dolgok, mint amilyen sorrendbe beleírjuk a script file-ba.

No de egy példa alapján talán sokkal könnyebb lesz, íme LHBP.txt tartalma:

BACKGROUND terrain_Water
GENERATE_DDS 1
GEOTIFF 0 textures/47019_01.tif
GEOTIFF 0 textures/47019_02.tif
GEOTIFF 0 textures/47019_03.tif
GEOTIFF 0 textures/47019_04.tif
...
...
...
GEOTIFF 0 textures/47019_72.tif

- Először is megadjuk, hogy mi legyen a background. Érdemes vizet beállítani, de lehet még "Natural" a típusa, pl. BACKGROUND terrain_Natural. Ezzel azonban értékes FPS -eket veszíthetünk a MEshtool leírása szerint.

- A következő parancs arra vonatkozik, hogy a későbbi fotókból generáljon-e DDS formátumot. Ez a Meshtool első futtatásakor feltétlenül fontos, mivel az X-plane nem tud csak PNG-t vagy DDS formátumot olvasni. Következő indításoknál már nem fontos, kiveheted, és akkor géptől függöen 10-30 másodperc alatt lefut a Meshtool. Persze ha módosítasz a .tif -eken, akkor újból le kell generáltatni a .dds fileokat.

GENERATE_DDS 1 = legenerálja a DDS fileokat a textures könyvtárba, pl. textures/47019_01.tif ből készül 1 textures/47019_01.dds

- A következő a fotónk definiciója.
GEOTIFF 0 textures/47019_01.tif

Három féle állaga lehet a fotónknak.
0: nincs víz, alatta sem rajzol vizet.
1: water , solid A fotó alatt víz van, ha kilukasztjuk a fotónkat, akkor alatta látszik a víz. De sajnos szárazföldként működik, nem lehet seaplane-el leszállni rá (összetörik).
2: Víz

- Meshtool készít a textures könyvtárba minden .tif-hez egy .ter file-t is. Ezt Te később módosíthatod, az ebben a fileban fellelhatő lehetőségekről bővebben itt olvashatsz: http://scenery.x-plane.com/library.php?doc=terspec.php

10. Finish

Az elkészült .dsf file -t másold be az "Earth nav data/big tile" mappába(pl. +40+010/ és indulhat az X-plane.
Ezt a réteget ugyanis szerkeszteni nem tudod Overlay Editorban. Ha már van esetleg egy area vagy egy ovelay rész is a scenery csomagodhoz, akkor az OE-ben ez a MESH jelenik meg és nem az alap textúra. Esetleg ott is megnézheted, hogy mit csináltál. :-)

Megjegyzés:

Az elkészült MESH még nem tartalmazza a vizeket, ennek az elkészítése még nem kiforrott, de amint konkrét megoldást találok rá, feltétlenül kiegészítem ezt a leírást.

Összegzés

Az egész Mesh készítés nálam 2 operációs rendszer használatát ígényelte.
MAC -en dolgozom, tesztelek, Debian Linuxon használom a GDAL-t.
Azt hiszem, hogy az egész megoldható Windows-on is, egy CygWin nevű windows-os alkalmazás segítségével. http://www.cygwin.com/

Az x-plane.hez adott global scenery -t ugyanezzel módszerrel készítik el, scriptek és különböző geológiai segédprogramok segítségével.
Az eljárás nagyjából így néz ki lépésről lépsre:
- letöltik az elevation, víz, város, erdő térkép adatokat valamelyik geológiai adatbázisból (http://edcsns17.cr.usgs.gov/EarthExplorer/, http://mapserver.flightgear.org/download.psp, http://eros.usgs.gov/)
- az adatokból shape fileokat készítenek 1-1 fokos bontásban rétegenként, pl. városok 1 réteg, víz 1 réteg, erdő 1 réteg
- a shapefileokat editálják, javítgatják, konvertálják különböző geológiai programokkal (ArcGIS,Quantum GIS, Grass GIS, GDAL)
- a kész shape fileokat beletöltik egy PostgreSQL adatbázisba (PostGIS)
- készítenek egy library-t, melyekbe városok képeit, natural objektumokat, city objektumokat (házak, épületek) és road objektumokat készítenek. Ezeket megtalálhatjátok az X-Plane könytárából kiindulva Resources/default scenery mappában. Ezt a mappát használja az X-Plane library-ként és 900 World library néven hivatkoznak rá leírásokban.
- script segítségével összerakják a Meshtool -hoz a szükséges dolgokat, és lefuttatják a MEshtool-t. A rétegek, melyeket egymásra raknak, nagyjából ilyen sorrendben:

  • Background, víz
  • City, shape file alapján töltik ki a területet a library-ból city_objektekkel, lakóépületek, lakótelepek, kertvárosi övezet vagy gyárak fotóival.
  • Water, shape file alapján maszkolják ki a vizeket.
  • Natural, shape file alapján töltik ki a területet a library-ból natural_object -ekkel, a .xes (climate) file alapján fa, vagy kaktusz vagy valami cserjével.
  • Airport, shape file alapján töltik ki a területet a library-ból valamilyen színű textúrával, a .xes file alapján. Ez lehet zöld fű, száraz fű, homok, ennek megfelelő színű/allagú textúra kerül ide.

Amikor MESH-t készítünk, az eddig felsoroltakat írjuk felül a saját produktumunkkal.

Gondolom látszik, hogy elég sok lehetőség rejlik még a Meshtool-ban, és a fenti leírás csak egy - két réteget említ. Lehet, hogy csak LHBP elkészülte után fogok tudni vele foglalkozni, de mindenféleképpen bővítem a tudásbázist ezzel kapcsolatban.

Bárkinek bármilyen kérdése van, belevágna és segítségre van szüksége, ne habozzon! Itt vagyunk (egyelőre csak én, de remélhetőleg lesznek követőim) és segítünk.

Kapcsolódó anyagok:

http://scenery.x-plane.com/library.php
http://forums.x-plane.org/index.php?showtopic=30999&st=50&p=361802&hl=po...
http://www.remotesensing.org/geotiff/faq.html#preserve_metadata