Схема OSG появляется только на одной стороне геометрии - PullRequest
0 голосов
/ 28 марта 2019

Я пытаюсь создать контур вокруг фрагмента 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 отбрасывает их фронтальные полисы , поэтому я попытался:

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

Но опять же, никакого эффекта. Интересно, что с помощью этого метода я могу отключить заднюю панель.

1 Ответ

1 голос
/ 28 марта 2019

Это сработало:

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; только задняя часть.


Кроме того, у меня возникла проблема, из-за которой контур исчезал, если смотреть прямо с фронтальной стороны. Я до сих пор не знаю, почему, но я изменил свой код "просмотр в лоб", чтобы немного сместить перспективу, чего достаточно, чтобы вернуть контур.

...