很高兴在雪易的CSDN遇见你
VTK技术爱好者 QQ:870202403
前言
本文分享Example中Visualization模块中的Arbitrary3DCursor样例,主要解析vtkProbefileter,希望对各位小伙伴有所帮助!
感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步!
你的点赞就是我的动力(^U^)ノ~YO
1. vtkProbeFilter
在指定的点位置采样数据值。
vtkProbeFilter是一个过滤器,在指定的点位置计算点属性(例如,标量,向量等)。过滤器有两个输入: Input和Source。输入的几何结构通过过滤器。输入点位置的Point属性通过插值到Source数据。例如:我们可以通过Volume(Source数据)计算平面上的数据值(平面指定为输入)。Source数据中的Cell数据根据每个输入点所在的源单元格复制到输出。如果在源的点数据和单元数据中都存在同名的数组,则只探测来自点数据的数组。
此过滤器可用于重新采样数据,或将一个数据集表单转换为另一个数据集表单。例如,一个非结构化网格(vtkUnstructuredGrid)可以用一个体(三维vtkImageData)来探测,然后体渲染技术可以用来可视化结果。另一个例子:一条线或曲线可以用来探测数据,从而沿着这条线或曲线生成x-y图。
2. 应用示例
// This does the actual work: updates the probe.
// Callback for the interaction
class vtkmyPWCallback : public vtkCommand
{
public:vtkmyPWCallback() = default;static vtkmyPWCallback* New(){return new vtkmyPWCallback;}virtual void Execute(vtkObject* caller, unsigned long, void*){vtkPointWidget* pointWidget = reinterpret_cast<vtkPointWidget*>(caller);pointWidget->GetPolyData(this->PolyData);double position[3];pointWidget->GetPosition(position);std::ostringstream text;text << "cursor: " << std::fixed << std::setprecision(4) << position[0]<< ", " << position[1] << ", " << position[2];this->PositionActor->SetInput(text.str().c_str());this->CursorActor->VisibilityOn();}vtkPolyData* PolyData = nullptr;vtkActor* CursorActor = nullptr;vtkTextActor* PositionActor = nullptr;
};void QtWidgetsApplication1::on_arbitrary3DCursorAct_triggered()
{vtkSmartPointer<vtkPolyData> inputPolyData;auto line = vtkSmartPointer<vtkLineSource>::New();line->SetResolution(2);line->SetPoint1(0., 0., 0.);line->SetPoint2(10, 0, 0);line->Update();inputPolyData = line->GetOutput();/*auto plane = vtkSmartPointer<vtkPlaneSource>::New();plane->Update();inputPolyData = plane->GetOutput();*//*auto sphereSource =vtkSmartPointer<vtkSphereSource>::New();sphereSource->SetPhiResolution(15);sphereSource->SetThetaResolution(15);sphereSource->Update();inputPolyData = sphereSource->GetOutput();*/auto colors =vtkSmartPointer<vtkNamedColors>::New();auto point =vtkSmartPointer<vtkPolyData>::New();auto probe =vtkSmartPointer<vtkProbeFilter>::New();probe->SetInputData(point);probe->SetSourceData(inputPolyData);// create glyphauto cone =vtkSmartPointer<vtkConeSource>::New();cone->SetResolution(16);auto glyph =vtkSmartPointer<vtkGlyph3D>::New();glyph->SetInputConnection(probe->GetOutputPort());glyph->SetSourceConnection(cone->GetOutputPort());glyph->SetVectorModeToUseVector();glyph->SetScaleModeToDataScalingOff();glyph->SetScaleFactor(inputPolyData->GetLength() * 0.1);auto glyphMapper =vtkSmartPointer<vtkPolyDataMapper>::New();glyphMapper->SetInputConnection(glyph->GetOutputPort());auto glyphActor =vtkSmartPointer<vtkActor>::New();glyphActor->SetMapper(glyphMapper);glyphActor->GetProperty()->SetColor(1.,0.,0.);glyphActor->VisibilityOn();auto mapper =vtkSmartPointer<vtkPolyDataMapper>::New();mapper->SetInputData(inputPolyData);auto actor = vtkSmartPointer<vtkActor>::New();actor->SetMapper(mapper);actor->GetProperty()->SetRepresentationToWireframe();actor->GetProperty()->SetColor(colors->GetColor3d("gold").GetData());auto textActor =vtkSmartPointer<vtkTextActor>::New();textActor->GetTextProperty()->SetFontSize(12);textActor->SetPosition(10, 20);textActor->SetInput("cursor:");textActor->GetTextProperty()->SetColor(0.,1.,0.);// Create the RenderWindow, Render1er and both Actors//auto ren1 =vtkSmartPointer<vtkRenderer>::New();auto renWin =vtkSmartPointer<vtkRenderWindow>::New();renWin->AddRenderer(ren1);auto iren =vtkSmartPointer<vtkRenderWindowInteractor>::New();iren->SetRenderWindow(renWin);// The SetInteractor method is how 3D widgets are associated with the render// window interactor. Internally, SetInteractor sets up a bunch of callbacks// using the Command/Observer mechanism (AddObserver()).auto myCallback =vtkSmartPointer<vtkmyPWCallback>::New();myCallback->PolyData = point;myCallback->CursorActor = glyphActor;myCallback->PositionActor = textActor;// The point widget is used probe the dataset.//auto pointWidget =vtkSmartPointer<vtkPointWidget>::New();pointWidget->SetInteractor(iren);pointWidget->SetInputData(inputPolyData);pointWidget->AllOff();pointWidget->PlaceWidget();pointWidget->AddObserver(vtkCommand::InteractionEvent, myCallback);ren1->AddActor(glyphActor);ren1->AddActor(actor);ren1->AddActor2D(textActor);// Add the actors to the renderer, set the background and size//ren1->GradientBackgroundOn();ren1->SetBackground(colors->GetColor3d("SlateGray").GetData());ren1->SetBackground2(colors->GetColor3d("Wheat").GetData());renWin->SetSize(300, 300);renWin->Render();pointWidget->On();// render the image//iren->Initialize();renWin->Render();iren->Start();
}
结论:
感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步!
你的赞赏是我的最最最最大的动力(^U^)ノ~YO