vtk创建点

该文为初学者提供了在三维空间使用vtk库创建点的教程。首先介绍了开发环境,使用了vtk9.2和QtCreator4.11.2。示例一展示了如何创建并显示一些点,然后在示例二中扩展了这个概念,创建了更丰富的点分布,模拟出星星满天的效果。文章详细解释了项目结构、.pro文件配置、主函数代码以及如何设置点的属性。
摘要由CSDN通过智能技术生成

引言

本文仅适合初学者。
本文不提供vtk动态库的生成,以及在QtCreator中的引进vtk时的配置。
本文先由示例一开始,然后再在示例一的基础上进行改进,最后呈现出满天星的效果。其中示例一仅是在三维空间中展示一些点,即使用vtk创建点;示例二在示例一基础之上,进行改动。最后呈现的效果如下:

开发环境

使用vtk9.2的库,在QtCreator中创建空项目。其中QtCreator使用的是4.11.2,Qt的版本是5.14.2。

示例一

项目结构

在这里插入图片描述

实现代码

由于创建的空项目,所以项目创建之后只有一个空的.pro文件,需要自己编写pro文件,pro文件的内容如下:
testVtkPoints.pro

QT       += core #gui

#greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11 vtk9.2

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp

SOUPDIR = $$PWD/../../SOUPdependency
vtk9.2 {
    contains(QT_ARCH, x86_64) {
        include($$SOUPDIR/vtk-9.2/vtk-9.2.pri)
    } else {
        include($$SOUPDIR/vtk-9.2-2017-omp-win32/vtk-9.2.pri)
    }
    DEFINES += vtkEventDataButton3D=vtkEventDataDevice3D
    DEFINES += vtkEventDataMove3D=vtkEventDataDevice3D
}

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

main.cpp

#include <vtkSmartPointer.h>
#include <vtkActor.h>
#include <vtkPolyDataMapper.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkPolyData.h>
#include<vtkCamera.h>

//注意:不加下面的初始化模块,程序运行时不会有窗口展现(啥也没有)
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2);//渲染
VTK_MODULE_INIT(vtkInteractionStyle);//交互样式
VTK_MODULE_INIT(vtkRenderingFreeType)//文本图像
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2)//体素

int main(int argc,char*argv[])
{
    double dPoints[8][3] = {{0.2,2.1,3.1},{1.0,2.6,7.0},{5.0,9.2,5.0},{21.0,3.0,4.5},{5.6,7.2,4.9},{4.5,6.3,9.0},{13.0,3.4,5.6},{26.0,7.8,5.6}};

    vtkSmartPointer<vtkPolyData> polyData =vtkSmartPointer<vtkPolyData>::New();
    vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
    vtkSmartPointer<vtkCellArray> cellArrays = vtkSmartPointer<vtkCellArray>::New();

    cellArrays->InsertNextCell(8);//指定点的个数
    for(int i = 0; i < 8;++i)
    {
        points->InsertPoint(i,dPoints[i]);
        cellArrays->InsertCellPoint(i);
    }

    polyData->SetPoints(points);
    polyData->SetVerts(cellArrays);

    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputData(polyData);

    vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);

    vtkSmartPointer<vtkRenderer> render = vtkSmartPointer<vtkRenderer>::New();
    render->AddActor(actor);
    render->ResetCamera();
    render->SetBackground(0.12,0.56,1);

    vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
    renderWindow->AddRenderer(render);
    renderWindow->SetSize(600,500);
    renderWindow->Render();

    vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
    interactor->SetRenderWindow(renderWindow);

    interactor->Initialize();
    interactor->Start();

    return 0;
}

运行效果

在这里插入图片描述
由于视频制作的时候背景上出现了许多白色斑点,故而上面的视频呈现的效果不是很好。

示例二

由于示例一呈现的效果,让我想起了漫天星星的感觉,故而想做个漫天星星来看看。在上面的示例一的基础上,进行改进。

项目结构

其结构和示例一一样。

实现代码

其中pro文件不变,改变的是main.cpp.
main.cpp

#include <vtkSmartPointer.h>
#include <vtkActor.h>
#include <vtkPolyDataMapper.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkProperty.h>
#include <vtkPolyData.h>

//注意:不加下面的初始化模块,程序运行时不会有窗口展现(啥也没有)
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2);//渲染
VTK_MODULE_INIT(vtkInteractionStyle);//交互样式
VTK_MODULE_INIT(vtkRenderingFreeType)//文本图像
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2)//体素

vtkSmartPointer<vtkActor> createActor(int nCount,double pPointSet[][3],double dPointSize = 1.0)
{
    vtkSmartPointer<vtkPolyData> polyData =vtkSmartPointer<vtkPolyData>::New();
    vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
    vtkSmartPointer<vtkCellArray> cellArrays = vtkSmartPointer<vtkCellArray>::New();

    cellArrays->InsertNextCell(nCount);//指定点的个数
    for(int i = 0; i < nCount;++i)
    {
        points->InsertPoint(i,pPointSet[i]);
        cellArrays->InsertCellPoint(i);
    }

    polyData->SetPoints(points);
    polyData->SetVerts(cellArrays);

    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputData(polyData);

    vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);
    actor->GetProperty()->SetPointSize(dPointSize);
    return actor;
}

int main(int argc,char*argv[])
{
    double dPoints[8][3] = {{0.2,2.1,3.1},{1.0,2.6,7.0},{5.0,9.2,5.0},{21.0,3.0,4.5},{5.6,7.2,4.9},{4.5,6.3,9.0},{13.0,3.4,5.6},{26.0,7.8,5.6}};
    vtkSmartPointer<vtkActor> actor = createActor(8,dPoints,2);

    double dPoint1s[8][3] = {{5.2,2.1,3.1},{1.0,22.6,7.0},{5.0,19.2,5.0},{11.0,3.0,4.5},{5.6,23.2,4.9},{4.5,12.3,9.0},{13.0,6.4,5.6},{6.0,7.8,5.6}};
    vtkSmartPointer<vtkActor> actor1 = createActor(8,dPoint1s,3);

    double dPoint2s[24][3] = {{25.2,2.1,3.1},{12.0,22.6,7.0},{5.0,1.2,5.0},{11.0,3.0,5.5},{5.6,33.2,4.9},{4.5,22.3,9.0},{13.0,2.4,5.6},{6.0,5.8,5.6},
                             {5.2,2.1,13.1},{1.0,2.6,7.0},{5.0,19.2,15.0},{11.0,13.0,4.5},{5.6,2.2,42.9},{4.5,11.3,23.0},{13.0,6.3,5.6},{6.0,7.8,5.6},
                             {5.2,12.1,3.1},{1.0,32.6,7.0},{5.0,9.2,5.0},{11.0,3.0,14.5},{5.6,23.2,4.9},{4.5,12.3,9.0},{13.0,6.4,5.6},{6.0,9.8,5.6}};
    vtkSmartPointer<vtkActor> actor2 = createActor(24,dPoint2s);

    vtkSmartPointer<vtkRenderer> render = vtkSmartPointer<vtkRenderer>::New();
    render->AddActor(actor);
    render->AddActor(actor1);
    render->AddActor(actor2);
    render->ResetCamera();
    render->SetBackground(0.12,0.56,1);

    vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
    renderWindow->AddRenderer(render);
    renderWindow->SetSize(600,500);
    renderWindow->Render();

    vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
    interactor->SetRenderWindow(renderWindow);

    interactor->Initialize();
    interactor->Start();

    return 0;
}

运行效果

在这里插入图片描述
没有插入太多的点,动图这里就不再展示。

总结

以对象actor为准,向渲染器中加入对象actor,一个渲染器中可以加入多个对象,每一个对象可以通过其属性设置其颜色,大小等。数据源经映射器映射,为对象中设置映射器。实际上渲染窗口最终展示的便为我们创建的对象。此些文本,为自己理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

肩上风骋

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

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

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

打赏作者

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

抵扣说明:

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

余额充值