1.基于Clipping的体绘制裁剪技术

Clipping技术支持VTKImageData和VTKUntructuredGrid数据类型。该功能由vtkAbstractMapper3D类提供,对于那些使用基于OpenGL的硬件裁剪技术的Mapper类,如vtkPolyDataMapper、vtkVolumeTextureMapper2D、VTKProjectedTetrahedraMapper等,当设置的裁剪面个数超过OpenGL支持的个数(一般为6)时,VTK会反馈一个错误;而对于基于软件的裁剪技术的Mapper类,如vtkVolumeRayCastMapper则没有这些限制,可以支持任意多个裁剪面。使用Clipping技术,可以沿着任意方向将图像切开,便于观察体数据内部细节
下面是例程中的一个实验:
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL);
VTK_MODULE_INIT(vtkRenderingFreeType);
VTK_MODULE_INIT(vtkInteractionStyle);#include <vtkSmartPointer.h>
#include <vtkPlane.h>
#include <vtkStructuredPoints.h>
#include <vtkStructuredPointsReader.h>
#include <vtkGPUVolumeRayCastMapper.h>
#include <vtkVolumeProperty.h>
#include <vtkPiecewiseFunction.h>
#include <vtkColorTransferFunction.h>
#include <vtkVolume.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkCamera.h>int main()
{vtkSmartPointer<vtkStructuredPointsReader> reader =vtkSmartPointer<vtkStructuredPointsReader>::New();reader->SetFileName("mummy.128.vtk");reader->Update();vtkSmartPointer<vtkGPUVolumeRayCastMapper> origMapper =vtkSmartPointer<vtkGPUVolumeRayCastMapper>::New();origMapper->SetInputData(reader->GetOutput());vtkSmartPointer<vtkGPUVolumeRayCastMapper> volumeMapper =vtkSmartPointer<vtkGPUVolumeRayCastMapper>::New();volumeMapper->SetInputData(reader->GetOutput());vtkSmartPointer<vtkPlane> plane =vtkSmartPointer<vtkPlane>::New();plane->SetOrigin(120, 120, 0);plane->SetNormal(1, 1, 0);volumeMapper->AddClippingPlane(plane);/*****************************************************************///设置体绘制相关属性vtkSmartPointer<vtkVolumeProperty> volumeProperty =vtkSmartPointer<vtkVolumeProperty>::New();volumeProperty->SetInterpolationTypeToLinear(); //设置线性插值方式volumeProperty->ShadeOn();//开启阴影属性volumeProperty->SetAmbient(0.4);//设置环境温度volumeProperty->SetDiffuse(0.6);//设置漫反射系数volumeProperty->SetSpecular(0.2);//设置镜面反射系数//添加灰度不透明度属性vtkSmartPointer<vtkPiecewiseFunction> compositeOpacity =vtkSmartPointer<vtkPiecewiseFunction>::New();compositeOpacity->AddPoint(70, 0.0);compositeOpacity->AddPoint(90, 0.4);compositeOpacity->AddPoint(180, 0.6);volumeProperty->SetScalarOpacity(compositeOpacity);//添加梯度不同明度属性vtkSmartPointer<vtkPiecewiseFunction> gradientOpacity =vtkSmartPointer<vtkPiecewiseFunction>::New();gradientOpacity->AddPoint(10, 0.0);gradientOpacity->AddPoint(90, 0.5);gradientOpacity->AddPoint(100, 1.0);volumeProperty->SetGradientOpacity(gradientOpacity);//添加颜色传输vtkSmartPointer<vtkColorTransferFunction> color =vtkSmartPointer<vtkColorTransferFunction>::New();color->AddRGBPoint(0, 0, 0, 0);color->AddRGBPoint(64, 1.0, 0.52, 0.3);color->AddRGBPoint(190.0, 1.00, 1.00, 1.00);color->AddRGBPoint(220.0, 0.20, 0.20, 0.20);volumeProperty->SetColor(color);/***********************************************************///渲染管道vtkSmartPointer<vtkVolume> origVolume =vtkSmartPointer<vtkVolume>::New();origVolume->SetMapper(origMapper);origVolume->SetProperty(volumeProperty);vtkSmartPointer<vtkVolume> clippingVolume =vtkSmartPointer<vtkVolume>::New();clippingVolume->SetMapper(volumeMapper);clippingVolume->SetProperty(volumeProperty);/double origView[4] = { 0, 0, 0.5, 1 };double croppingView[4] = { 0.5, 0, 1, 1 };vtkSmartPointer<vtkRenderer> origRender =vtkSmartPointer<vtkRenderer>::New();origRender->AddVolume(origVolume);origRender->SetBackground(1, 1, 0);origRender->SetViewport(origView);vtkSmartPointer<vtkRenderer> clippingRender =vtkSmartPointer<vtkRenderer>::New();clippingRender->AddVolume(clippingVolume);clippingRender->SetBackground(0, 1, 0);clippingRender->SetViewport(croppingView);///vtkSmartPointer<vtkRenderWindow> rw =vtkSmartPointer<vtkRenderWindow>::New();rw->AddRenderer(origRender);rw->AddRenderer(clippingRender);rw->SetWindowName("Cropping Volume");rw->SetSize(640, 320);vtkSmartPointer<vtkRenderWindowInteractor> rwi =vtkSmartPointer<vtkRenderWindowInteractor>::New();rwi->SetRenderWindow(rw);origRender->GetActiveCamera()->SetPosition(0, -1, 0);origRender->GetActiveCamera()->SetFocalPoint(0, 0, 0);origRender->GetActiveCamera()->SetViewUp(0, 0, 1);origRender->GetActiveCamera()->Azimuth(30);origRender->GetActiveCamera()->Elevation(30);origRender->ResetCamera();clippingRender->SetActiveCamera(origRender->GetActiveCamera());rw->Render();rwi->Start();return 0;
}

从上面代码中可以看出,只需定义一个VTKPlane类型的裁剪平面对象,然后通过vtkAbstractMapper3D::AddClippingplane()函数将该平面添加到Mapper对象中即可。

输出结果为:
转换一个角度观察:

2.参看资料

1.《C++ primer》
2.《The VTK User’s Guide – 11thEdition》
3.  张晓东, 罗火灵. VTK图形图像开发进阶[M]. 机械工业出版社, 2015.

VTK修炼之道66:体绘制裁剪_Cripping技术相关推荐

  1. VTK:体绘制裁剪——Clipping技术

    1.基于Clipping的体绘制裁剪技术 Clipping技术支持VTKImageData和VTKUntructuredGrid数据类型.该功能由vtkAbstractMapper3D提供,对于那些使 ...

  2. VTK修炼之道65:体绘制裁剪_Cropping技术

    1.裁剪 对于一些体积比较大,结构比较复杂的体数据进行体绘制的渲染效果难以展示其内部细节,需要用到裁剪技术来渲染部分数据.vtkVolumeMapper类中提供了两种裁剪技术,分别为Cropping和 ...

  3. VTK修炼之道70:体绘制讨论_光照阴影、VTKLODProp3D

    1.光照与阴影 通过VTKVolumeProperty可以设置体绘制阴影效果(Shading).阴影效果主要受环境光系数.散射光系数.反射光系数和高光强度四个参数影响. vtkVolumeProper ...

  4. VTK修炼之道69:体绘制讨论_颜色传输函数

    1.颜色传输函数 颜色传输函数与不透明度传输函数的使用类似,二者的不同之处在于颜色传输函数是将一个标量值映射为颜色值.这个颜色值可以是RGB值,也可以是HSV值. VTK颜色传输函数采用VTKColo ...

  5. VTK修炼之道67:体绘制讨论_不透明度传输函数

    1.vtkVolume vtkVolume类似于几何渲染中的vtkActor,用于表示渲染场景中的对象.除了存储基本变换信息(平移.旋转.缩放等),其内部还存储了两个重要对象.这两个对象分别是vtkA ...

  6. VTK修炼之道64:纹理映射体绘制_三维纹理映射

    1.三维纹理映射 目前市面上的能多先科都是支持三维纹理映射的.利用三维纹理映射,将体数据映射至一组与视图平面平行的多边形,避免了二维纹理映射方法中因为纹理图像的切换造成的瑕疵.VTK中三维纹理映射体绘 ...

  7. VTK修炼之道63:纹理映射体绘制_二维纹理映射

    1.纹理映射体绘制 基于软件实现的光线投影体绘制算法计算量非常大,不利于进行实时渲染.因此,目前体绘制经常使用图形硬件利用纹理映射来加速. 其主要原理是将三维体数据作为纹理装载入硬件缓存中,利用硬件来 ...

  8. VTK修炼之道62:体绘制_固定点光线投影体绘制与GPU加速光线投影体绘制

    1.固定点光线投影算法 vtkFixedPointVolumeRayCastMapper是一个较好的vtkVolumeRayCastMapper的替代者.该类能够实现基于Alpha合成的体绘制方法和最 ...

  9. VTK修炼之道61:体绘制_光线投影+最大密度投影+等值面法

    1.vtkVolumeMapper vtkVolumeMapper是所有体绘制Mapper类的虚基类,提供接口函数,并由其子类实现具体功能.该类的继承关系如下图所示: 应该掌握一些常用的体绘制类. 2 ...

最新文章

  1. 任正非最新讲话透露:华为在加快开发统一的人工智能平台
  2. php7 configure: error: Cannot find OpenSSL‘s <evp.h> 问题解决
  3. 5m 云服务器2核4g_阿里云服务器2核4gb
  4. mysql的各种语句_MySql常用操作SQL语句汇总
  5. 使用jsonp及jquery的$.ajax解决跨域问题
  6. 不懂电容原理?那是你没看到这些动图
  7. 输入框限制只能输入数字,正数、负数、0,最多两位小数;数字输入框可以输入负数,并最多保留两位小数;el-number-input去掉四舍五入和自动补齐小数;
  8. 2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018) - 4.28
  9. 离异美女跟程序员相亲,结果自我介绍完就被秒删:三无送个儿
  10. 如果服务器开机显示NObootable,电脑开机出现“No bootable device”的解决办法
  11. 谈谈文本匹配和多轮检索
  12. 【早知云世】当AI遇上云计算,其应用短板与长处
  13. CoreData 执行executefetchrequest卡死解决办法
  14. steamcommunity 302占用端口
  15. 项目管理工具四、有效管理的PDCA原则
  16. trouble processing xxxx.class: Ill-advised or mistaken usage of a core class (java.* or javax.*)
  17. 论文 | 深度学习股票预测
  18. PDF转CAD在线怎么转换?分享个在线转换的方法
  19. STM32F429_DWM物联网开发板
  20. ubuntu如何设置默认程序打开方式

热门文章

  1. IEnumerable 使用foreach 详解
  2. SpringMVC数据库链接池,以及其他相关配置
  3. 代码:准确算出用户输入的日期是星期几!
  4. android aidl调用进程间服务的方法
  5. Virtual Machine Manager 2008 2008 R2系列之安装部署
  6. IPv6推进将非常漫长
  7. NYOJ 662 汽水瓶
  8. cmd mysql uroot p不是内部或外部命令...
  9. 解决properties文件乱码问题(eclipse和MyEclipse)
  10. (四)JS学习笔记 - 模式 - 观察者模式