OSG轮廓仅出现在几何体的一侧

时间:2019-03-28 12:29:01

标签: openscenegraph

我正在尝试在场景中的2D几何图形周围显示轮廓。轮廓仅出现在几何体的一侧,我希望它同时出现在两侧。我假设需要指定一个设置,但是对于OSG来说是新手,我不知道这可能是什么。我也无法从文档或在线示例中识别出来。

几何形状基本上是一个平面,由一堆较小的平面组成,这些平面的茎杆从一侧伸出。

enter image description here

What I currently have

What I currently have

// Initialize an outline
osg::ref_ptr<osgFX::Outline> vCellOutline = new osgFX::Outline;
mModel3D->addChild(vCellOutline); // Add it as a child of the grid so it appears in the scene
vCellOutline->setWidth(8); // Set some stuff so it appears
vCellOutline->setColor(osg::Vec4(1, 1, 0, 1));
osg::ref_ptr<osg::StateSet> vOutlineState = vCellOutline->getOrCreateStateSet();
vOutlineState->setMode(GL_LIGHTING, osg::StateAttribute::PROTECTED | osg::StateAttribute::ON);

// Add the cell as a child of the outline
vCellOutline->addChild(vCellGeode);

我尝试增加宽度,因为我认为可能没有显示出来,但这没什么区别。当照相机从“侧面”透视图查看几何图形时,轮廓消失。

我做了一些谷歌搜索,并尝试了各种事情,例如分配一个双面照明模型(以防无法正确照明),尝试通过例如禁用剔除。

vOutlineState->setMode(GL_CULL_FACE, osg::StateAttribute::OFF);
vCellOutline->setCullingActive(false);

但是那什么也没做。我以为我在默认情况下看到osg Outlines cull their front-facing polys时就找到了解决方案,所以我尝试了:

osg::ref_ptr<osg::CullFace> cf = new osg::CullFace;
cf->setMode(osg::CullFace::FRONT);
vOutlineState->setAttributeAndModes(cf, osg::StateAttribute::OFF | osg::StateAttribute::OVERRIDE);

但同样,没有效果。有趣的是,我可以使用这种方法关闭背面的多边形。

1 个答案:

答案 0 :(得分:1)

这样做有效:

osg::ref_ptr<osg::CullFace> cf = new osg::CullFace;
cf->setMode(osg::CullFace::FRONT);
vOutlineState->setAttributeAndModes(cf, osg::StateAttribute::OFF | osg::StateAttribute::OVERRIDE);

并且:

osg::ref_ptr<osg::PolygonMode> polyMode = new osg::PolygonMode;
polyMode->setMode(osg::PolygonMode::FRONT, osg::PolygonMode::LINE);
vOutlineState->setAttributeAndModes(polyMode, osg::StateAttribute::ON | osg::StateAttribute::OVERRIDE);

我猜是因为没有在Outline类中显式设置前端内容;只有背面的东西。


顺便说一句,然后我遇到一个问题,即从正面直接正面看时轮廓会消失。我仍然不知道为什么,但是我更改了“正面视图”代码以稍微偏移透视图,这足以使轮廓恢复原状。