如何从文件中预加载3D模型并在OSG中多次使用?

时间:2014-12-13 23:38:22

标签: c++ 3d openscenegraph

是否有办法使用osgDB预加载静态3D模型文件,然后在场景中多次使用相同的模型,而不必复制osg::Node也不加载文件一次再次?

理想情况是模型数据可以存储在osg::ref_ptr指向的类中,然后在表示场景中对象的节点之间重新分配。

2 个答案:

答案 0 :(得分:0)

只需将osg :: Group或其某些子类的实例放在您希望节点位于场景中的位置,然后将addChild(node)调用到组中。

通常,我使用的Group子类是osg :: PositionAttitudeTransform或osg :: MatrixTransform,因此我也可以对它们应用转换。

-hope有帮助 -

答案 1 :(得分:0)

使用osg :: Node,您可以使用clone方法并定义在克隆过程中在对象之间复制哪些数据。 看一下示例代码:

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));

使用clone方法和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;
}

在我的应用程序中,模型的数量非常少,而且我不得不进行深层复制。 希望它有所帮助。