如何从文件预加载 3D 模型并在 OSG 中多次使用它
How to pre-load a 3D model from file and use it multiple times in OSG?
有没有办法使用 osgDB
预加载静态 3D 模型文件,然后在场景中多次使用相同的模型,而不必复制osg::Node
也不必再次加载文件?
理想的情况是,如果模型数据可以存储在由osg::ref_ptr
指向的类中,然后该类将在表示场景中对象的节点之间重新分配。
只需将osg::Group的实例或它的某个子类的实例放在您希望节点位于场景中的位置,然后将addChild(node)调用到组中。
通常,我使用的 Group 子类是 osg::P ositionAttitudeTransform 或 osg::MatrixTransform,这样我也可以对它们应用变换。
-希望有帮助-
使用 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 文档。
我还没有找到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;
}
在我的应用程序中,模型数量很少,我不得不进行深度复制。希望它有帮助。
相关文章:
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 如何使用ndk-build.cmd构建Android.so文件
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 读取文件并输入到矢量中
- 在C++中查找文件
- c++库的公共头文件中应该包含什么
- 用c++从输入文件中读取另一行
- Cppcheck生成xml转储文件
- 读取文件的最后一行并输入到链接列表时出错
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 如何将内容数组写入文本文件?
- 如何从文件预加载 3D 模型并在 OSG 中多次使用它