2014-12-13 3 views
0

Есть ли способ загрузить файл статической 3D-модели с использованием osgDB, а затем использовать одну и ту же модель несколько раз в сцене, не перепутывая osg::Node и не загружая файл еще раз?Как предварительно загрузить 3D-модель из файла и использовать ее несколько раз в OSG?

Идеальная ситуация была бы, если данные модели могли быть сохранены в классе, на который указывает osg::ref_ptr, который затем будет перераспределен между узлами, представляющими объект в сцене.

+0

«osg :: Node» наследуется от osg :: Referenced, поэтому подсчитывается ссылка. Просто загрузите его один раз в начале вашей программы, сохраните его как osg :: ref_ptr где-нибудь и используйте его всякий раз, когда вам нравится (под другими узлами преобразования); не будет дублирования модели, так как вы всегда будете использовать один и тот же экземпляр, и вам не придется снова загружать его. –

+0

osgDB :: Registry поддерживает кэширование загруженных файлов моделей - и различные уровни, геометрию, текстуры и т. Д. Просто передайте флаги реестра в osgDB :: readNodeFile (или другие функции загрузчика osgDB). Одна из «новых» особенностей этого метода (это было внедрено где-то в эпоху osg 2.x) - это возможность написать собственный обратный вызов для читателя, чтобы вы могли настраивать стандартные вызовы с помощью своей собственной системы, если вы не хотите использовать реализацию реестра по умолчанию. – iminyourbrain

ответ

0

Просто поместите osg :: Group или экземпляры некоторого подкласса, где вы хотите, чтобы узел находился в вашей сцене, и вызовите addChild (node) в группы.

Обычно подкласс класса, который я использовал бы, был бы osg :: PositionAttitudeTransform или osg :: MatrixTransform, так что я мог бы применить к ним преобразование.

-hope что helps-

0

Использование OSG :: Node вы можете использовать метод клонирования и определить, какие данные копируются между объектом в процессе клонирования. Посмотрите на пример кода:

osg::ref_ptr<osg::Group> root = new osg::Group; 
osg::ref_ptr<osg::Node> n = osgDB::readNodeFile(fn); 
// n2 will be deep copy of n - all data of n will be copied to n2 
osg::ref_ptr<osg::Node> n2 = dynamic_cast<osg::Node*>(n->clone(osg::CopyOp::DEEP_COPY_ALL)); 
// n3 will be shallow copy of n - all possible data will be shared between n3 and n 
osg::ref_ptr<osg::Node> n3 = dynamic_cast<osg::Node*>(n->clone(osg::CopyOp::SHALLOW_COPY)); 

Использование метода клонирования и copyOp перечисление можно легко определить, какие данные совместно и которая копируется. Подробнее можно найти здесь OSG Documentation.

Я не нашел никаких вариантов предзагрузки для osgDB, но она может быть легко реализовано так:

class GraphFilesManager { 
    static osg::Node* GraphFilesManager::readNodeFile(std::string file) 
    { 
     bool wasLoaded = false; 
     for (int i=0; i < loadedNodefilenames.size(); i++) 
     { 
     if (file.compare (loadedNodefilenames[i])==0) 
      { 
       osg::Node* newNode = dynamic_cast<osg::Node*>(loadedNode[i]->clone(osg::CopyOp::DEEP_COPY_NODES)); 
       return newNode; 
      } 
     } 
     osg::Node* newNode = osgDB::readNodeFile(file); 
     if (newNode) 
     { 
      loadedNode.push_back(newNode); 
      loadedNodefilenames.push_back(file); 
     } 
     return newNode; 
    } 
    static std::vector <osg::Node*> loadedNode; 
    static std::vector <std::string> loadedNodefilenames; 
} 

В моем номере приложения моделей является очень низким, и я должен был сделать глубокую копию. Надеюсь, это помогло.

+0

И какая разница между «клонированием» и «копированием»? Операция запрашивает способ не копировать узел. Однако ваш погрузчик, похоже, выполняет соответствующую работу. –

 Смежные вопросы

  • Нет связанных вопросов^_^