1.多分辨率处理策略

模型抽取Decimation)和细化(Subdivision)是两个相反的操作,是三角形网格模型多分辨率处理中的两个重要的操作。使用这两个操作可以在保持模型拓扑结构的同时,得到不同分辨率的网格模型。模型抽取的作用是剑豪模中的点数据和单元数据,便于模型的后续处理与交互渲染,这类似于图像时数据的将采样。而网格细化则是利用一定的细化规则。而网格细化则是利用一定的细化规则,在给定的初始化
网格中插入新的点,从而不断细化出新的网格单元,在极限细化情况下,该网格能够收敛一个光滑的曲面。

2.网格抽取(Decimation)

2.1VTKDecimatePro
VTK 中有三个网格抽取l类:vtkDecimatePro、VTKQuadricDecimation、vtkQuadricClustering.
vtkDecimatePro是最常用的,该处理方法的原理,是一种塌陷的方法来删除点和单元,处理的速度比较快,而且可以方便的控制网格抽取的幅度,得到不同级别的模型数据。

使用方法:
vtkSmartPoint<vtkDecimatePro> decimate = vtkSmartPointer<vtkDecimatePro>::New();
decimate->SetInput(input);
decimate->SetTargetReduction(0.6);
decimate->update();

vtkDecimatePro接收一个单元为三角网格的vtkPolyData数据,其中函数SetTargetReduction()用于设置变量TargetReduction的大小,将网格面片抽取的比例控制在0~1.这里设置为0.6,说明有60%的三角面片单元将被移除。使用这个函数可以得到不同程度的简化网格模型,不过,为确保函数效果,一般需要满足下面四个条件:
vtkDecimatePro需要支持模型拓扑的改变,即将PreserveTopology变量的值设置为FALSE。
支持网格分裂,即Splitting变量的值设置为TRUE。
支持修改模型的边界,即将变量BoundaryVetexDeletion的值设置为TRUE。
设置最大误差变量MaximumError的值为VTK_DOUBLE_MAX。

2.2 vtkQuadricDecimation

该类也可以实现三角形网格简化,并能较好地逼近原模型.该类虽然也提供了SetTargetReduction()函数用于设置模型简化程度,但是最终简化率并非严格等于程序中设置的简化率。可以通过GetActualReduction()函数来获取最终模型简化率。

2.3 vtkQuadricClustering

该类是三种实现模型抽取算法中最快的一种,能够处理大数据模型。通过StartAppend()、Append()、EndAppend()函数可以将整个模型分为多个网格片处理,从而避免一次性处理整个模型,减少内存开支,提高处理效率。

3.vtkDecimatePro用于模型抽取实验

图像简化之后的效果:

#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkRenderingFreeType);
VTK_MODULE_INIT(vtkInteractionStyle);#include <vtkSmartPointer.h>
#include <vtkPolyDataReader.h>
#include <vtkDecimatePro.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkCamera.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>int main()
{vtkSmartPointer<vtkPolyDataReader> reader =vtkSmartPointer<vtkPolyDataReader>::New();reader->SetFileName("data/fran_cut.vtk");reader->Update();vtkSmartPointer<vtkPolyData> original = reader->GetOutput();std::cout << "抽取前" << "-----------------------" << std::endl;std::cout << "模型点数为: " << original->GetNumberOfPoints() << std::endl;std::cout << "模型面数为: " << original->GetNumberOfPolys() << std::endl;vtkSmartPointer<vtkDecimatePro> decimation =vtkSmartPointer<vtkDecimatePro>::New();decimation->SetInputData(reader->GetOutput());decimation->SetTargetReduction(0.6);decimation->Update();vtkSmartPointer<vtkPolyData> decimated = decimation->GetOutput();std::cout << "抽取后" << "-----------------------" << std::endl;std::cout << "模型点数为:" << decimated->GetNumberOfPoints() << std::endl;std::cout << "模型面数为:" << decimated->GetNumberOfPolys() << std::endl;///vtkSmartPointer<vtkPolyDataMapper> origMapper =vtkSmartPointer<vtkPolyDataMapper>::New();origMapper->SetInputData(reader->GetOutput());vtkSmartPointer<vtkActor> origActor =vtkSmartPointer<vtkActor>::New();origActor->SetMapper(origMapper);vtkSmartPointer<vtkPolyDataMapper> deciMapper =vtkSmartPointer<vtkPolyDataMapper>::New();deciMapper->SetInputData(decimation->GetOutput());vtkSmartPointer<vtkActor> deciActor =vtkSmartPointer<vtkActor>::New();deciActor->SetMapper(deciMapper);///double leftViewport[4] = { 0.0, 0.0, 0.5, 1.0 };double rightViewport[4] = { 0.5, 0.0, 1.0, 1.0 };vtkSmartPointer<vtkRenderer> leftRenderer =vtkSmartPointer<vtkRenderer>::New();leftRenderer->SetViewport(leftViewport);leftRenderer->AddActor(origActor);leftRenderer->SetBackground(1.0, 0, 0);vtkSmartPointer<vtkRenderer> rightRenderer =vtkSmartPointer<vtkRenderer>::New();rightRenderer->SetViewport(rightViewport);rightRenderer->AddActor(deciActor);rightRenderer->SetBackground(0, 0, 0);leftRenderer->GetActiveCamera()->SetPosition(0, -1, 0);leftRenderer->GetActiveCamera()->SetFocalPoint(0, 0, 0);leftRenderer->GetActiveCamera()->SetViewUp(0, 0, 1);leftRenderer->GetActiveCamera()->Azimuth(30);leftRenderer->GetActiveCamera()->Elevation(30);leftRenderer->ResetCamera();//刷新照相机rightRenderer->SetActiveCamera(leftRenderer->GetActiveCamera());//同步显示///vtkSmartPointer<vtkRenderWindow> rw =vtkSmartPointer<vtkRenderWindow>::New();rw->AddRenderer(leftRenderer);rw->AddRenderer(rightRenderer);rw->SetSize(640, 320);rw->SetWindowName("PolyData Decimation");vtkSmartPointer<vtkRenderWindowInteractor> rwi =vtkSmartPointer<vtkRenderWindowInteractor>::New();rwi->SetRenderWindow(rw);rwi->Start();return 0;
}

VTL:图形基本操作进阶——多分辨率策略(模型抽取的三种方法)相关推荐

  1. VTK修炼之道52:图形基本操作进阶_多分辨率策略(模型抽取的三种方法)

    1.多分辨率处理策略 模型抽取(Decimation)和细化(Subdivision)是两个相反的操作,是三角形网格模型多分辨处理中的两个重要操作.使用这两个操作可以在保持模型拓扑结构的同时,得到不同 ...

  2. 中文文本关键词抽取的三种方法-python

    利用Python实现中文文本关键词抽取的三种方法 转自github 文本关键词抽取,是对文本信息进行高度凝练的一种有效手段,通过3-5个词语准确概括文本的主题,帮助读者快速理解文本信息.目前,用于文本 ...

  3. 基于Python实现中文文本关键词抽取的三种方法 课程报告+项目源码及数据

    资源下载地址:https://download.csdn.net/download/sheziqiong/85737856 资源下载地址:https://download.csdn.net/downl ...

  4. 中文文本关键词抽取的三种方法(TF-IDF、TextRank、word2vec)

    链接地址:https://github.com/AimeeLee77/keyword_extraction 1.基于TF-IDF的文本关键词抽取方法 词频(Term Frequency,TF) 指某一 ...

  5. python模型调参三种方法

    1.机器学习常用三种调参方法:网格搜索.随机搜索和贝叶斯调参 2.网格搜索是遍历式搜索方法,效率较低,资源消耗多 3.网格搜索和随机搜索都没有考虑前面搜索的先验知识 4.贝叶斯调参的原理是贝叶斯优化, ...

  6. VTK修炼之道53:图形基本操作进阶_多分辨率策略(模型细化的三种方法)

    1.模型细化 vtk中实现网格细化的累有vtkLinearSubdivisionFilter.vtkLoopsubdivisionFilter.vtkButterflySubdivisionFilte ...

  7. VTK修炼之道50:图形基本操作进阶_网格模型的特征边 与 封闭性检测

    1.封闭性检测 由于受原始数据.重建方法的限制,得到的网格模型并不是封闭的.有时为了显示或者处理某些要求,需要网格必须是封闭的. 封闭性网格应该比较好理解,比如一个球形网格. 1.1网格模型边的分类 ...

  8. 进一步认识Deepchem的分子特征化: 将化学分子结构作为到随机森林\CNN\RNN\GNN等机器学习模型输入的三种方法

    '''by wufeil进一步认识分子特征化:将化学分子结构作为到随机森林\CNN\RNN\GNN等机器学习模型的输入如何将一个分子SMile表示的分子输入到机器学习/深度学习中呢?例如:CH3CH3 ...

  9. 机器学习模型部署的三种方法

    "企业机器学习需要从数据工程和数据平台的角度看待大局[...],"贾斯汀·诺曼(Justin Norman)在今年巴塞罗那的DataWorks峰会上关于机器学习模型的部署的演讲中说 ...

最新文章

  1. windows10下pip安装速度慢的解决办法
  2. 问:Linux下Chrome标题栏中文乱码
  3. python处理excel文件-python读取excel文件
  4. Linux颜色所代表的文件类型
  5. 基本Socket通信流程
  6. webmin升级php,Webmin php-lib.pl修改
  7. 将Source Insight里面着色代码拷贝到word里面的方法
  8. python+ BeautifulSoup抓取“全国行政区划信息查询平台”的省市区信息
  9. ASP.NET Forms验证 实现子域名(SubDomain)共享登陆下的缺陷 [转]
  10. linux-进程的理解-进程的状态与生命周期
  11. oracle中序号生成器,Oracle序列生成器
  12. 魅族m8开发 step by step(1)(让程序跑起来)
  13. linux上禅道源码安装步骤
  14. [转载]宋宝华:世上最好的共享内存(Linux共享内存最透彻的一篇)
  15. web渗透测试----14、CSRF(跨站请求伪造攻击)
  16. 学习PLC不可错过的15个基础!
  17. 隐语义模型(LFM)
  18. linux下搭建ecshop教程,linux下安装ecshop,
  19. 关于进程wuauclt.exe
  20. 【基础知识】Dom基础

热门文章

  1. 安兔兔跑分UX视频兼容性分值为0
  2. JVM成神之路-JVM引用模型
  3. 多级列表为“第一章”下产生含“阿拉伯数字章节号”的题注(word题注自定义)
  4. iOS第三方插件——Masonry详解
  5. linux服务器新装hba卡,Linux更换HBA卡后重新扫盘指令|或者新增HBA卡
  6. java怎么实现按键音_实例:使用Javascript制作声音按钮
  7. 彩虹六号mute影响服务器笑话,有哪些《彩虹六号》玩家才懂的笑话?
  8. 在苹果MacOS Majave10.14.6系统中安装SRIM 2008软件
  9. html个人信息表制作(适合初学者)
  10. 《Android源代码设计模式解析与实战》读书笔记(十四)