Используйте две плоскости отсечения, чтобы создать срез и четко видеть края.C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Используйте две плоскости отсечения, чтобы создать срез и четко видеть края.

Сообщение Anonymous »

В проекте OpenSceneGraph у меня есть коробка с цилиндром внутри. Я пропускаю 2 плоскости отсечения через модель «коробка + цилиндр», каждая плоскость обращена в противоположном направлении. В результате получается поперечный разрез коробки. Я размещаю камеру на некотором расстоянии и смотрю на нее в направлении среза, чтобы увидеть поперечное сечение модели.
Когда камера направлена ​​перпендикулярно поперечному сечению, края ни коробки, ни цилиндра не видно. Мне приходится перемещать камеру под некоторым углом, чтобы края были видны. В конечном итоге я хочу переместить камеру по длине коробки и сделать последовательные снимки под этим прямым углом, чтобы визуализировать поперечные сечения в последовательных местах, поэтому мне нужно, чтобы края коробки и цилиндра четко выделялись. .
Я пробовал установить толщину и цвет линии, но это не решило мою проблему.
Другие вещи, которые я пробовал:
Я пробовал:
Я пробовал:
p>
  • Добавление освещения под разными углами
  • Удаление обратного отсечения
  • Включение каркасного режима для краев
  • Использование Scribe
  • Использование эффекта osgFX::Outline
Каркас и писец имеют некоторое преимущество, но оно не очень хорошее (некоторые пиксели). 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»