Open Inventor je objektově orientované API pro vývoj 3D grafiky. Jedná se o vysokoúrovňovou vrstvu nad OpenGL. Původně byl implementován pro jazyk C++, ale dnes se dá používat i v dalších jazycích, například v Javě a na platformě .NET.

Open Inventor
Logo
VývojářVSG (Visualization Sciences Group)
Aktuální verze2.1.6 (28. května 2021)
Operační systémmultiplatformní
PlatformaJava Virtual Machine
Vyvíjeno vC++
Typ softwaruknihovna pro práci s 3D grafikou
Licencekomerční
Webhttp://www.vsg3d.com/open-inventor/sdk
Některá data mohou pocházet z datové položky.

V současné době je Open Inventor vyvíjen firmou VSG (Visualization Sciences Group) jako komerční produkt. Jeho populární open source alternativou se stal Coin3D.

Historie editovat

V letech 1988–1989 požádal Wei Yen, tehdejší viceprezident SGI (Silicon Graphics International Corp.), Rikka Carreyho o vedení projektu IRIS Inventor. Jejich cílem bylo vytvořit nástroj, který by zjednodušil vývoj 3D grafických aplikací. Vycházeli z předpokladu, že malý počet 3D aplikací založených na nízkoúrovňovém IRIS GL je způsoben přílišnou časovou náročností vývoje a pokud by byl jejich vývoj usnadněn prostřednictvím objektově orientovaného API, začalo by jich vznikat více. Spíše než na výkon se zaměřili na jednoduchost použití a jejich krédem se stalo heslo "3D programování pro lidi".

IRIS Inventor editovat

První betaverze IRIS Inventoru (později známá jako Scenario) byla uvedena v roce 1991, což je dokonce rok před první verzí OpenGL. O rok později byl vydán IRIS Inventor 1.0, který byl postaven ještě nad IRIS GL, takže zatím nebyl platformově nezávislý. V roce 1993 vyšlo několik vylepšených revizí.

SGI Open Inventor editovat

V roce 1994, dva roky po uvolnění IRIS GL jako OpenGL, se licencování třetím stranám pro portování na další platformy dočkal i IRIS Inventor. Vznikl tak Open Inventor 2.0, který byl přepsán a založen na OpenGL. Ve stejném roce byl upravený grafický formát Open Inventoru navržen internetové komunitě jako možný jazyk pro popis 3D scény přes internet. Tento formát byl uznán jako VRML standard. Realizace VRML nepřímo popularizovala Open Inventor po celém světě. VRML se poté dál vyvíjel a jeho formát se stal spíše rozšířením grafického formátu Open Inventoru.[1]

V následujících letech se Open Inventor stal standardem v oblasti profesionální 3D grafiky.

Ke konci 90. let se SGI začala soustředit především na vývoj svého OpenGL Performeru a v roce 1998 byl vývoj Open Inventoru ukončen.

V roce 2000 pak SGI vydala svou poslední verzi Open Inventoru (Open Inventor 2.1) jako open source pod licencí LGPL.

TGS Open Inventor editovat

Firma TGS (Template Graphics Software) zakoupila licenci na Open Inventor již v roce 1994 a portovala jej na některé další platformy (Sun, HP, IBM a Microsoft Windows NT). Poté, co SGI ukončila vývoj Open Inventoru, převzala TGS roli hlavního vývojáře. Do Open Inventoru byla přidána řada pokročilých vlastností jako multithreading, pokročilá práce se shadery, stíny, volume rendering, mesh rendering a další.

V roce 2004 bylo TGS odkoupeno firmou Mercury Computer Systems, ale roce 2009 se původní TGS opět osamostatnili a změnili si název na VSG.

VSG Open Inventor editovat

Od roku 2009 pokračuje ve vývoji komerčního Open Inventoru firma VSG.

Coin3D editovat

Související informace naleznete také v článku Coin3D.

Od roku 1995 začala nezávisle na Open Inventoru vznikat knihovna Coin3D pro vykreslování scény z formátu VRML. Po jejím rozšiřování a následném přepsání od základu se vývojáři Coin3D rozhodli implementovat Open Inventor API. Současný Coin3D je tak plně kompatibilní s rozhraním Open Inventoru 2.1, i když s ním nesdílí žádný kód.

Coin3D je dostupný jako open source pod licencí BSD a stal se tak populární open source alternativou k Open Inventoru.

Klíčové vlastnosti současného Open Inventoru editovat

  • Objektová orientace - Open Inventor je konstruován jako objektové API poskytující více než 1300 připravených tříd. V současné době existují API pro jazyky C++, Java a platformu .NET.
  • Vykreslování na OpenGL - Open Inventor je postaven nad OpenGL a poskytuje přístup k programování shaderů. Navíc obsahuje knihovnu více než 80 rutin pro shadery.
  • Graf scény - Scéna je v Open Inventoru popsána pomocí tzv. grafu scény.
  • Automatické optimalizace - Open Inventor automaticky provádí optimalizace, zejména na úrovni OpenGL a grafu scény.
  • Multiplatformnost - Open Inventor je dostupný na systémech UNIX, Linux a Microsoft Windows.
  • Multithreading - V Open Inventoru je implementována podpora výpočtů ve více vláknech a na více procesorech.
  • Akcelerace výpočtů na grafické kartě - Kromě grafických výpočtů umožňuje Open Inventor akcelerovat i práci s geometrií a daty pomocí grafické karty pomocí technologií OpenCL a CUDA.
  • Interaktivní vývojářské nástroje - Součástí balíku Open Inventoru jsou nástroje pro ladění 3D aplikací za běhu a interaktivní modifikaci grafu scény.
  • Pokročilé 3D funkce - Kromě standardní 3D geometrie poskytuje Open Inventor podporu pro NURBS křivky, NURBS plochy, NURBS teselaci a detekci kolizí.
  • Vizualizace rozsáhlých modelů - Open Inventor dokáže automaticky vytvořit jednodušší geometrii s menším počtem trojúhelníků a generovat LOD (Level of Detail).
  • Podpora rozšíření pomocí dalších knihoven - Open Inventor může být rozšířen pomocí dalších knihoven pro specifické potřeby. Základní sada rozšíření je k dispozici přímo v balíku Open Inventoru.

Architektura editovat

 
Schéma architektury Open Inventoru.

Open Inventor je konstruován jako objektová knihovna nad nízkoúrovňovým OpenGL. Poskytuje velkou sadu tříd pro práci s 3D grafikou a díky optimalizacím grafické scény může dosahovat i vyššího výkonu než přímá implementace na OpenGL.

Reprezentace scény editovat

Základem architektury Open Inventoru je databáze scény, která obsahuje informace o popisu jedné nebo více 3D scén. Jednotlivé scény popisují množiny příbuzných 3D objektů a atributů. Jednotlivé prvky v databázi scény mohou reprezentovat například dům, auto a člověka.[2]

Každá 3D scéna je popsána pomocí grafu scény. Scéna je tvořena uspořádanou kolekcí speciálních tříd, tzv. uzlů. Uzel je základní stavební jednotkou grafu scény. Existují základní tři kategorie uzlů:

  1. Tvary (shape nodes), které reprezentují různé 3D objekty.
  2. Vlastnosti (property nodes), které popisují vzhled a další charakteristiky scény.
  3. Skupiny uzlů (groups), které seskupují ostatní uzly do podoby grafu.

Každý uzel obsahuje množinu datových polí a každému z nich přiřazuje jméno. Pole jednoho uzlu mohou být propojena s poli jiných uzlů z důvodu šetření výpočetních nároků. Některé uzly jsou určeny ke zpracování uživatelského vstupu a k manipulaci se scénou.

Při vykreslování scény je graf parsován jako strom směrem shora-dolů a zleva-doprava. Užitečným uzlem je zde tzv. separátor, který vloží stav (barva, transformační matice atd.) na zásobník. Po rozparsování podgrafu pod separátorem je stav vyjmut ze zásobníku a všechny změny provedené na daném podgrafu tak neovlivní žádné další uzly. Separátor navíc dokáže scénu pod sebou předkompilovat do OpenGL display listu a tím urychlit proces renderování.[3]

Nad scénou a uzly mohou být prováděny různé akce. Mezi základní patří vykreslení, čtení, zápis, výběr prvku (picking), vyhledávání a zvýraznění (highlighting).

Návaznost na grafické rozhraní editovat

Open Inventor obsahuje knihovny komponent, které poskytují přístup k několika grafickým rozhraním:

  • SoQt zajišťuje propojení s grafickým rozhraním Qt.
  • SoWin zajišťuje propojení s MS Windows Win32 API.
  • SoXt zajišťuje propojení s X Window.
  • SoGtk zajišťuje propojení s GTK+.

Ukázková aplikace editovat

 
Screenshot z ukázkové aplikace.
 
Graf scény ukázkové aplikace.

Zdrojový kód editovat

#include <Inventor/Qt/SoQt.h>
#include <Inventor/Qt/SoQtRenderArea.h>
#include <Inventor/nodes/SoSphere.h>
#include <Inventor/nodes/SoCube.h>
#include <Inventor/nodes/SoDirectionalLight.h>
#include <Inventor/nodes/SoMaterial.h>
#include <Inventor/nodes/SoPerspectiveCamera.h>
#include <Inventor/nodes/SoTranslation.h>
#include <Inventor/nodes/SoRotationXYZ.h>
#include <Inventor/nodes/SoSeparator.h>
#include <Inventor/engines/SoElapsedTime.h>

int main(int , char **argv)
{

 /******************** Inicializace ********************/

 // Inicializace vykreslovaciho prostoru
 QWidget *window = SoQt::init(argv[0]);
 if (window == NULL) exit(1);

 // Vytvoreni root uzlu
 SoSeparator *root = new SoSeparator;
 root->ref();

 // Inicializace kamery
 SoPerspectiveCamera *camera = new SoPerspectiveCamera;
 root->addChild(camera);

 // Inicializace svetla
 root->addChild(new SoDirectionalLight);

 /******************** Koule ********************/
 
 // Material
 SoMaterial *sphereMaterial = new SoMaterial;
 sphereMaterial->diffuseColor.setValue(0.0, 0.0, 1.0);
 root->addChild(sphereMaterial);
 
 // Vytvoreni koule
 root->addChild(new SoSphere);
 
 /******************** Krychle ********************/

 // Vytvoreni noveho uzlu pro krychli
 SoSeparator *cubeNode = new SoSeparator;
 root->addChild(cubeNode);

 // Material
 SoMaterial *cubeMaterial = new SoMaterial;
 cubeMaterial->diffuseColor.setValue(1.0, 0.0, 0.0);
 cubeNode->addChild(cubeMaterial); 

 // Posun krychle od koule
 SoTranslation *cubeTranslation = new SoTranslation;
 cubeTranslation->translation.setValue(3.0,0.0,0.0);
 cubeNode->addChild(cubeTranslation);

 // Rotace kolem osy Y
 SoRotationXYZ *rotationY = new SoRotationXYZ;
 rotationY->axis = SoRotationXYZ::Y;
 cubeNode->addChild(rotationY);

 // Propojeni uhlu rotationY a casu behu aplikace
 SoElapsedTime *time = new SoElapsedTime;
 rotationY->angle.connectFrom(&time->timeOut);

 // Rotace X - predtoceni krychle
 SoRotationXYZ *rotationX = new SoRotationXYZ;
 rotationX->axis = SoRotationXYZ::X;
 rotationX->angle.setValue(1);
 cubeNode->addChild(rotationX);

 // Vytvoreni krychle
 cubeNode->addChild(new SoCube);

 /******************** Aplikace ********************/
 
 // Vytvoreni vykreslovaciho okna
 SoQtRenderArea *renderArea = new SoQtRenderArea(window);

 // Nastaveni kamery
 camera->viewAll(root, renderArea->getViewportRegion());

 // Nastaveni vykreslovaciho okna
 renderArea->setSceneGraph(root);
 renderArea->setTitle("Koule a rotujici krychle");
 renderArea->show();

 // Zobrazit okno a spustit hlavni smycku programu
 SoQt::show(window);
 SoQt::mainLoop();

 // Uvolneni zdroju
 delete renderArea;
 root->unref();

 return 0;
}

Parsovací sekvence obsahu scény editovat

  1. Nastav barvu na modrou.
  2. Vykresli kouli (bude modrá).
  3. Vlož stav na zásobník.
  4. Nastav barvu na červenou.
  5. Posuň aktuální pozici o +3 po ose x.
  6. Rotuj okolo osy Y o úhel rovný počtu sekund uběhlých od startu aplikace v radiánech.
  7. Rotuj okolo osy X o úhel +1 radián.
  8. Vykresli krychli (bude červená, posunutá o 3 po ose X, předtočená o 1 radián okolo osy X a rotující o 1 rad/s okolo osy Y).

Rozšíření editovat

Firma VSG poskytuje k Open Inventoru celou řadu rozšíření, které lze využít pro specifické potřeby.

Rozšíření umožňují přístup k moderním vizualizačním technikám, řeší správu velkého množství dat, škálovatelnost vykreslování v distribuovaném prostředí, vědecké vizualizace, realistické vykreslování a další.[4]

V současnosti jsou k dispozici následující oficiální rozšíření:

  • VolumeViz Extension - Slouží k interaktivní vizualizaci extrémně velkých objemů dat. Obsahuje podporu technik pro transformaci a spojování dat.
  • ScaleViz Extension - Implementuje distribuci renderování do clusterů a na více grafických karet, dlaždicové zobrazování a skládání obrazu, vzdálenou vizualizaci a další techniky pro dosažení co nejvyššího výkonu.
  • MeshViz Extension - Vysokoúrovňová komponenta pro vizualizaci dat. Slouží zejména pro vizualizaci vědeckých a průmyslových dat, fluidní dynamiky, návrhy vodních nádrží apod. Nabízí pokročilou vizualizaci vícerozměrných dat.
  • DirectViz Extension - Umožňuje vizualizaci fotorealistických scén pomocí raytracingu. Místo OpenGL je zde použito OpenRTRT pro raytracing v reálném čase.
  • HardCopy Extension - Umožňuje exportovat grafiku jako dokumenty ve formátu PDF-3D v několika vektorových formátech, například CGM, HPGL, PostScript a GDI/EMF. Na rozdíl od běžně vykreslené scény nejsou tyto formáty závislé na rozlišení, takže je možné využití například pro velkoformátový tisk.
  • Data Converter Extensions - Implementuje převod různých CAD/CAM formátů do souborových formátů Open Inventoru.

Využití editovat

Open Inventor je široce využíván zejména pro vědecké vizualizace, v medicíně, inženýrství a průmyslu, ale také pro vývoj počítačových her, protože je schopen pracovat s grafikou v reálném čase.

Budoucnost editovat

V srpnu 2012 bylo oznámeno odkoupení VSG společností FEI, která se zabývá vývojem elektronových mikroskopů pro práci s nanotechnologiemi v oblastech výzkumu elektroniky, přírodních věd, průmyslu atd. Zatím nelze odhadovat, jaký vliv může mít tato změna na Open Inventor, ale pravděpodobně lze očekávat ještě větší využití v oblasti výzkumu.[5]

Reference editovat

  1. Archivovaná kopie. prswww.essex.ac.uk [online]. [cit. 2012-10-30]. Dostupné v archivu pořízeném dne 2010-10-19. 
  2. WERNECKE, Josie . The Inventor Mentor: Programming Object-Oriented 3D Graphics with Open Inventor. Addison-Wesley Professional, 1994. ISBN 978-0-201-62495-3
  3. http://www.root.cz/clanky/open-inventor
  4. Archivovaná kopie. www.vsg3d.com [online]. [cit. 2012-10-30]. Dostupné v archivu pořízeném dne 2012-09-15. 
  5. Archivovaná kopie. investor.fei.com [online]. [cit. 2012-10-30]. Dostupné v archivu pořízeném dne 2012-08-08. 

Externí odkazy editovat