Когда камера направлена перпендикулярно поперечному сечению, края ни коробки, ни цилиндра не видно. Мне приходится перемещать камеру под некоторым углом, чтобы края были видны. В конечном итоге я хочу переместить камеру по длине коробки и сделать последовательные снимки под этим прямым углом, чтобы визуализировать поперечные сечения в последовательных местах, поэтому мне нужно, чтобы края коробки и цилиндра четко выделялись. .
Я пробовал установить толщину и цвет линии, но это не решило мою проблему.
Другие вещи, которые я пробовал:
Я пробовал:
Я пробовал:
p>
- Добавление освещения под разными углами
- Удаление обратного отсечения
- Включение каркасного режима для краев
- Использование Scribe
- Использование эффекта osgFX::Outline
Еще одна идея заключалась в том, чтобы наполнить цилиндр туманом, чтобы получить эффект, и «наполнить» его чем-то, что можно было просмотреть в обрезанном виде. Однако у меня это не сработало (возможно, я неправильно реализовал туман). Мне также понадобятся два разных цвета/плотности тумана, чтобы различать коробку и цилиндр, и я не уверен, что это сработает.
Ниже приведен простой пример того, что я делаю. работаю дальше. Если вы запустите эту программу, то увидите, что края коробки и цилиндра совершенно невидимы, пока не будет изменено положение камеры.
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
const float BOX_LENGTH = 240.0;
const float BOX_HEIGHT = 20.0;
const float BOX_WIDTH = 16.0;
const float CYL_RADIUS = 0.5;
const float CAMERA_Y = -1.0 * BOX_LENGTH/2; //Where to start the camera
const float CAMERA_TO_CLIP = 100.0; //Distance from camera to clip plane
const float SLICE_THICKNESS = 0.1; //The thickness of our slice
const int WIDTH = 600; //Image dimensions
const int HEIGHT = 600;
const osg::Vec4 WHITE(1.0f, 1.0f, 1.0f, 1.0f);
int main(int argc, char** argv)
{
//Create the box
osg::ref_ptr box = new osg::Box(osg::Vec3(0, 0, 0), BOX_WIDTH, BOX_LENGTH, BOX_HEIGHT);
osg::ref_ptr boxDrawable = new osg::ShapeDrawable(box);
osg::ref_ptr boxGeode = new osg::Geode();
boxGeode->addDrawable(boxDrawable);
//Create the cylinder
osg::ref_ptr cylinder = new osg::Cylinder(osg::Vec3(0, 0, 0), CYL_RADIUS, BOX_LENGTH);
osg::ref_ptr cylinderDrawable = new osg::ShapeDrawable(cylinder);
osg::ref_ptr cylinderGeode = new osg::Geode();
cylinderGeode->addDrawable(cylinderDrawable);
//...and set the Line Width and Color
osg::ref_ptr stateSet = cylinderGeode->getOrCreateStateSet();
osg::ref_ptr lineWidth = new osg::LineWidth(3.0f); // Adjust line width
stateSet->setAttributeAndModes(lineWidth, osg::StateAttribute::ON);
osg::ref_ptr material = new osg::Material;
material->setDiffuse(osg::Material::FRONT_AND_BACK, WHITE);
stateSet->setAttributeAndModes(material, osg::StateAttribute::ON);
//Put the cylinder in the box
osg::ref_ptr cylinderTransform = new osg::PositionAttitudeTransform();
cylinderTransform->setPosition(osg::Vec3(0, 0, 0));
cylinderTransform->setAttitude(osg::Quat(osg::DegreesToRadians(90.0f), osg::Vec3(1, 0, 0))); // Rotate 90 degrees on x-axis
cylinderTransform->addChild(cylinderGeode);
osg::ref_ptr model = new osg::Group();
model->addChild(boxGeode);
model->addChild(cylinderTransform);
//Set up the View and viewer
osg::ref_ptr view = new osgViewer::View;
view->setUpViewInWindow( 0, 0, WIDTH, HEIGHT );
view->getCamera()->setViewport(new osg::Viewport(0, 0, WIDTH, HEIGHT));
osgViewer::CompositeViewer viewer;
viewer.addView(view);
//Set up the manipulator so we can move the camera
osg::ref_ptr cameraManip(new osgGA::TrackballManipulator());
view->setCameraManipulator(cameraManip.get());
//Set up where our camera is looking
float camera_pos_y = CAMERA_Y;
float center_pt_y = camera_pos_y + CAMERA_TO_CLIP;
osg::Vec3d eye(0.0, camera_pos_y, 0.0);
osg::Vec3d center(0, center_pt_y, 0);
osg::Vec3d up(0, 0, 1);
cameraManip->setHomePosition(eye, center, up);
cameraManip->home(0.0);
//Create a clipping plane through the middle of the model in the x-z plane
float y_side1 = 1.0; //Clip everything to the left (keep everything to the right)
float y_side2 = -1.0; //Clip everything to the right (keep everything to the left)
float y_offset1 = -1.0 * center_pt_y;
float y_offset2 = center_pt_y + SLICE_THICKNESS;
osg::ref_ptr clipPlane1 = new osg::ClipPlane(0, 0.0, y_side1, 0.0, y_offset1);
osg::ref_ptr clipPlane2 = new osg::ClipPlane(1, 0.0, y_side2, 0.0, y_offset2);
//Attach the clipping planes
osg::ref_ptr clipNode = new osg::ClipNode();
clipNode->addClipPlane(clipPlane1);
clipNode->addClipPlane(clipPlane2);
clipNode->addChild(model);
//Root node
osg::ref_ptr root(new osg::Group);
root->addChild(clipNode);
//Ensure the clipping plane is enabled
root->getOrCreateStateSet()->setMode(GL_CLIP_PLANE0, osg::StateAttribute::ON);
root->getOrCreateStateSet()->setMode(GL_CLIP_PLANE1, osg::StateAttribute::ON);
view->setSceneData(root);
viewer.run();
return 0;
}
Подробнее здесь: https://stackoverflow.com/questions/789 ... -see-edges
Мобильная версия