学习VTK9笔记(一)

       刚接触VTK,最新的已经是9.0.3了,而且我经常用Qt开发,因此在学习时直接开始上手 QVTKOpenGLNativeWidget

参考这里的代码 https://blog.csdn.net/qq_37996632/article/details/106449316

#include <QtWidgets/QApplication>
#include <QSurfaceFormat>
#include <QVTKOpenGLNativeWidget.h>
 
#include <vtkSphereSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkGenericOpenGLRenderWindow.h>
#include <vtkNamedColors.h>
#include <vtkProperty.h>
#include <vtkSmartPointer.h>
 
#include "vtkAutoInit.h" 
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
VTK_MODULE_INIT(vtkRenderingFreeType);
 
int main(int argc, char* argv[])
{
	QApplication a(argc, argv);
 
	QSurfaceFormat::setDefaultFormat(QVTKOpenGLNativeWidget::defaultFormat());
	QVTKOpenGLNativeWidget *widget = new QVTKOpenGLNativeWidget();
 
	vtkSmartPointer<vtkNamedColors> colors = vtkSmartPointer<vtkNamedColors>::New();
 
	vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New();
 
	vtkSmartPointer<vtkPolyDataMapper> sphereMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
 
	sphereMapper->SetInputConnection(sphereSource->GetOutputPort());
	vtkSmartPointer<vtkActor> sphereActor = vtkSmartPointer<vtkActor>::New();
 
	sphereActor->SetMapper(sphereMapper);
	sphereActor->GetProperty()->SetColor(colors->GetColor4d("Tomato").GetData());
 
	vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
	renderer->AddActor(sphereActor);
	renderer->SetBackground(colors->GetColor3d("SteelBlue").GetData());
 
	vtkSmartPointer<vtkGenericOpenGLRenderWindow> renderWindow = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();
	renderWindow->AddRenderer(renderer);
	renderWindow->SetWindowName("RenderWindowNoUIFile");
 
	widget->SetRenderWindow(renderWindow);
	widget->resize(800, 600);
	widget->show();
 
	return a.exec();
}

显示如下

问题1 ,widget->SetRenderWindow(renderWindow); 在VTK9中,SetRenderWindow第一个字母改成了小写,变为setRenderWindow

问题2,

VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
VTK_MODULE_INIT(vtkRenderingFreeType);

这两句报错,直接注释掉,也可以编译。

问题3,运行报错QWidget: Must construct a QApplication before a QWidget, 思考很久也没想明白,后来发现切换为debug版没问题。想起来VTK的动态库后缀不一样,把debug版后的d去掉,再运行release版,没有问题。同样,如果debug版调试时,用的是release版的VTK动态库也报这个错误。

还有很多不太明白的地方,比如,程序支持鼠标交互,但是代码里面怎么操作的,没看懂。

各种颜色的设置,默认值有多少种,去哪里查,不太清楚。

对于为什么用QVTKOpenGLNativeWidget这个类,也是参考很多人的介绍。

1.Qt版本

在Qt5.4以前,在Qt中使用OpenGL一般是使用QGLWidget,相对应的VTK控件只能选择QVTKWidget/QVTKWidget2。其中QVTKWidget2是QVTKWidget的升级,不过也是十分古老了,这两个类都不建议使用。

而在Qt5.4及后面版本中,引入了QOpenGLWidget旨在代替老旧的QGLWidget,但是QGLWidget仍然是被保留的。对应的VTK控件为QVTKOpenGLWidget/QVTKOpenGLNativeWidget。

2.VTK版本(Qt版本为5.4之后的情况下)

在VTK8.2之前的版本,一般是使用QVTKOpenGLWidget;

在VTK8.2及之后的版本里,引入了QVTKOpenGLNativeWidget;

这几个类本质上都是一样的东西,一样的使用方法,只不过随着技术的迭代更新了,渲染越来越快效果越来越好。综上所述,使用的版本越新,vtk控件名就越长,如果你是Qt5.4之后又是vtk8.2之后的版本,果断用名字最长的QVTKOpenGLNativeWidget

学习VTK的参考资料,https://kitware.github.io/vtk-examples/site/ 这里有很多示例。

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值