当前位置: 首页 > article >正文

第04章 17 实现一个逐步收缩球体的视觉效果

结合vtkSphereSourcevtkShrinkFiltervtkElevationFilter,我们可以实现一个逐步收缩球体的视觉效果,并在球体表面应用高程映射(Elevation Mapping)。vtkElevationFilter用于根据球体的某个方向(如Z轴)生成颜色或标量值,使球体表面呈现出从低到高的渐变效果。

下面是一个示例代码,展示了如何逐次缩小球体并应用高程映射。


示例代码

#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>
#include <vtkShrinkFilter.h>
#include <vtkElevationFilter.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>

int main(int, char *[])
{
    // 创建球体源
    vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New();
    sphereSource->SetRadius(1.0); // 球体半径
    sphereSource->SetThetaResolution(30); // 经度方向的细分
    sphereSource->SetPhiResolution(30); // 纬度方向的细分
    sphereSource->Update();

    // 创建收缩滤波器
    vtkSmartPointer<vtkShrinkFilter> shrinkFilter = vtkSmartPointer<vtkShrinkFilter>::New();
    shrinkFilter->SetInputConnection(sphereSource->GetOutputPort());
    shrinkFilter->SetShrinkFactor(0.7); // 设置收缩因子为0.7
    shrinkFilter->Update();

    // 创建高程滤波器
    vtkSmartPointer<vtkElevationFilter> elevationFilter = vtkSmartPointer<vtkElevationFilter>::New();
    elevationFilter->SetInputConnection(shrinkFilter->GetOutputPort());
    elevationFilter->SetLowPoint(0.0, 0.0, -1.0); // 低点的坐标
    elevationFilter->SetHighPoint(0.0, 0.0, 1.0); // 高点的坐标
    elevationFilter->SetScalarRange(-1.0, 1.0); // 标量范围
    elevationFilter->Update();

    // 创建Mapper和Actor
    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputConnection(elevationFilter->GetOutputPort());
    mapper->ScalarVisibilityOn(); // 开启标量可视化

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

    // 设置Renderer和RenderWindow
    vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
    renderer->AddActor(actor);
    renderer->SetBackground(1.0, 1.0, 1.0); // 背景颜色为白色

    vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
    renderWindow->AddRenderer(renderer);
    renderWindow->SetSize(800, 600);

    // 设置RenderWindowInteractor
    vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
    interactor->SetRenderWindow(renderWindow);

    // 初始化并启动交互
    renderWindow->Render();
    interactor->Initialize();
    interactor->Start();

    return 0;
}


代码说明

  1. 创建球体源 (vtkSphereSource)

    • vtkSphereSource用于生成一个球体。通过SetRadiusSetThetaResolutionSetPhiResolution可以控制球体的半径和细分程度。
  2. 收缩球体 (vtkShrinkFilter)

    • vtkShrinkFilter将球体表面进行收缩。通过SetShrinkFactor设置收缩因子(例如0.7表示收缩到原始大小的70%)。收缩的原理是将每个单元的点向其质心移动。
  3. 应用高程映射 (vtkElevationFilter)

    • vtkElevationFilter根据球体的Z轴坐标生成标量值。通过SetLowPointSetHighPoint指定低点和高点的坐标,标量值会根据点的Z坐标在低值和高值之间插值。
    • SetScalarRange设置标量值的范围(例如-1.01.0)。
  4. 创建Mapper和Actor

    • vtkPolyDataMapper将几何数据和标量数据映射到Actor上。ScalarVisibilityOn启用标量可视化,使颜色根据标量值变化。
  5. 设置Renderer和RenderWindow

    • 将Actor添加到Renderer中,并设置背景颜色。
  6. 启动交互

    • 初始化RenderWindowInteractor并启动交互循环,用户可以通过鼠标操作视图。

作用原理

  1. vtkShrinkFilter的作用原理

    • vtkShrinkFilter计算每个单元的质心,然后将单元内的每个点向质心移动一定的比例。收缩因子shrinkFactor决定了移动的比例。例如,shrinkFactor = 0.7表示点向质心移动70%的距离。
  2. vtkElevationFilter的作用原理

    • vtkElevationFilter根据几何体的坐标生成标量值。它通过设置低点和高点(LowPointHighPoint),计算每个点的标量值。标量值在低点和高点之间线性插值。
    • 标量值可以用来映射颜色、透明度或其他属性。
  3. 逐次缩小球体的实现

    • 通过不断调整SetShrinkFactor的值,可以实现逐次缩小球体的效果。每次缩小后,球体的表面会向质心移动,同时保留原始的拓扑结构。

运行效果

运行此代码后,你将看到一个红色的球体,其表面被收缩到原始大小的70%。球体的表面颜色根据Z轴方向的高低变化,呈现从低点到高点的渐变效果。通过调整SetShrinkFactor的值,可以进一步控制收缩程度。


总结

  • vtkShrinkFilter用于收缩几何体的表面,保留拓扑结构。
  • vtkElevationFilter根据几何体的坐标生成标量值,实现高程映射。
  • 结合这两个滤波器,可以创建动态的几何变换效果,如逐次缩小球体并应用渐变颜色映射。

这种方法适用于需要动态调整几何形状并添加视觉效果的应用场景。


http://www.kler.cn/a/520955.html

相关文章:

  • C基础寒假练习(4)
  • 16、Spring 框架基础:开启 Java 企业级开发的新时代
  • 卡特兰数学习
  • PyCharm介绍
  • 《剪映5.9官方安装包》免费自动生成字幕
  • 软件开发中的密码学(国密算法)
  • 分布式系统学习:小结
  • 从项目复查做一些TypeScript使用上的总结
  • 多模态论文笔记——VDT
  • ZooKeeper 数据模型
  • react-native网络调试工具Reactotron保姆级教程
  • java8-日期时间Api
  • 83,【7】BUUCTF WEB [MRCTF2020]你传你[特殊字符]呢
  • PyCharm接入DeepSeek实现AI编程
  • 【2024年华为OD机试】 (C卷,200分)- 机器人走迷宫(JavaScriptJava PythonC/C++)
  • 董事会办公管理系统的需求设计和实现
  • 基于SMPL的三维人体重建-深度学习经典方法之VIBE
  • React和Vue有什么区别,如何选择?
  • 【2025年数学建模美赛C题】第1-5问F奖解题思路+高级绘图+可运行代码
  • 【Vim Masterclass 笔记26】S11L46:Vim 插件的安装、使用与日常管理
  • 【React】PureComponent 和 Component 的区别
  • C++和Python实现SQL Server数据库导出数据到S3并导入Redshift数据仓库
  • 基于paddleocr的表单关键信息抽取
  • Babylon.js 中的 setHardwareScalingLevel和getHardwareScalingLevel:作用与配合修改内容
  • Edge-TTS在广电系统中的语音合成技术的创新应用
  • Nginx配置中的常见错误:SSL参数解析