Demo 描述:
一个vtk多图层小案例,设置三个图层,添加`vtkOrientationMarkerWidget`用于显示窗口的旋转交互;开始不起作用,经过查询发现,对于多图层,vtkOrientationMarkerWidget需要设置渲染器
vtkOrientationMarkerWidget* markedCoorSys = vtkOrientationMarkerWidget::New();
markedCoorSys->SetOutlineColor(0.9300, 0.5700, 0.1300);
//markedCoorSys->SetDefaultRenderer(renderer);//多图层需要设置渲染器
markedCoorSys->SetOrientationMarker(axes);
assert(renderWindow->GetInteractor() != nullptr);
markedCoorSys->SetInteractor(renderWindow->GetInteractor());
markedCoorSys->SetViewport(0, 0, 0.2, 0.2);
markedCoorSys->SetEnabled(1);
完整Demo案例:
#include<iostream>
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingFreeType);
#include <vtkSmartPointer.h>
#include <vtkCubeSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkAxesActor.h>
#include <vtkAssembly.h>
#include <vtkProperty.h>
#include <vtkOrientationMarkerWidget.h>
int main()
{
// 创建立方体
vtkSmartPointer<vtkCubeSource> cubeSource = vtkSmartPointer<vtkCubeSource>::New();
// 映射数据到图形对象
vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(cubeSource->GetOutputPort());
// 创建表示物体的角色
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
// 创建渲染器和窗口
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderer> overlay = vtkSmartPointer<vtkRenderer>::New();
overlay->SetLayer(1);
vtkSmartPointer<vtkRenderer> selectlay = vtkSmartPointer<vtkRenderer>::New();
selectlay->SetLayer(2);
vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->SetNumberOfLayers(3);
renderWindow->AddRenderer(renderer);
renderWindow->AddRenderer(overlay);
renderWindow->AddRenderer(selectlay);
renderer->AddActor(actor);
// 创建交互器
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
style->SetDefaultRenderer(renderer);
renderWindowInteractor->SetInteractorStyle(style);
renderWindowInteractor->SetRenderWindow(renderWindow);
// 将角色添加到渲染器
renderer->AddActor(actor);
// 设置背景颜色
renderer->SetBackground(0.1, 0.2, 0.4);
{
vtkSmartPointer<vtkAxesActor> axes = vtkSmartPointer<vtkAxesActor>::New();
axes->GetXAxisTipProperty()->SetColor(0.706, 0.016, 0.150);
axes->GetXAxisShaftProperty()->SetColor(0.706, 0.016, 0.150);
axes->GetYAxisTipProperty()->SetColor(0.130, 0.806, 0.150);
axes->GetYAxisShaftProperty()->SetColor(0.130, 0.806, 0.150);
axes->GetZAxisTipProperty()->SetColor(0.230, 0.299, 0.754);
axes->GetZAxisShaftProperty()->SetColor(0.230, 0.299, 0.754);
axes->AxisLabelsOff();
vtkOrientationMarkerWidget* markedCoorSys = vtkOrientationMarkerWidget::New();
markedCoorSys->SetOutlineColor(0.9300, 0.5700, 0.1300);
markedCoorSys->SetDefaultRenderer(renderer);//多图层需要设置渲染器
markedCoorSys->SetOrientationMarker(axes);
assert(renderWindow->GetInteractor() != nullptr);
markedCoorSys->SetInteractor(renderWindow->GetInteractor());
markedCoorSys->SetViewport(0, 0, 0.2, 0.2);
markedCoorSys->SetEnabled(1);
}
// 渲染并启动交互器
renderWindow->Render();
renderWindowInteractor->Start();
return 0;
}