一、vtkOrientationMarkerWidget在Qt窗口中不显示
-
注意
this->setRenderWindow(renderWindow);
和this->renderWindow()->AddRenderer(renderer);
以及omw->EnabledOn();
代码段的位置 -
vtkOrientationMarkerWidget不要在局部使用智能指针,出了作用域会被析构
点击查看代码
/*VTKWidget继承自QVTKRenderWidget*/
VTKWidget::VTKWidget()
{
vtkNew<vtkNamedColors> colors;
vtkNew<vtkGenericOpenGLRenderWindow> renderWindow;
this->setRenderWindow(renderWindow);
vtkNew<vtkInteractorStyleRubberBand3D> style;
this->interactor()->SetInteractorStyle(style);
// Sphere
vtkNew<vtkSphereSource> sphereSource;
sphereSource->Update();
vtkNew<vtkPolyDataMapper> sphereMapper;
sphereMapper->SetInputConnection(sphereSource->GetOutputPort());
vtkNew<vtkActor> sphereActor;
sphereActor->SetMapper(sphereMapper);
sphereActor->GetProperty()->SetColor(colors->GetColor4d("Tomato").GetData());
// VTK Renderer
vtkNew<vtkRenderer> renderer;
renderer->AddActor(sphereActor);
renderer->SetBackground(colors->GetColor3d("SteelBlue").GetData());
renderer->ResetCamera();
// Connect VTK with Qt
this->renderWindow()->AddRenderer(renderer);
std::array<double, 3> scale{ {1.0, 1.0, 1.0} };
vtkAxesActor* axes = vtkAxesActor::New();
axes->SetScale(1,1,1);
axes->SetShaftTypeToCylinder();
axes->SetCylinderRadius(0.5 * axes->GetCylinderRadius()); //轴的粗细
axes->SetConeRadius(1.025 * axes->GetConeRadius()); //圆锥的大小
axes->SetSphereRadius(1.5 * axes->GetSphereRadius());
vtkTextProperty* tprop = axes->GetXAxisCaptionActor2D()->GetCaptionTextProperty();
tprop->ItalicOn(); //启用文本斜体
tprop->ShadowOn(); //启用文本阴影
tprop->SetFontFamilyToTimes(); //字体
tprop->SetColor(1, 1, 1); //标签文字颜色
axes->GetYAxisCaptionActor2D()->GetCaptionTextProperty()->ShallowCopy(tprop);
axes->GetZAxisCaptionActor2D()->GetCaptionTextProperty()->ShallowCopy(tprop);
// 将omw声明为成员变量
vtkOrientationMarkerWidget* omw = vtkOrientationMarkerWidget::New();
omw->SetOrientationMarker(axes);
omw->SetViewport(0.8, 0, 1.0, 0.2);
omw->SetOutlineColor(1, 0, 0);
omw->SetInteractor(this->interactor());
omw->EnabledOn();
omw->InteractiveOn();
}
二、Qt中使用VTK,渲染窗口背景颜色闪烁,图元不显示
-
背景颜色闪烁是因为直接调用了
renderer->Render();
-
图元不显示是因为没有调用
renderer->GetRenderWindow()->Render();
点击查看代码
/*this 继承自QVTKRenderWidget*/
//renderer
vtkNew<vtkRenderer> renderer;
renderer->SetBackground(.1,.2,.3);
renderer->AddActor(cubeActor);
renderer->SetActiveCamera(camera);
renderer->ResetCamera();
//RenderWindow
vtkNew<vtkGenericOpenGLRenderWindow> renWin;
renWin->AddRenderer(renderer);
this->setRenderWindow(renWin);
//renderer->Render(); //调用该函数会导致窗口背景闪烁,甚至程序崩溃,可以使用下面的接口解决
renderer->GetRenderWindow()->Render();
三、云图只显示一种颜色
检查mapper是否设置了range 即 vtkPolyDataMapper->SetScalarRange(range);
四、报错:"static_cast":无法从"vtkObjectBase* const"转换为"T*"
只有类的前置声明,没有实际包含头文件,一般发生在头文件中定义函数,但只声明了vtk类
五、中断:"Cannot make QOpenGLContext current in a different thread"
同一个上下文不能在多个线程中使用,报该错误的原因是因为在不同线程调用了vtk的Render()函数,保证在同一个线程调用Render即可解决。