• Qt使用VTK遇到的一些问题


    一、vtkOrientationMarkerWidget在Qt窗口中不显示

    1. 注意this->setRenderWindow(renderWindow);this->renderWindow()->AddRenderer(renderer);以及omw->EnabledOn();代码段的位置

    2. 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,渲染窗口背景颜色闪烁,图元不显示

    1. 背景颜色闪烁是因为直接调用了renderer->Render();

    2. 图元不显示是因为没有调用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即可解决。

  • 相关阅读:
    MySQL常用命令
    Jstack、Jmap命令简单使用
    MySQL慢查询日志ES索引模板
    MySQL二进制安装部署
    varnish启动报错
    基础训练 Sine之舞
    基础训练 FJ的字符串
    基础训练 芯片测试
    基础训练 龟兔赛跑预测
    基础训练 回形取数
  • 原文地址:https://www.cnblogs.com/mmmmmmmmm/p/15909012.html
Copyright © 2020-2023  润新知