VTK|显示.ply格式(点云) .obj格式(mesh) .tif(geoTIFF)文件

前篇:VKT源码解压安装
添加边框等通用控件见下篇:VTK|结合qt创建通用按钮控制显隐(边框、坐标轴、点线面)
参考:
VTK-8.2.0源码编译和初步使用(Cmake+VS2015+Qt5.14.2)
VTK显示点云

创建一个八边形


#include <QHBoxLayout>
#include <QLabel>
#include <QPushButton>
#include <QFileDialog>
#include <vtkActor.h>
#include <vtkCamera.h>
#include <vtkCylinderSource.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkGenericOpenGLRenderWindow.h>
#include <array>
// 以下三行是因为版本8.x.x需要添加的 后续9.x.x版本会自动导入无需添加
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);

m_pScene = new QVTKOpenGLWidget();
main_layout_->addWidget(m_pScene);

vtkNew<vtkNamedColors> colors;

// Set the background color.
std::array<unsigned char, 4> bkg{{26, 51, 102, 255}};
colors->SetColor("BkgColor", bkg.data());

// This creates a polygonal cylinder model with eight circumferential facets
// (i.e, in practice an octagonal prism).
vtkNew<vtkCylinderSource> cylinder;
cylinder->SetResolution(8);

// The mapper is responsible for pushing the geometry into the graphics
// library. It may also do color mapping, if scalars or other attributes are
// defined.
vtkNew<vtkPolyDataMapper> cylinderMapper;
cylinderMapper->SetInputConnection(cylinder->GetOutputPort());

// The actor is a grouping mechanism: besides the geometry (mapper), it
// also has a property, transformation matrix, and/or texture map.
// Here we set its color and rotate it around the X and Y axes.
vtkNew<vtkActor> cylinderActor;
cylinderActor->SetMapper(cylinderMapper);
cylinderActor->GetProperty()->SetColor(
    colors->GetColor4d("Tomato").GetData());
cylinderActor->RotateX(30.0);
cylinderActor->RotateY(-45.0);

// The renderer generates the image
// which is then displayed on the render window.
// It can be thought of as a scene to which the actor is added
vtkNew<vtkRenderer> renderer;
renderer->AddActor(cylinderActor);
renderer->SetBackground(colors->GetColor3d("BkgColor").GetData());
// Zoom in a little by accessing the camera and invoking its "Zoom" method.
renderer->ResetCamera();
renderer->GetActiveCamera()->Zoom(1.5);

vtkSmartPointer<vtkGenericOpenGLRenderWindow> window = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();
window->AddRenderer(renderer);

m_pScene->SetRenderWindow(window);
m_pScene->GetRenderWindow()->Render();
m_pScene->GetRenderWindow()->Start();

八边形运行效果

显示.ply格式(点云)

关于 PCL 和 PLY 文件格式的解释

1. PCL 是什么

PCL(Point Cloud Library)是一个开源的 C++ 库,专门用于处理 3D 点云数据。它广泛应用于机器人学、计算机视觉等领域,提供了大量的点云处理算法,如滤波、分割、特征提取、表面重建等。PCL 依赖于 VTK(Visualization Toolkit)进行点云的可视化。

2. 为什么显示 PLY 文件时需要 PCL

虽然 VTK 本身可以加载和显示 PLY 文件,但 PCL 提供了更丰富的点云处理功能。在某些情况下,开发者可能会选择使用 PCL 来加载 PLY 文件,然后利用 PCL 的功能对点云进行进一步处理(如滤波、特征提取等),最后通过 VTK 进行可视化。

3. PLY 文件的格式

PLY(Polygon File Format)是一种用于表示 3D 模型的文件格式,支持多种数据类型和结构。常见的 PLY 文件格式有以下几种:

  • ASCII 格式:以文本形式存储点云数据,易于阅读和编辑。
  • 二进制格式:以二进制形式存储数据,文件体积小,读取速度快。
  • 有组织的点云数据:点云数据按照行和列排列,类似于图像的结构。
  • 无组织的点云数据:点云数据没有特定的排列顺序。

PLY 文件还可以包含额外的信息,如颜色、法线等,这使得它在 3D 可视化和处理中非常灵活。

总结

PCL 是一个强大的点云处理库,它依赖于 VTK 进行可视化。虽然 VTK 可以直接加载 PLY 文件,但 PCL 提供了更多的处理功能,因此在一些项目中开发者会选择结合使用 PCL 和 VTK。PLY 文件有多种格式,包括 ASCII 和二进制格式,以及有组织和无组织的点云数据,这使得它适用于不同的应用场景。

但是!我只想显示ply文件并不想处理ply文件数据,so,直接使用vtk显示点云数据

void ThreeDimensionalDisplayPage::loadPlyFile(vtkSmartPointer<vtkPolyData> _poly_data)
{
    // 打印调试信息
    double bounds[6];
    _poly_data->GetBounds(bounds);
    std::cout << "Bounds: [" << bounds[0] << ", " << bounds[1] << "] x ["
               << bounds[2] << ", " << bounds[3] << "] x ["
               << bounds[4] << ", " << bounds[5] << "]" << std::endl;
    std::cout << "Number of points: " << _poly_data->GetNumberOfPoints() << std::endl;
    std::cout << "Number of polys: " << _poly_data->GetNumberOfPolys() << std::endl;

    // 计算中心和 Z 方向缩放因子(夸张Z轴)
    double center[3] = {
        (bounds[0] + bounds[1]) / 2.0,
        (bounds[2] + bounds[3]) / 2.0,
        (bounds[4] + bounds[5]) / 2.0};

    double zRange = bounds[5] - bounds[4];
    double scale = 100.0 / zRange; // 将Z方向起伏拉伸成100单位高度

    vtkNew<vtkTransform> transform;
    transform->Translate(-center[0], -center[1], -center[2]);
    transform->Scale(scale, scale, scale);

    // 1. 平移+缩放
    vtkNew<vtkTransformPolyDataFilter> transformFilter;
    transformFilter->SetInputData(_poly_data);
    transformFilter->SetTransform(transform.Get());
    transformFilter->Update();

    // Elevation着色(根据Z值) - 可选
    vtkNew<vtkElevationFilter> elevationFilter;
    elevationFilter->SetInputConnection(transformFilter->GetOutputPort());
    elevationFilter->SetLowPoint(0, 0, bounds[4]);
    elevationFilter->SetHighPoint(0, 0, bounds[5]);
    elevationFilter->Update();

    // 创建颜色查找表
    vtkNew<vtkLookupTable> colorLookupTable;
    colorLookupTable->SetTableRange(transformFilter->GetOutput()->GetBounds()[4], transformFilter->GetOutput()->GetBounds()[5]);
    colorLookupTable->Build();

    // 2. 加入拓扑结构:点转为vtkVertex
    auto vertexGlyphFilter = vtkSmartPointer<vtkVertexGlyphFilter>::New();
    vertexGlyphFilter->AddInputData(elevationFilter->GetOutput());
    vertexGlyphFilter->Update();

    // 映射器
    auto mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputConnection(vertexGlyphFilter->GetOutputPort()); // 用加了点结构的polydata
    mapper->SetLookupTable(colorLookupTable);
    mapper->Update();

    // Actor
    auto actor = vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);
    actor->GetProperty()->SetPointSize(6);
    actor->GetProperty()->SetRepresentationToPoints(); // 显示为点云

    // 清空旧Actor,设置背景
    renderer_->RemoveAllViewProps();         // 清空旧的视图属性
    renderer_->SetBackground(1.0, 1.0, 1.0); // 设置背景颜色
    renderer_->AddActor(actor);              // 添加点云演员

    addCoordinateAxes();

    addBoundingBoxControlButton(); // 添加边框按钮
    // 添加BoundingBox
    addBoundingBox(transformFilter->GetOutput());

    renderer_->ResetCamera();
    renderWindow_->Render();
    m_pScene->update();
}

.obj格式(mesh)

.obj格式(mesh)文件介绍

.obj格式是一种常见的3D模型文件格式,最初由Wavefront Technologies开发,用于其高级可视化器动画包。它是一种文本文件,用于描述3D几何体的顶点、纹理坐标、顶点法线以及多边形面等信息。.obj格式文件通常与.mtl文件一起使用,.mtl文件用于定义模型的材质。

.obj格式文件广泛应用于3D建模、动画制作、游戏开发等领域,是一种开放且通用的文件格式,支持多种3D建模软件(如Blender、3DS Max、Maya等)的导入和导出。

免费下载.obj格式文件的网站

以下是一些可以免费下载.obj格式文件的网站:

  • Free3D:提供超过17,000个免费的3D模型,涵盖车辆、植物、建筑、人体解剖学等多个类别,支持.obj、.fbx、.3ds等多种格式。
  • TurboSquid:一个知名的3D模型素材网站,提供多种不同格式的3D文件,包括.obj格式,适合游戏开发、建筑设计等领域。
  • Artec 3D:提供由3D扫描仪捕获的高品质3D扫描数据,模型以.obj格式提供,适用于科学和教育领域。
  • 爱给网:提供多种免费的.obj格式3D模型,涵盖游戏、场景、角色等多个类别。

这些网站提供了丰富的.obj格式文件资源,用户可以根据自己的需求选择合适的模型进行下载和使用。


void ThreeDimensionalDisplayPage::loadObjFile(vtkSmartPointer<vtkPolyData> _poly_data)
{
    renderer_->RemoveAllViewProps();
    renderer_->SetBackground(255, 255, 255); // 白色背景

    // 映射器
    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputData(_poly_data);
    mapper->Update();

    // 1. 面Actor
    vtkSmartPointer<vtkActor> surfaceActor = vtkSmartPointer<vtkActor>::New();
    surfaceActor->SetMapper(mapper);
    surfaceActor->GetProperty()->SetColor(0.8, 0.8, 0.8); // 浅灰色
    surfaceActor->GetProperty()->SetOpacity(1.0);
    renderer_->AddActor(surfaceActor);

    // 2. 线框Actor
    vtkSmartPointer<vtkActor> wireframeActor = vtkSmartPointer<vtkActor>::New();
    wireframeActor->SetMapper(mapper);
    wireframeActor->GetProperty()->SetRepresentationToWireframe();
    wireframeActor->GetProperty()->SetColor(0.2, 0.2, 0.2); // 深灰色
    wireframeActor->GetProperty()->SetLineWidth(1.0);
    renderer_->AddActor(wireframeActor);

    // 3. 点Actor
    vtkSmartPointer<vtkActor> pointsActor = vtkSmartPointer<vtkActor>::New();
    pointsActor->SetMapper(mapper);
    pointsActor->GetProperty()->SetRepresentationToPoints();
    pointsActor->GetProperty()->SetPointSize(6);
    pointsActor->GetProperty()->SetColor(0.0, 0.0, 1.0); // 蓝色点
    renderer_->AddActor(pointsActor);

    renderer_->ResetCamera();
    renderWindow_->Render();
    m_pScene->update();
}

.tif(geoTIFF)

GeoTIFF文件格式简介

GeoTIFF是一种基于TIFF(Tagged Image File Format)的地理空间栅格数据存储格式,它扩展了TIFF格式,增加了地理空间参考信息。这种格式广泛应用于地理信息系统(GIS)领域,支持地理坐标、投影信息和栅格数据的存储。

免费下载GeoTIFF文件的途径

  1. 全球离线地图TIF资源
    CSDN博客提供了一个全球离线地图(1-6级)的TIF资源,这些资源适用于离线地图数据的应用场景,如地理信息系统(GIS)和数据分析。资源可通过以下链接访问:全球离线地图(1-6级)TIF资源

  2. 匹兹堡大学比较考古学数据库
    该数据库提供了GEOTIFF格式的GIS数据集,包含数字高程图等数据,适用于考古学和地理研究。相关文件可通过以下链接下载:GIS数据集下载

  3. 今日花园GeoTIFF卫星地图
    提供了带有坐标信息的GeoTIFF格式卫星影像,例如北京18层谷歌卫星地图,适用于测试和研究。下载地址为:测试北京18层

  4. 千图网
    提供了一些TIF格式的图片素材,但部分资源可能需要注册或升级会员才能下载。访问链接:千图网TIF格式图片

注意事项

  • GeoTIFF文件通常需要专业的GIS软件(如ArcGIS、QGIS)来查看和处理。
  • 下载和使用这些资源时,请确保遵守相应的开源许可证或使用条款。

这里代码没用可能不好使,需要再进一步优化

void ThreeDimensionalDisplayPage::loadTifFile(vtkSmartPointer<vtkPolyData> _poly_data)
{
    renderer_->RemoveAllViewProps();
    renderer_->SetBackground(255, 255, 255); // 白色背景

    // 使用 ElevationFilter 对高度进行着色(可选)
    double bounds[6];
    _poly_data->GetBounds(bounds);

    double zRange = bounds[5] - bounds[4];
    if (zRange < 1e-6)
    {
        LOG(WARNING) << "Elevation range too small: " << zRange << ", skipping elevation coloring.";
    }

    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();

    if (zRange >= 1e-6)
    {
        // 使用 ElevationFilter 着色
        vtkNew<vtkElevationFilter> elevationFilter;
        elevationFilter->SetInputData(_poly_data);
        elevationFilter->SetLowPoint(0, 0, bounds[4]);
        elevationFilter->SetHighPoint(0, 0, bounds[5]);
        elevationFilter->Update();
        mapper->SetInputConnection(elevationFilter->GetOutputPort());
        mapper->SetScalarRange(bounds[4], bounds[5]);
    }
    else
    {
        // 不使用 elevationFilter,直接显示
        mapper->SetInputData(_poly_data);
    }

    vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);
    renderer_->AddActor(actor);
    vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
    m_pScene->GetInteractor()->SetInteractorStyle(style);
    m_pScene->GetInteractor()->Initialize();
    renderer_->ResetCamera();
    renderWindow_->Render();
    m_pScene->update();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

奇树谦

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

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

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

打赏作者

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

抵扣说明:

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

余额充值