找回密码
 立即注册
首页 业界区 业界 VTK开发笔记(四):示例Cone,创建圆锥体,在Qt窗口中 ...

VTK开发笔记(四):示例Cone,创建圆锥体,在Qt窗口中详解复现对应的Demo

骛扼铮 2025-9-22 13:31:38
前言

  vtk的了解学习途径跟随代码中的示例,循序渐进。
  本篇详细解析Cone.exe,后在Qt中复现一样的。
 Demo

  
1.gif

 自带示例:Cone.exe

  显示效果
  
2.png

  
3.png

示例所在位置

  
4.png

示例代码深度解析
  1. int main()
  2. {
  3.     // 步骤一:创建圆锥体数据源
  4.     vtkConeSource *cone = vtkConeSource::New();
  5.     cone->SetHeight( 3.0 );
  6.     cone->SetRadius( 1.0 );
  7. cone->SetResolution( 10 );
  8.     // 步骤二:创建多边形数据映射器(注意:可以在数据源和映射器之间插入中间过滤器)
  9.     vtkPolyDataMapper *coneMapper = vtkPolyDataMapper::New();
  10. coneMapper->SetInputConnection(cone->GetOutputPort() );
  11.     // 步骤三:创建一个演员来代表圆锥体。演员协调映射器图形图元的渲染。actor还通过vtkProperty实例引用属性,并包含一个内部转换矩阵。我们将此actor的映射器设置为上面创建的coneMapper。
  12.     vtkActor *coneActor = vtkActor::New();
  13. coneActor->SetMapper( coneMapper );
  14.     // 步骤四:创建渲染器并为其分配演员。渲染器就像一个视口。它是屏幕上窗口的一部分或全部,负责绘制它所拥有的演员。我们还在此处设置了背景颜色。  
  15. vtkRenderer *ren1= vtkRenderer::New();
  16. ren1->AddActor( coneActor );
  17. ren1->SetBackground( 0.1, 0.2, 0.4 );
  18. // 步骤五:创建渲染窗口,它将显示在屏幕上。使用AddRenderer将渲染器放入渲染窗口。将渲染器大小设置为300像素乘300像素。  
  19. vtkRenderWindow *renWin = vtkRenderWindow::New();
  20.   renWin->AddRenderer( ren1 );
  21.   renWin->SetSize( 300, 300 );
  22.     // 步骤六:现在我们循环360度,每次渲染圆锥体。
  23.     int i;
  24.     for (i = 0; i < 360; ++i)
  25.     {
  26.         // render the image
  27.         renWin->Render();
  28.         // rotate the active camera by one degree
  29.         ren1->GetActiveCamera()->Azimuth( 1 );
  30.     }
  31.     // 释放对象
  32.     cone->Delete();
  33.     coneMapper->Delete();
  34.     coneActor->Delete();
  35.     ren1->Delete();
  36.     renWin->Delete();
  37.     return 0;
  38. }
复制代码
 复现Demo

  有一个很重要的点,这个示例代码是阻塞时的循环刷新,与Qt的基于消息的编程处理方式不一样,这是过程式的编程,我们复刻示例,保持一块Demo就一个函数,否则的话,可以使用Qt定时器来实现更新位置就可以了。
步骤一:创建圆锥体数据源

  
5.png

步骤二:创建多边形映射器

  
6.png

  
7.png

步骤三:创建演员类(类似osg模型结点)

  
8.png

  
9.png

步骤四:创建渲染器

  
10.png

  
11.png

步骤五:设置渲染器到渲染窗口

  
12.png

步骤六:用Qt的方式实现不阻塞又是过程化旋转

  
13.png

  
14.png

  
 Demo源码

VTKWidget.cpp
  1. void VTKWidget::test_demo3_createCone()
  2. {
  3.     // 步骤一:创建圆锥体数据源
  4.     vtkSmartPointer<vtkConeSource> pConeSource =
  5.             VTKManager::createConeSource(0, 0, 0, 10, 30, 10);
  6.     // 步骤二:创建多边形映射器
  7. #if 0
  8.     vtkSmartPointer<vtkPolyDataMapper> pPolyDataMapper =
  9.             VTKManager::createPolyDataMapper(pConeSource);
  10. #else
  11.     vtkSmartPointer<vtkPolyDataMapper> pPolyDataMapper =
  12.             VTKManager::createPolyDataMapper(pConeSource->GetOutputPort());
  13. #endif
  14.     // 步骤三:创建演员
  15.     vtkSmartPointer<vtkActor> pActor =
  16.             VTKManager::createActor(pPolyDataMapper);
  17.     // 步骤四:创建渲染器
  18.     vtkSmartPointer<vtkRenderer> pRenderer =
  19.             VTKManager::createRenderer(pActor, 0.1, 0.2, 0.4);
  20.     // 步骤五:渲染器添加到QVTKWidget渲染
  21.     _pQVTKWidget->GetRenderWindow()->AddRenderer(pRenderer);
  22.     // 步骤六:过程循环的方式实现旋转
  23.     QElapsedTimer elapsedTimer;
  24.     for(int index = 0; index < 360; index++)
  25.     {
  26.         LOG << index;
  27.         // render the image
  28.         _pQVTKWidget->GetRenderWindow()->Render();
  29.         elapsedTimer.start();
  30.         while(elapsedTimer.elapsed() < 10)
  31.         {
  32.             qApp->processEvents();
  33.         }
  34.         // 渲染器相机绕焦点旋转
  35.         VTKManager::rotateAzimuth(pRenderer, 1);
  36.     }
  37. }
复制代码
VTKManager.cpp
  1. vtkSmartPointer<vtkConeSource> VTKManager::createConeSource(double x, double y, double z, double r, int h, int n)
  2. {
  3.     // 步骤一:智能指针定义
  4.     vtkSmartPointer<vtkConeSource> pConeSource;
  5.     // 步骤二:智能指针实例化
  6.     pConeSource = vtkSmartPointer<vtkConeSource>::New();
  7.     // 步骤三:设置中心坐标
  8.     pConeSource->SetCenter(x, y, z);
  9.     // 步骤三:设置半径
  10.     pConeSource->SetRadius(r);
  11.     // 步骤四:设置圆锥的高度
  12.     pConeSource->SetHeight(h);
  13.     // 步骤五:设置圆锥球体的经度分辨率,即横向的切片数量(横向/水平精细度)
  14.     pConeSource->SetResolution(n);
  15.     return pConeSource;
  16. }
  17. vtkSmartPointer<vtkPolyDataMapper> VTKManager::createPolyDataMapper(vtkConeSource *pConeSource)
  18. {
  19.     // 步骤一:智能指针定义
  20.     vtkSmartPointer<vtkPolyDataMapper> pPolyDataMapper;
  21.     // 步骤二:智能指针实例化
  22.     pPolyDataMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
  23.     // 步骤三:设置
  24.     pPolyDataMapper->SetInputConnection(pConeSource->GetOutputPort());
  25.     return pPolyDataMapper;
  26. }
  27. vtkSmartPointer<vtkPolyDataMapper> VTKManager::createPolyDataMapper(vtkAlgorithmOutput *pAlgorithmOutput)
  28. {
  29.     // 步骤一:智能指针定义
  30.     vtkSmartPointer<vtkPolyDataMapper> pPolyDataMapper;
  31.     // 步骤二:智能指针实例化
  32.     pPolyDataMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
  33.     // 步骤三:设置
  34.     pPolyDataMapper->SetInputConnection(pAlgorithmOutput);
  35.     return pPolyDataMapper;
  36. }
  37. vtkSmartPointer<vtkActor> VTKManager::createActor(vtkPolyDataMapper *pPolyDataMapper)
  38. {
  39.     // 步骤一:智能指针定义
  40.     vtkSmartPointer<vtkActor> pActor;
  41.     // 步骤二:智能指针实例化
  42.     pActor = vtkSmartPointer<vtkActor>::New();
  43.     // 步骤三:设置映射器
  44.     pActor->SetMapper(pPolyDataMapper);
  45.     return pActor;
  46. }
  47. vtkSmartPointer<vtkRenderer> VTKManager::createRenderer(vtkActor *pActor, double r, double g, double b)
  48. {
  49.     // 步骤一:智能指针定义
  50.     vtkSmartPointer<vtkRenderer> pRenderer;
  51.     // 步骤二:智能指针实例化
  52.     pRenderer = vtkSmartPointer<vtkRenderer>::New();
  53.     // 步骤三:设置映射器
  54.     pRenderer->AddActor(pActor);
  55.     // 步骤四:设置背景色
  56.     pRenderer->SetBackground(r, g, b);
  57.     return pRenderer;
  58. }
  59. void VTKManager::rotateAzimuth(vtkRenderer *pRenderer, double angle)
  60. {
  61.     pRenderer->GetActiveCamera()->Azimuth(angle);
  62. }
复制代码
 工程模板v1.2.0

  
15.png


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册