在VTK中,你可以通过设置vtkRenderer的层级来控制渲染的顺序。例如,你可以将体绘制的vtkRenderer设置在第0层,将面模型的vtkRenderer设置在第1层。这样,面模型就会覆盖显示在下一层的体绘制模型上,有时我们会有这样的需求。
直接通过vtkRenderer的SetLayer设置即可,如果想两个图层的交互同步则需将上层renderer的相机设置给下层即可。
例子
#include <vtkActor.h>
#include <vtkLineSource.h>
#include <vtkNamedColors.h>
#include <vtkSmartPointer.h>
#include <vtkPolyDataMapper.h>
#include <vtkPolyData.h>
#include <vtkPointData.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkRenderer.h>
#include <vtkTubeFilter.h>
#include <vtkParametricSpline.h>
#include <vtkParametricFunctionSource.h>
#include <vtkTupleInterpolator.h>
#include <vtkDoubleArray.h>int main(int, char* [])
{vtkSmartPointer<vtkNamedColors> colors = vtkSmartPointer<vtkNamedColors>::New();// 画线vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();points->InsertPoint(0, 1, 0, 0);points->InsertPoint(1, 2, 0, 0);points->InsertPoint(2, 3, 1, 0);points->InsertPoint(3, 4, 1, 0);points->InsertPoint(4, 5, 0, 0);points->InsertPoint(5, 6, 0, 0);// 插值样条曲线vtkSmartPointer<vtkParametricSpline> spline =vtkSmartPointer<vtkParametricSpline>::New();spline->SetPoints(points);vtkSmartPointer<vtkParametricFunctionSource> functionSource = vtkSmartPointer<vtkParametricFunctionSource>::New();functionSource->SetParametricFunction(spline);functionSource->SetUResolution(10 * points->GetNumberOfPoints());functionSource->Update();// Create a tube (cylinder) around the line.double rad = 0;vtkSmartPointer<vtkTupleInterpolator> interpolatedRadius = vtkSmartPointer<vtkTupleInterpolator>::New();interpolatedRadius->SetInterpolationTypeToLinear();interpolatedRadius->SetNumberOfComponents(1);rad = .3;interpolatedRadius->AddTuple(0, &rad);rad = .3;interpolatedRadius->AddTuple(1, &rad);rad = .2;interpolatedRadius->AddTuple(2, &rad);rad = .2;interpolatedRadius->AddTuple(3, &rad);rad = .1;interpolatedRadius->AddTuple(4, &rad);rad = .1;interpolatedRadius->AddTuple(5, &rad);// Generate the radius scalars.vtkSmartPointer<vtkDoubleArray> tubeRadius = vtkSmartPointer<vtkDoubleArray>::New();unsigned int n = functionSource->GetOutput()->GetNumberOfPoints();tubeRadius->SetNumberOfTuples(n);tubeRadius->SetName("TubeRadius");auto tMin = interpolatedRadius->GetMinimumT();auto tMax = interpolatedRadius->GetMaximumT();std::cout << tMin<<std::endl;std::cout << tMax <<std::endl;double r = 0;for (unsigned int i = 0; i < n; ++i){auto t = (tMax - tMin) / (n - 1) * i + tMin;interpolatedRadius->InterpolateTuple(t, &r);tubeRadius->SetTuple1(i, r);}// Add the scalars to the polydata.auto tubePolyData = functionSource->GetOutput();tubePolyData->GetPointData()->AddArray(tubeRadius);tubePolyData->GetPointData()->SetActiveScalars("TubeRadius");vtkSmartPointer<vtkTubeFilter> tubeFilter = vtkSmartPointer<vtkTubeFilter>::New();tubeFilter->SetInputData(tubePolyData);tubeFilter->SetNumberOfSides(50);tubeFilter->SetVaryRadiusToVaryRadiusByAbsoluteScalar();tubeFilter->Update();// Create a mapper and actor.vtkSmartPointer<vtkPolyDataMapper> lineMapper =vtkSmartPointer<vtkPolyDataMapper>::New();lineMapper->SetInputData(functionSource->GetOutput());lineMapper->ScalarVisibilityOff();vtkSmartPointer<vtkActor> lineActor =vtkSmartPointer<vtkActor>::New();lineActor->GetProperty()->SetColor(colors->GetColor3d("Blue").GetData());lineActor->SetMapper(lineMapper);lineActor->GetProperty()->SetLineWidth(3);// Create a mapper and actor.vtkSmartPointer<vtkPolyDataMapper> tubeMapper = vtkSmartPointer<vtkPolyDataMapper>::New();tubeMapper->SetInputData(tubeFilter->GetOutput());vtkSmartPointer<vtkActor> tubeActor = vtkSmartPointer<vtkActor>::New();tubeActor->SetMapper(tubeMapper);// Create a renderer, render window, and interactor.vtkSmartPointer<vtkRenderer> tube_renderer = vtkSmartPointer<vtkRenderer>::New();tube_renderer->AddActor(tubeActor);tube_renderer->SetLayer(0);tube_renderer->SetBackground(colors->GetColor3d("DarkSlateGray").GetData());vtkSmartPointer<vtkRenderer> line_renderer = vtkSmartPointer<vtkRenderer>::New();line_renderer->AddActor(lineActor);line_renderer->SetLayer(1);line_renderer->SetBackground(colors->GetColor3d("DarkSlateGray").GetData());tube_renderer->SetActiveCamera(line_renderer->GetActiveCamera()); // 两个图层交互同步line_renderer->ResetCamera();vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();renderWindow->AddRenderer(tube_renderer);renderWindow->AddRenderer(line_renderer);renderWindow->SetNumberOfLayers(2); // 设置图层数量renderWindow->SetWindowName("TubeFilter");vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();renderWindowInteractor->SetRenderWindow(renderWindow);renderWindowInteractor->SetInteractorStyle(style);// Render and interact.renderWindow->Render();renderWindowInteractor->Start();return EXIT_SUCCESS;
}