一、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即可解決。
六、析構函數崩潰
原因1:回調函數
窗口的同一個事件添加多個回調函數,例如:
vtkRenderWindow->AddObserver(vtkCommand::WindowResizeEvent,CallBack1);
vtkRenderWindow->AddObserver(vtkCommand::WindowResizeEvent,CallBack2);
原因2:智能指針
智能指針使用問題,如果出現問題可以排查一下是否將std::shared_ptr改為std::weak_ptr
原因3:Qt對象自動銷毀
Qt父對象銷毀,子對象跟着一起銷毀,導致vtk的智能指針vtkSmartPointer銷毀對象的是時候,該對象已經被銷毀
