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

若该文为原创文章,转载请注明出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/150765433

长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…

OSG、VTK、OSGEARTH三维开发专栏(点击传送门)

上一篇:《VTK开发笔记(三):熟悉VTK开发流程,编写球体,多半透明球体Demo
下一篇:敬请期待…


前言

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


Demo

  请添加图片描述


自带示例:Cone.exe

  显示效果
  在这里插入图片描述

  在这里插入图片描述

示例所在位置

  在这里插入图片描述

示例代码深度解析

int main()
{
    // 步骤一:创建圆锥体数据源
    vtkConeSource *cone = vtkConeSource::New();
    cone->SetHeight( 3.0 );
    cone->SetRadius( 1.0 );
cone->SetResolution( 10 );

    // 步骤二:创建多边形数据映射器(注意:可以在数据源和映射器之间插入中间过滤器)
    vtkPolyDataMapper *coneMapper = vtkPolyDataMapper::New();
coneMapper->SetInputConnection(cone->GetOutputPort() );

    // 步骤三:创建一个演员来代表圆锥体。演员协调映射器图形图元的渲染。actor还通过vtkProperty实例引用属性,并包含一个内部转换矩阵。我们将此actor的映射器设置为上面创建的coneMapper。 
    vtkActor *coneActor = vtkActor::New();
coneActor->SetMapper( coneMapper );

    // 步骤四:创建渲染器并为其分配演员。渲染器就像一个视口。它是屏幕上窗口的一部分或全部,负责绘制它所拥有的演员。我们还在此处设置了背景颜色。  
vtkRenderer *ren1= vtkRenderer::New();
ren1->AddActor( coneActor );
ren1->SetBackground( 0.1, 0.2, 0.4 );

// 步骤五:创建渲染窗口,它将显示在屏幕上。使用AddRenderer将渲染器放入渲染窗口。将渲染器大小设置为300像素乘300像素。  
vtkRenderWindow *renWin = vtkRenderWindow::New();
  renWin->AddRenderer( ren1 );
  renWin->SetSize( 300, 300 );
    // 步骤六:现在我们循环360度,每次渲染圆锥体。
    int i;
    for (i = 0; i < 360; ++i)
    {
        // render the image
        renWin->Render();
        // rotate the active camera by one degree
        ren1->GetActiveCamera()->Azimuth( 1 );
    }
    // 释放对象
    cone->Delete();
    coneMapper->Delete();
    coneActor->Delete();
    ren1->Delete();
    renWin->Delete();

    return 0;
}

复现Demo

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

步骤一:创建圆锥体数据源

  在这里插入图片描述

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

  在这里插入图片描述

  在这里插入图片描述

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

  在这里插入图片描述

  在这里插入图片描述

步骤四:创建渲染器

  在这里插入图片描述

  在这里插入图片描述

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

  在这里插入图片描述

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

  在这里插入图片描述

  在这里插入图片描述

  


Demo源码

VTKWidget.cpp

void VTKWidget::test_demo3_createCone()
{
    // 步骤一:创建圆锥体数据源
    vtkSmartPointer<vtkConeSource> pConeSource =
            VTKManager::createConeSource(0, 0, 0, 10, 30, 10);
    // 步骤二:创建多边形映射器
#if 0
    vtkSmartPointer<vtkPolyDataMapper> pPolyDataMapper =
            VTKManager::createPolyDataMapper(pConeSource);
#else
    vtkSmartPointer<vtkPolyDataMapper> pPolyDataMapper =
            VTKManager::createPolyDataMapper(pConeSource->GetOutputPort());
#endif
    // 步骤三:创建演员
    vtkSmartPointer<vtkActor> pActor =
            VTKManager::createActor(pPolyDataMapper);
    // 步骤四:创建渲染器
    vtkSmartPointer<vtkRenderer> pRenderer =
            VTKManager::createRenderer(pActor, 0.1, 0.2, 0.4);

    // 步骤五:渲染器添加到QVTKWidget渲染
    _pQVTKWidget->GetRenderWindow()->AddRenderer(pRenderer);


    // 步骤六:过程循环的方式实现旋转
    QElapsedTimer elapsedTimer;
    for(int index = 0; index < 360; index++)
    {
        LOG << index;
        // render the image
        _pQVTKWidget->GetRenderWindow()->Render();

        elapsedTimer.start();
        while(elapsedTimer.elapsed() < 10)
        {
            qApp->processEvents();
        }
        // 渲染器相机绕焦点旋转
        VTKManager::rotateAzimuth(pRenderer, 1);
    }
}

VTKManager.cpp

vtkSmartPointer<vtkConeSource> VTKManager::createConeSource(double x, double y, double z, double r, int h, int n)
{
    // 步骤一:智能指针定义
    vtkSmartPointer<vtkConeSource> pConeSource;
    // 步骤二:智能指针实例化
    pConeSource = vtkSmartPointer<vtkConeSource>::New();
    // 步骤三:设置中心坐标
    pConeSource->SetCenter(x, y, z);
    // 步骤三:设置半径
    pConeSource->SetRadius(r);
    // 步骤四:设置圆锥的高度
    pConeSource->SetHeight(h);
    // 步骤五:设置圆锥球体的经度分辨率,即横向的切片数量(横向/水平精细度)
    pConeSource->SetResolution(n);

    return pConeSource;
}

vtkSmartPointer<vtkPolyDataMapper> VTKManager::createPolyDataMapper(vtkConeSource *pConeSource)
{
    // 步骤一:智能指针定义
    vtkSmartPointer<vtkPolyDataMapper> pPolyDataMapper;
    // 步骤二:智能指针实例化
    pPolyDataMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    // 步骤三:设置
    pPolyDataMapper->SetInputConnection(pConeSource->GetOutputPort());

    return pPolyDataMapper;
}

vtkSmartPointer<vtkPolyDataMapper> VTKManager::createPolyDataMapper(vtkAlgorithmOutput *pAlgorithmOutput)
{
    // 步骤一:智能指针定义
    vtkSmartPointer<vtkPolyDataMapper> pPolyDataMapper;
    // 步骤二:智能指针实例化
    pPolyDataMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    // 步骤三:设置
    pPolyDataMapper->SetInputConnection(pAlgorithmOutput);

    return pPolyDataMapper;
}
vtkSmartPointer<vtkActor> VTKManager::createActor(vtkPolyDataMapper *pPolyDataMapper)
{
    // 步骤一:智能指针定义
    vtkSmartPointer<vtkActor> pActor;
    // 步骤二:智能指针实例化
    pActor = vtkSmartPointer<vtkActor>::New();
    // 步骤三:设置映射器
    pActor->SetMapper(pPolyDataMapper);

    return pActor;
}
vtkSmartPointer<vtkRenderer> VTKManager::createRenderer(vtkActor *pActor, double r, double g, double b)
{
    // 步骤一:智能指针定义
    vtkSmartPointer<vtkRenderer> pRenderer;
    // 步骤二:智能指针实例化
    pRenderer = vtkSmartPointer<vtkRenderer>::New();
    // 步骤三:设置映射器
    pRenderer->AddActor(pActor);
    // 步骤四:设置背景色
    pRenderer->SetBackground(r, g, b);

    return pRenderer;
}

void VTKManager::rotateAzimuth(vtkRenderer *pRenderer, double angle)
{
    pRenderer->GetActiveCamera()->Azimuth(angle);
}

工程模板v1.2.0

  在这里插入图片描述


上一篇:《VTK开发笔记(三):熟悉VTK开发流程,编写球体,多半透明球体Demo
下一篇:敬请期待…


本文章博客地址:https://hpzwl.blog.csdn.net/article/details/150765433

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长沙红胖子Qt(技术Q群4597637)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值