**OpenSceneGraph** (OSG) je open source API pre tvorbu 3D grafických aplikácií so širokým spektrom uplatnenia od vedeckej vizualizácie, vizuálnej simulácie, cez počítačové hry až po virtuálnu realitu.

Ide o multiplatformný toolkit postavený nad OpenGL. Vývojovým jazykom je primárne C++, existujú však aj prepojenia na jazyky Java, Python a Lua.

História
--------

Projekt OpenSceneGraph začal pre vlastnú potrebu tvoriť Don Burns roku 1998 v prostredí operačného systému Linux. Následne v roku 1999 sa k nemu pripojil Robert Osfield, ktorý pracoval na prenesení hotových súčastí na platformu Microsoft Windows. V septembri 1999 boli zdrojové súbory uvoľnené ako open source a vznikla aj oficiálna stránka projektu. Ku koncu roka prebral Robert vedúcu úlohu a začal rozsiahly refactoring celej kódovej banky, snažiac sa o modernizáciu, zahrnutie najnovších štandardov C++ a čo možno najlepšie využitie návrhových vzorov.

V apríli 2001 vzhľadom na rozrastajúcu sa komunitu užívateľov a čoraz väčší záujem verejnosti po celom svete, Robert Osﬁeld založil OpenSceneGraph Professional Services, službu poskytujúcu školenia, dlhodobú komerčnú podporu a konzultačné služby vývojárom aplikácií postavených na OSG. Došlo tak k úplnej profesionalizácii projektu.

Prvou oficiálnou "celou" stabilnou verziou bola verzia 1.0 vydaná roku 2005. Následne roku 2007 prišla rozšírená verzia 2.0, pridávajúca okrem iného podporu viacjadrových a multi-gpu systémov, niekoľko dôležitých NodeKits a prechod k využívaniu unifikovaného multiplatformného build systému CMake. V tom čase sa tiež objavili prvé knihy a oficiálne užívateľské príručky.

Projekt rýchlo rástol a stával sa čoraz populárnejším. Pod aktuálnou stabilnou verziou (3.0.1, vydaná 31.7.2012) je už podpísaných viac ako 480 prispievateľov a oficiálny mailing list projektu obsahuje tisíce mien.

Vlastnosti
----------

Základom OpenSceneGraph-u je myšlienka tzv. grafu scény. Ide o dátovú štruktúru, ktorá usporadúva logickú a priestorovú štruktúru grafickej scény acyklickým grafom. Scéna je hierarchicky organizovaná do stromovej štruktúry s uzlami s rôznym počtom potomkov. Jednotlivé uzly môžu predstavovať buďto jednotlivé objekty v scéne, skupiny objektov, množiny transformácií, ktoré majú byť aplikované na potomkov alebo pridružené pomocné informácie. Listy potom predstavujú jednotlivé modely objektov, teda samotnú geometriu scény.

Vzájomné vzťahy objektov zachytené týmto usporiadaním umožňujú jednoduchú implementáciu niektorých algoritmov riešiacich viditeľnosť v scéne a optimalizáciu zobrazovania, čím sa zvyšuje výkonnosť a zjednodušuje napr. práca s priehľadnosťou a blending všeobecne.

V aktuálnej verzii ponúka knižnica okrem iného

* Robustnú platformovo nezávislú implementáciu pokročilého grafu scény
* Podpora OpenGL 1.0 – 4.2, OpenGL ES 1.0 a 2.0
* Podpora OpenGL Shading Language
* Vysokú výkonnosť

1. View frustum, occlusion a small feature culling
2. Level of Detail
3. Najnovšie rozšírenia OpenGL
4. Viacvláknové aplikácie
5. State sorting, lazy state updating

* Podpora širokého spektra 2D a 3D formátov
* Podpora práce s kvalitnými antialiasovanými fontmi
* Prácu s rozsiahlymi terénmi
* Podporu pokročilých particle systémov
* Natívnu integráciu s okennými systémami hlavných platforiem a jednoduchú previazateľnosť s cross-platform GUI toolkitmi

### Ďalšie smerovanie

V ďalších verziách je zámerom vývojárov najmä rozšíriť podporu OpenGL ES, zobrazovanie tieňov a vylepšiť prácu s volumetrickými dátami. Tiež by malo dôjsť k rozšíreniu NodeKits pre prácu s 3D GUI.

Súčasti
-------

Balík knižníc OSG je možné rozdeliť do niekoľkých kategórií. Základom je súbor takzvaných Core knižníc (osg, OpenThreads, osgUtil a osgDB), doplnená knižnicami a nástrojmi pre zobrazovanie, prácu s okennými systémami a GUI (osgViewer, osgGA), Nodekits, zásuvnými modulmi a exportérmi pre modelovacie nástroje (3DSMax, Maya, Blender) a zväčša komunitnými projektmi zabezpečujúcimi podporu ďalších programovacích jazykov okrem C++.

### Core

Jadro OpenSceneGraphu tvoria štyri základné moduly – osg, osgDB, osgUtil a OpenThreads.

*osg* zabezpečuje konštrukciu a manipuláciu scene graphu. Jej súčasťou sú triedy reprezentujúce rôzne typy uzlov grafu scény, samotnú geometriu, abstrakciu nad OpenGL stavovým strojom, geometrické transformácie a matematické triedy pre vektorové a maticové operácie v 3D priestore. Dôležitou súčasťou je aj funkcionalita pokročilej správy pamäte.

Pre prácu s najrozšírenejšími 2D a 3D súborovými formátmi, ako aj abstrakciu I/O zariadení slúži modul *osgDB*.

*osgUtil* je renderovacím backendom, starajúcim sa o prechod grafom scény, culling a transformáciu do série volaní OpenGL. Poskytuje tiež základné možností manipulácie s objektami v scéne, tzv. picking.

Platformovo nezávislé, minimálne a kompletné objektovo orientované vláknové rozhranie poskytuje knižnica *OpenThreads*.

### osgViewer

Knižnica osgViewer poskytuje pohodlnú a rýchlu cestu vizualizácie zostaveného scene graphu. Predstavuje tiež platformne nezávislú abstrakciu nad prácou s rôznymi okennými systémami.

### NodeKits

Súčasťou balíka OSG je aj množina takzvaných NodeKits, čo sú hotové riešenia netriviálnych, často sa objavujúcich problémov, resp. pokročilejších komponent 3D grafických aplikácií. Najdôležitejšími sú:

* osgAnimation – Práca s kostrovými modelmi, ich animácia a morphing.
* osgFX – Špeciálne efekty a postprocessing obrazu.
* osgManipulator – Interaktívne 3D ovládanie.
* osgParticle – Pokročilá práca s particle systémami.
* osgQt – Integrácia s Qt toolkitom a začlenenie prvkov QtGUI do OSG aplikácií.
* osgShadow – Framework pre techniky zobrazovania tieňov.
* osgTerrain – Zobrazovanie rozsiahlych terénov.
* osgText – Kvalitné zobrazovanie antialiasovaných fontov, TrueType a FreeType fonty.
* osgVolume – Volume rendering a práca s volumetrickými dátami.
* osgWidget – Tvorba jednoduchých užívateľských rozhraní.

Technológie
-----------

OpenSceneGraph je napísaný v štandarde jazyka C++, využívajúc možnosti STL (Standard Template Library) a v čo najvyššej možnej miere uplatňujúc návrhové vzory OOP. Okrem C++ existujú prepojenia na jazyky Java (JavaOSG), Python (pyOSG), Lua (osgLua, resp. osgToy) a C#/.Net (osgDotNet).

Celá knižnica je koncipovaná modulárne s dôrazom na upraviteľnosť a jednoduchú rozšíriteľnosť.

Projekt je vystavaný nad OpenGL, v súčasnosti podporujúc možnosti OpenGL 1.0 – 4.2, ako aj OpenGL ES do verzie 2.0. Zabezpečená je tak ako kompatibilita so starším hardvérom, tak aj sprístupnenie možností poskytovaných tým najnovším.

### Platformy

OpenSceneGraph v súčasnosti podporuje vývoj pre všetky dôležité operačné systémy, medzi inými Linux, MS Windows, Mac OS X, FreeBSD, IRIX, či Solaris. Od verzie 3.0.0 je knižnica tiež dostupná pre mobilné platformy iOS a Android.

Výhody a využiteľnosť
---------------------

Knižnica OpenSceneGraph svojim užívateľom poskytuje množstvo výhod oproti práci priamo s nízkoúrovňovými grafickými rozhraniami, ako je OpenGL.

Medzi tie najdôležitejšie patria:

### Výkon

Vďaka zahrnutiu pokročilých vlastností OpenGL (state sorting, vertex buffer objekty, podpora GLSL), pokročilých metód riešenia viditeľnosti v 3D scéne (view frustum, small feature, occlusion culling), či Level of Detail priamo v jadre knižnice ide o jeden z najvýkonnejších zobrazovacích nástrojov.

### Produktivita

Jadro grafu scény zapuzdruje väčšinu funkcionality OpenGL vrátane najnovších rozšírení, poskytuje optimalizáciu pri renderovaní (culling, sorting) a celý súbor doplnkových knižníc, ktoré umožňujú vytvárať veľmi rýchlo vysoko výkonné grafické aplikácie. Vývojár sa tak nemusí sústrediť na nízkoúrovňový kód.

#### Zavádzače databáz

Súčasťou jadra OSG je databázová knižnica osgDB, umožňujúca jednoduchú a rýchlu prácu s množstvom multimediálnych súborových formátov. V súčasnosti sa skladá z viac ako päťdesiatich rôznych pluginov pre spracúvanie 3D databázových a obrazových formátov.

Medzi podporované 3D formáty patria napríklad COLLADA, LightWave (.lwo), Wavefront (.obj), OpenFlight (.flt), 3D Studio MAX (.3ds), DirectX (.x) a mnoho ďalších. OpenSceneGraph tiež umožňuje využitie natívneho ASCII .osg formátu.

Obrazové formáty zahŕňajú .rgb, .gif, .jpg, .png, .tiff, .pic, .bmp, .dds, .tga a quicktime.

V neposlednom rade je tiež nutné spomenúť podporu FreeType a TrueType, ako aj obrazových (.txf) fontov.

### Prenositeľnosť

Jadro knižnice je navrhnuté s dôrazom na minimalizáciu závislosti na konkrétnej platforme, spoliehajúc sa v zásade iba na štandardné C++ a OpenGL. Dôležitá je tiež nezávislosť na konkrétnom okennom systéme. Prostredníctvom osgViewer je zabezpečená natívna podpora Win32 (MS Windows), X11 (Unix-based systémy) a Carbon (OSX). Jednoducho je tiež možné knižnicu prepojiť s ďalšími okennými a GUI toolkitmi, ako sú Qt, WxWidgets, GLUT, FLTK, SDL, Cocoa a MFL.

### Škálovateľnosť

Vďaka podpore viacerých grafických kontextov a silne optimalizovaným prechodom grafom scény, ako aj rozsiahlej podpore viacvláknových aplikácií je možné OpenSceneGraph používať na širokej škále zariadení, od mobilných až po najnovšie viacjadrové, multi-gpu systémy.

### Prístupnosť

Súčasťou distribúcie OSG je aj rozsiahla zbierka príkladov a demonštračných aplikácií, názorne prezentujúcich jednotlivé pokročilé možnosti knižnice, ako aj vzorový dataset obsahujúci modely, textúry a ďalšie zdroje využiteľné pri rýchlom prototypovaní aplikácií.

Existuje tiež niekoľko kníh, od začiatočníckych až po profesionálne, rozsiahla kvalitná dokumentácia a živá komunita vývojárov a užívateľov. K dispozícii je tiež profesionálna technická podpora pre komerčné produkty.

Použitie
--------

OpenSceneGraph samotný neposkytuje žiadne nadstavby pre tvorbu hernej logiky, ide o vizualizačný a animačný nástroj. Pre tvorbu herných aplikácií alebo takzvaných "serious games" existuje niekoľko kompletných enginov, najznámejším z ktorých je pravdepodobne Delta3D, využívajúcich OpenSceneGraph práve ako základ pre grafický rendering.

Zaujímavými projektmi postavenými nad OSG sú napríklad Virtual Terrain Project, alebo ViewTec TerrainView. Medzi užívateľmi môžeme ďalej nájsť spoločnosti ako Boeing, NASA, FlightGear, Norcontrol a ďalšie.

Pozri aj
--------

* OpenGL
* Delta3D
* OGRE
* Irrlicht Engine

Referencie
----------

1. 1 2 3   *OpenSceneGraph Features* [online]. [Cit. 2012-11-28]. Dostupné online. (po anglicky)
2. 1 2  Martz, P.: *OpenSceneGraph Quick Start Guide*. Louisville, USA, 2007.
3. ↑   *OpenSceneGraph - History* [online]. [Cit. 2012-11-28]. Dostupné online. (po anglicky)
4. ↑  . Dostupné online.
5. ↑  Wang R. Qian X.: *OpenSceneGraph 3 CookBook*. Packt Publishing, Birmingham, 2012
6. ↑  Wang R. Qian X.: *OpenSceneGraph 3.0 Beginner's Guide*. Packt Publishing, Birmingham, 2010.
7. ↑   *OpenSourceGraph - professional support* [online]. [Cit. 2012-11-28]. Dostupné online. (po anglicky)
8. ↑  . Dostupné online.
9. ↑  . Dostupné online.
10. ↑  . Dostupné online.
11. ↑  . Dostupné online.
12. ↑  . Dostupné online.