osg::Geometry 对象拆分成多个 osg::Geometry 对象
时间: 2023-08-13 21:07:39 浏览: 172
同一个osg::Geometry或osg::Geode或osg::Group对象 在不同的位置 用不同的颜色 大小 角度绘制
将一个 `osg::Geometry` 对象拆分成多个 `osg::Geometry` 对象,可以通过以下步骤实现:
1. 遍历原始 `osg::Geometry` 对象的 `osg::PrimitiveSet`,并将其中不同类型的 `PrimitiveSet` 分别存储到不同的 `osg::PrimitiveSet` 容器中(如 `osg::DrawArrays` 存储到 `osg::DrawArrays` 容器中,`osg::DrawElementsUInt` 存储到 `osg::DrawElementsUInt` 容器中等等)。
2. 遍历存储不同类型的 `PrimitiveSet` 的容器,根据每个容器中存储的 `PrimitiveSet` 创建对应的 `osg::Geometry` 对象,并将这些 `osg::Geometry` 对象添加到场景图中。
以下是一个示例代码,可以将一个 `osg::Geometry` 对象拆分成多个 `osg::Geometry` 对象:
```cpp
osg::ref_ptr<osg::Geometry> originalGeometry = ...;
// 定义不同类型的 PrimitiveSet 容器
std::vector<osg::ref_ptr<osg::DrawArrays>> drawArraysList;
std::vector<osg::ref_ptr<osg::DrawElementsUInt>> drawElementsList;
// 遍历原始 Geometry 对象的 PrimitiveSet,将不同类型的 PrimitiveSet 存储到不同容器中
for (unsigned int i = 0; i < originalGeometry->getNumPrimitiveSets(); ++i)
{
osg::PrimitiveSet* primitiveSet = originalGeometry->getPrimitiveSet(i);
if (primitiveSet->getType() == osg::PrimitiveSet::DrawArraysPrimitiveType)
{
drawArraysList.push_back(static_cast<osg::DrawArrays*>(primitiveSet));
}
else if (primitiveSet->getType() == osg::PrimitiveSet::DrawElementsUIntPrimitiveType)
{
drawElementsList.push_back(static_cast<osg::DrawElementsUInt*>(primitiveSet));
}
}
// 创建多个 Geometry 对象,并将它们添加到场景图中
osg::ref_ptr<osg::Group> group = new osg::Group;
for (unsigned int i = 0; i < drawArraysList.size(); ++i)
{
osg::ref_ptr<osg::Geometry> newGeometry = new osg::Geometry;
newGeometry->addPrimitiveSet(drawArraysList[i].get());
group->addChild(newGeometry);
}
for (unsigned int i = 0; i < drawElementsList.size(); ++i)
{
osg::ref_ptr<osg::Geometry> newGeometry = new osg::Geometry;
newGeometry->addPrimitiveSet(drawElementsList[i].get());
group->addChild(newGeometry);
}
```
请注意,这只是一个简单的示例代码,实际应用中可能需要更多的逻辑处理。
阅读全文