是否有办法使用osgDB
预加载静态3D模型文件,然后在场景中多次使用相同的模型,而不必复制osg::Node
也不加载文件一次再次?
理想情况是模型数据可以存储在osg::ref_ptr
指向的类中,然后在表示场景中对象的节点之间重新分配。
答案 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;
}
在我的应用程序中,模型的数量非常少,而且我不得不进行深层复制。 希望它有所帮助。