OpenSceneGraph: प्रबंध विंडोज और प्रदर्शन मोड

छवि

परिचय


हम पहले ही कह चुके हैं कि ओएसजी :: कैमरा वर्ग संबंधित ओपनगैल ग्राफिक्स संदर्भ का प्रबंधन करता है। ग्राफिक्स संदर्भ कैसे और कहाँ वस्तुओं को खींचा जाता है और किस राज्य की विशेषताओं को उनके लिए लागू किया जाता है, इसके बारे में जानकारी संलग्न करता है। संदर्भ को एक ग्राफिक विंडो के रूप में समझा जाता है, या इसके ग्राहक क्षेत्र या एक OpenGL पिक्सेल बफर के रूप में, जो पिक्सेल डेटा को फ्रेम बफर में स्थानांतरित किए बिना संग्रहीत करता है।

OSG एक सार ग्राफिक्स संदर्भ का प्रतिनिधित्व करने के लिए osg :: GraphicsContext वर्ग का उपयोग करता है, और एक सार ग्राफिक्स खिड़की का प्रतिनिधित्व करने के लिए osg :: GraphicsWindow वर्ग। बाद में GUI तत्वों से घटनाओं के प्रबंधन के लिए एक getEventQueue () विधि है। सामान्यतया, एक ग्राफिकल संदर्भ एक प्लेटफ़ॉर्म-विशिष्ट अवधारणा है, इसलिए OSG एक विंडो बनाने और ओपन संदर्भ के साथ इसके संदर्भ को जोड़ने के अधिकांश काम का ध्यान रखता है। जब आप createGraphicsContext () की विधि osg :: GraphicsContext () क्लास को कॉल करते हैं, तो आवश्यक कोड (और इसमें बहुत सारे हैं, मेरा विश्वास करो!) प्लेटफॉर्म के आधार पर प्रीप्रोसेसर द्वारा स्वतः उत्पन्न हो जाएगा। हम सभी की आवश्यकता है कि इस विधि को पास करने के लिए एक तर्क है osg :: GraphicsContex :: लक्षण प्रकार जिसमें हम जिस विंडो को प्राप्त करना चाहते हैं उसका विवरण है।

1. ऑसग क्लास :: डिस्प्लेसेटिंग्स


ओएसजी डेवलपर को वैश्विक प्रदर्शन सेटिंग्स का प्रबंधन करने की अनुमति देता है, जिसके आधार पर कैमरों, दर्शकों और दृश्य तत्वों का प्रतिपादन किया जाता है। इसके लिए, सिंगलटन पैटर्न का उपयोग किया जाता है, जो कि इन सेटिंग्स से युक्त एक अनोखी वस्तु है, जिसे ओएसजी :: डिस्प्लेसेटिंग क्लास के रूप में लागू किया जाता है, जिसे प्रोग्राम में कहीं से भी एक्सेस किया जा सकता है। इसलिए, हमारे आवेदन से, हम किसी भी समय इन सेटिंग्स को बदल सकते हैं।

osg::DisplaySettings *ds = osg::DisplaySettings::instance(); 

सिंगलटन osg :: DisplaySettings में नई बनाई गई रेंडरिंग डिवाइसों पर लागू होने वाली सेटिंग्स होती हैं, ग्राफिक्स विंडो का OpenGL संदर्भ। आप निम्न मापदंडों को भिन्न कर सकते हैं:

  1. setDoubleBuffer () - सक्षम करें / डबल बफरिंग अक्षम करें। डिफ़ॉल्ट रूप से सक्षम।
  2. setDepthBuffer () - गहराई बफ़र को सक्षम / अक्षम करें। डिफ़ॉल्ट रूप से सक्षम।
  3. SetMinimumNumAlphaBits () जैसे तरीकों का उपयोग करके अल्फा बफर, स्टैंसिल बफर, संचय बफर की चौड़ाई निर्धारित करें। डिफ़ॉल्ट रूप से, सभी पैरामीटर 0 हैं।
  4. एंटी-अलियासिंग और इसकी गहराई का उपयोग करने की अनुमति setNumMultiSamples () विधि का उपयोग कर। डिफ़ॉल्ट 0 है।
  5. स्टीरियो मोड चालू करें। डिफ़ॉल्ट रूप से बंद।

चौरसाई के उदाहरण पर इस सिंगलटन के उपयोग पर विचार करें

Osg सिंगलटन उदाहरण :: DisplaySettings
main.h

 #ifndef MAIN_H #define MAIN_H #include <osgDB/ReadFile> #include <osgViewer/Viewer> #endif 

main.cpp

 #include "main.h" int main(int argc, char *argv[]) { (void) argc; (void) argv; osg::DisplaySettings::instance()->setNumMultiSamples(6); osg::ref_ptr<osg::Node> model = osgDB::readNodeFile("../data/cessna.osg"); osgViewer::Viewer viewer; viewer.setSceneData(model.get()); return viewer.run(); } 


यहां जरूरी केवल एक चुनौती है।

 osg::DisplaySettings::instance()->setNumMultiSamples(6); 

- स्मूथिंग पैरामीटर सेट करना, जो उपयोग किए गए ग्राफिक डिवाइस के आधार पर मान 2, 4 और 6 ले सकता है। ध्यान दें कि स्मूदी लगाने के बिना सेसना स्क्रू ब्लेड कैसा दिखता है



और इसके आवेदन के बाद



2. विंडो मोड पर स्विच करें


ऑसगेव्यूअर :: दर्शक वर्ग को विंडो मोड में प्रदर्शित करने के लिए बहुत जल्दी पुन: कॉन्फ़िगर किया जा सकता है। जैसा कि आपने देखा, हमारे पिछले सभी उदाहरण पूर्ण स्क्रीन में प्रदर्शित किए गए थे। व्यूअर को विंडो मोड में स्विच करने के लिए, एक सेटअप व्यूइनविंडो () विधि है, जो विंडो के ऊपरी बाएं कोने के निर्देशांक, उसकी चौड़ाई और पिक्सल में ऊंचाई के रूप में पैरामीटर लेती है।

 viewer.setUpViewInWindow(50, 50, 800, 600); 

वैकल्पिक रूप से, यह विधि पांचवें पैरामीटर को स्वीकार करती है - स्क्रीन की संख्या जिस पर विंडो प्रदर्शित होनी चाहिए, यदि आपके पास एक से अधिक मॉनिटर हैं। निश्चित रूप से विंडोज में कई मॉनिटर के साथ काम करते हुए, आपने देखा कि यह दृश्य पूर्ण स्क्रीन मोड में सभी मॉनिटरों में फैलता है (यह लिनक्स में नहीं देखा गया है)।

इसके अलावा, प्रोजेक्ट सेटिंग्स में, आप इस तरह से पर्यावरण चर OSG_WINDOW सेट कर सकते हैं



जो कॉल करने के समतुल्य होगा setUpViewInWindow (), जिसे इस मामले में निष्पादित नहीं किया जा सकता है।



स्क्रीन को स्पष्ट रूप से निर्दिष्ट करने के लिए, जिस पर दर्शक को पूर्ण-स्क्रीन मोड में प्रदर्शित किया जाना चाहिए, आप स्क्रीन नंबर को एक पैरामीटर (डिफ़ॉल्ट रूप से 0) के रूप में निर्दिष्ट करके setUpViewOnSingleScreen () विधि का उपयोग कर सकते हैं।

OSG डेमो गोलाकार डिस्प्ले का भी समर्थन करता है। आप ऐसे डिस्प्ले पर डिस्प्ले को कस्टमाइज़ करने के लिए setUpViewFor3DSphericalDisplay () विधि का उपयोग कर सकते हैं।

3. समग्र दर्शक


OsgViewer :: दर्शक वर्ग एकल दृश्य ग्राफ को प्रदर्शित करने वाले एकल दृश्य को नियंत्रित करता है। इसके अतिरिक्त एक वर्ग है ऑसगवॉयर :: कम्पोजिटव्यूअर जो कई दृश्यों और कई दृश्यों का समर्थन करता है। इसमें रेंडरिंग प्रक्रिया को नियंत्रित करने के लिए एक ही रन (), फ्रेम () और किया गया () तरीके हैं, लेकिन यह आपको addView () और removeView () तरीकों का उपयोग करके स्वतंत्र विचार जोड़ने और हटाने की अनुमति देता है, साथ ही गेटवे विधि का उपयोग करके उनके सूचकांक द्वारा विचार प्राप्त करता है। ()। व्यू ऑब्जेक्ट को ऑस्गवॉकर :: व्यू क्लास द्वारा वर्णित किया गया है।

OsgViewer :: व्यू क्लास, osgViewer :: Viewer क्लास के लिए बेस क्लास है। यह आपको दृश्य डेटा, एक कैमरा मैनिप्युलेटर और ईवेंट हैंडलर के साथ रूट नोड जोड़ने की अनुमति देता है। इस वर्ग (दृश्य) और दर्शक वर्ग के बीच मुख्य अंतर यह है कि यह रन () या फ्रेम () कॉल के साथ दृश्य को प्रस्तुत करने की अनुमति नहीं देता है। परिदृश्य को जोड़ने वाला एक विशिष्ट दृश्य इस तरह दिखता है

 osgViewer::CompositeViewer multiviewer; multiviewer.addView( view ); 

समग्र दर्शक आपको विभिन्न कोणों में एक दृश्य को प्रदर्शित करने की अनुमति देता है, इन कोणों को विभिन्न खिड़कियों में प्रदर्शित करता है। यह आपको अलग-अलग खिड़कियों में स्वतंत्र दृश्यों को प्रदर्शित करने की भी अनुमति देता है। आइए समग्र दर्शक का उपयोग करने का एक सरल उदाहरण लिखें

समग्र उदाहरण
main.h

 #ifndef MAIN_H #define MAIN_H #include <osgDB/ReadFile> #include <osgViewer/CompositeViewer> #endif 

main.cpp

 #include "main.h" //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ osgViewer::View *createView(int x, int y, int w, int h, osg::Node *scene) { osg::ref_ptr<osgViewer::View> view = new osgViewer::View; view->setSceneData(scene); view->setUpViewInWindow(x, y, w, h); return view.release(); } //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ int main(int argc, char *argv[]) { (void) argc; (void) argv; osg::ref_ptr<osg::Node> model1 = osgDB::readNodeFile("../data/cessna.osg"); osg::ref_ptr<osg::Node> model2 = osgDB::readNodeFile("../data/cow.osg"); osg::ref_ptr<osg::Node> model3 = osgDB::readNodeFile("../data/glider.osg"); osgViewer::View *view1 = createView(50, 50, 320, 240, model1); osgViewer::View *view2 = createView(380, 50, 320, 240, model2); osgViewer::View *view3 = createView(185, 330, 320, 240, model3); osgViewer::CompositeViewer viewer; viewer.addView(view1); viewer.addView(view2); viewer.addView(view3); return viewer.run(); } 


हम एक फ़ंक्शन में एक अलग दृश्य के निर्माण को जगह देंगे जो कि खिड़की की स्थिति और आकार के मापदंडों के साथ-साथ दृश्य को इसके मूल नोड के लिए एक संकेतक के रूप में लेता है।

 osgViewer::View *createView(int x, int y, int w, int h, osg::Node *scene) { osg::ref_ptr<osgViewer::View> view = new osgViewer::View; view->setSceneData(scene); view->setUpViewInWindow(x, y, w, h); return view.release(); } 

यहाँ हम एक स्मार्ट पॉइंटर द्वारा नियंत्रित एक व्यू को एक ऑस्गवॉयर :: व्यू ऑब्जेक्ट में बनाते हैं

 osg::ref_ptr<osgViewer::View> view = new osgViewer::View; 

निर्दिष्ट स्थान और आकार के साथ विंडो में प्रदर्शित दृश्य और विंडो डिस्प्ले मोड का डेटा सेट करें

 view->setSceneData(scene); view->setUpViewInWindow(x, y, w, h); 

हम स्मार्ट पॉइंटर्स को वापस करने के नियमों के अनुसार फ़ंक्शन से दृश्य वापस करते हैं

 return view.release(); 

अब मुख्य कार्यक्रम में हम तीन अलग-अलग मॉडल लोड करते हैं

 osgViewer::View *view1 = createView(50, 50, 320, 240, model1); osgViewer::View *view2 = createView(380, 50, 320, 240, model2); osgViewer::View *view3 = createView(185, 330, 320, 240, model3); 

तीन अलग-अलग प्रकार बनाएं

 osgViewer::View *view1 = createView(50, 50, 320, 240, model1); osgViewer::View *view2 = createView(380, 50, 320, 240, model2); osgViewer::View *view3 = createView(185, 330, 320, 240, model3); 

एक समग्र दर्शक बनाएं और इसमें पहले से बनाए गए दृश्य जोड़ें

 osgViewer::CompositeViewer viewer; viewer.addView(view1); viewer.addView(view2); viewer.addView(view3); 

और रेंडरिंग ठीक उसी तरह से चलाएं जैसे हमने एक सीन के मामले में किया था

 return viewer.run(); 

वह सब है! जब कार्यक्रम शुरू होता है, तो हमें तीन अलग-अलग खिड़कियां मिलती हैं। प्रत्येक विंडो की सामग्री को स्वतंत्र रूप से नियंत्रित किया जा सकता है। किसी भी विंडो को मानक तरीके से बंद किया जा सकता है, और Esc दबाकर एप्लिकेशन से पूरी तरह से बाहर निकल सकते हैं।



3. osg :: GraphicsContext :: लक्षण वर्ग


अंग्रेजी से अनुवाद में "लक्षण" शब्द का अर्थ है "सुविधाएँ"। तो, उपर्युक्त वर्ग भविष्य की खिड़की की विशेषताओं का वर्णन करता है, और इसमें ग्राफिक संदर्भ का वर्णन करने के लिए सभी गुण शामिल हैं। यह osg :: DisplaySettings वर्ग से भिन्न है, जो नव निर्मित कैमरों के लिए सभी ग्राफिक्स संदर्भों की विशेषताओं को नियंत्रित करता है। इस वर्ग के मुख्य सार्वजनिक गुणों को नीचे दी गई तालिका में सूचीबद्ध किया गया है।

वर्ग विशेषताटाइपडिफ़ॉल्ट मानविवरण
एक्सपूर्णांक0खिड़की की प्रारंभिक क्षैतिज स्थिति
yपूर्णांक0खिड़की की प्रारंभिक ऊर्ध्वाधर स्थिति
चौड़ाईपूर्णांक0खिड़की की चौड़ाई
ऊंचाईपूर्णांक0खिड़की की ऊंचाई
windowNameएसटीडी :: स्ट्रिंग""खिड़की का शीर्षक
windowDecorationboolझूठाविंडो शीर्षक प्रदर्शन ध्वज
लालअहस्ताक्षरित int8OpenGL रंग बफर में लाल रंग के बिट्स की संख्या
ग्रीनअहस्ताक्षरित int8OpenGL रंग बफर में हरे रंग के बिट्स की संख्या
नीलाअहस्ताक्षरित int8OpenGL रंग बफर में नीले रंग के बिट्स की संख्या
अल्फाअहस्ताक्षरित int8OpenGL अल्फा बफर में बिट्स की संख्या
गहराईअहस्ताक्षरित int24OpenGL गहराई बफर में बिट्स की संख्या
स्टैंसिलअहस्ताक्षरित int0OpenGL स्टैंसिल बफर में बिट्स की संख्या
doubleBufferboolझूठाडबल बफर का उपयोग करें
नमूनेअहस्ताक्षरित int0आदिम चौरसाई संख्या
quadBufferStereoboolझूठाक्वाड स्टीरियो बफर (NVidia उपकरण के लिए) का उपयोग करें
inheritedWindowDataओस :: :: ref_ptrशून्यविंडो से जुड़ा डेटा डिस्क्रिप्टर

ट्रैट्स ऑब्जेक्ट को इनिशियलाइज़ करने के लिए, निम्न कोड को निष्पादित करें

 osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits; traits->x = 50; traits->y = 100; ... 

4. OSG एप्लिकेशन विंडो सेट करें


निर्दिष्ट विशेषताओं के साथ एक विंडो बनाने के लिए, आपको निम्न चरण करने होंगे:

  1. एक प्रकार की वस्तु कॉन्फ़िगर करें osg :: GraphicsContext :: लक्षण
  2. एक ग्राफिकल विंडो संदर्भ बनाएँ
  3. इस ग्राफिक्स संदर्भ को कैमरे से लिंक करें
  4. कैमरे को मुख्य दर्शक बनाएं

लक्षण उदाहरण
main.h

 #ifndef MAIN_H #define MAIN_H #include <osg/GraphicsContext> #include <osgDB/ReadFile> #include <osgViewer/Viewer> #endif 

main.cpp

 #include "main.h" int main(int argc, char *argv[]) { (void) argc; (void) argv; osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits; traits->x = 50; traits->y = 50; traits->width = 800; traits->height = 600; traits->windowName = "OSG application"; traits->windowDecoration = true; traits->doubleBuffer = true; traits->samples = 4; osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get()); osg::ref_ptr<osg::Camera> camera = new osg::Camera; camera->setGraphicsContext(gc); camera->setViewport( new osg::Viewport(0, 0, traits->width, traits->height) ); camera->setClearMask(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); camera->setClearColor( osg::Vec4(0.2f, 0.2f, 0.4f, 1.0f) ); double aspect = static_cast<double>(traits->width) / static_cast<double>(traits->height); camera->setProjectionMatrixAsPerspective(30.0, aspect, 1.0, 1000.0); camera->getOrCreateStateSet()->setMode(GL_DEPTH_TEST, osg::StateAttribute::ON); osg::ref_ptr<osg::Node> root = osgDB::readNodeFile("../data/cessna.osg"); osgViewer::Viewer viewer; viewer.setCamera(camera.get()); viewer.setSceneData(root.get()); return viewer.run(); } 


विंडो प्राथमिकताएँ सेट करने के लिए, osg का एक उदाहरण बनाएँ :: GraphicsContext :: लक्षण वर्ग और इसे उन मापदंडों से आरम्भ करें जिनकी हमें आवश्यकता है

 osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits; traits->x = 50; traits->y = 50; traits->width = 800; traits->height = 600; traits->windowName = "OSG application"; traits->windowDecoration = true; traits->doubleBuffer = true; traits->samples = 4; 

उसके बाद, हम सेटिंग्स के रूप में लक्षण के लिए एक पॉइंटर पास करके एक ग्राफिकल संदर्भ बनाते हैं

 osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get()); 

एक कैमरा बनाएँ

 osg::ref_ptr<osg::Camera> camera = new osg::Camera; 

हम कैमरे को बनाए गए ग्राफिक संदर्भ के साथ जोड़ते हैं

 camera->setGraphicsContext(gc); 

व्यूपोर्ट सेट करें, बफर सफाई मास्क सेट करें, सफाई रंग सेट करें

 camera->setViewport( new osg::Viewport(0, 0, traits->width, traits->height) ); camera->setClearMask(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); camera->setClearColor( osg::Vec4(0.2f, 0.2f, 0.4f, 1.0f) ); 

एक परिप्रेक्ष्य प्रक्षेपण मैट्रिक्स सेट करें

 double aspect = static_cast<double>(traits->width) / static_cast<double>(traits->height); camera->setProjectionMatrixAsPerspective(30.0, aspect, 1.0, 1000.0); 

चेहरों के सही प्रदर्शन के लिए, गहराई परीक्षण सक्षम करना न भूलें

 camera->getOrCreateStateSet()->setMode(GL_DEPTH_TEST, osg::StateAttribute::ON); 

लोड हो रहा है विमान मॉडल

 osg::ref_ptr<osg::Node> root = osgDB::readNodeFile("../data/cessna.osg"); 

हम दर्शक को कॉन्फ़िगर और लॉन्च करते हैं, यह दर्शाता है कि हमने मुख्य कैमरे की गुणवत्ता में जो कैमरा कॉन्फ़िगर किया है

 osgViewer::Viewer viewer; viewer.setCamera(camera.get()); viewer.setSceneData(root.get()); return viewer.run(); 

बाहर निकलने पर हमारे पास आवश्यक मापदंडों के साथ एक खिड़की है



विंडो शीर्षक प्रदर्शित नहीं किया गया है क्योंकि यह फ़ंक्शन मेरे विंडो मैनेजर की सेटिंग में अक्षम है। यदि आप विभिन्न सेटिंग्स के साथ विंडोज या लिनक्स पर उदाहरण चलाते हैं, तो हेडर अपनी जगह पर होगा।

जारी रखने के लिए ...

Source: https://habr.com/ru/post/hi437764/


All Articles