Как скрыть модель osgEarth :: ModelLayer, если расстояние превышает некоторое значение?

Я пытаюсь отобразить метки из файла модели, и osgearth_features Демо показывает, как это сделать. Это прекрасно работает для меня, но мне нужно, чтобы метки исчезли, как только расстояние до Земли превысит какое-то значение. (Я использую версию 25ce0e1 от osgEarth.)

Я знаю что есть PagedLOD, который помог бы мне с сокрытием osg::Node, Но то, что у меня есть, osgEarth::ModelLayerи я не могу найти разумный способ вставить PagedLOD между MapNode и мои ярлыки Node,

Мой нынешний подход, хотя и осуществимый, несколько хакерский. Вот экспериментальное изменение оригинального осгеарта osgearth_features.cpp делать то, что мне нужно:

diff --git a/src/applications/osgearth_features/osgearth_features.cpp b/src/applications/osgearth_features/osgearth_features.cpp
index 2bb1ed8..fbdd3da 100644
--- a/src/applications/osgearth_features/osgearth_features.cpp
+++ b/src/applications/osgearth_features/osgearth_features.cpp
@@ -184,6 +184,12 @@ int main(int argc, char** argv)
geomOptions.styles()->addStyle( labelStyle );

map->addModelLayer( new ModelLayer("labels", geomOptions) );
+        osg::Group*const modelLayerGroup=mapNode->getModelLayerGroup();
+        const int newNumChildren=modelLayerGroup->getNumChildren();
+        osg::Node*const model=modelLayerGroup->getChild(newNumChildren-1);
+        osg::PagedLOD*const lod=new osg::PagedLOD;
+        modelLayerGroup->replaceChild(model,lod);
+        lod->addChild(model, 0, 1e7);
}

if ( !useStencil )

Эта замена узлов кажется мне слишком уродливой. Какой лучший, «правильный» способ достижения моей цели? Или так должно быть сделано?

0

Решение

Возможно, вы могли бы написать псевдо-загрузчик с пользовательским расширением файла, которое вы используете для переноса имен файлов вашей реальной модели (например, mymodel.obj.plod), который затем «загружает» и перезапускает osgEarth PagedLOD в граф с «реальным» путь модели в дочерних атрибутах PageLOD.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]