vtk剪切

来源:互联网 发布:大数据综合实验区 编辑:程序博客网 时间:2024/04/29 19:19

1.裁剪

对于一些体积比较大,结构比较复杂的体数据进行体绘制的渲染效果难以展示其内部细节,需要用到裁剪技术来渲染部分数据。vtkVolumeMapper类中提供了两种裁剪技术,分别为Cropping和Clipping。
Cropping技术只支持VTKImageData数据的裁剪。该方法在每个坐标轴上定义两个裁剪面,共有6个裁剪面(xmin,xmax,ymin,ymax,zmin,zmax)。将三维空间分为27个可视区域。这些裁剪面仅与数据的原点和像素尺寸有关,而不依赖于数据的任何坐标运算,因此可以使用27位数字来定义这些区域,每一位表示一个区域。当某位上数字为1时,说明显示其对应的区域。在这些区域中,小于(xmin,ymin)的区域为第一位,然后根据先X方向,再Y轴方向,最后Z轴方向的顺序来定义每个区域的位号。例如,当只显示中间区域时,其对应的27位数字为0x0002000.
2.基于Cropping的裁剪技术
vtkVolumeMapper中定义了Cropping接口函数,使用Cropping进行裁剪的代码如下:
[cpp] view plain copy
  1. <span style="font-size:18px;">volumeMapper->SetCropping(1);//开启Cropping功能  
  2. volumeMapper->SetCroppingRegionPlanes(50, 150, 50, 200, 50, 150);  
  3. volumeMapper->SetCroppingRegionFlags(0x0002000);</span>  
其中:
  • vtkVolumeMapper::SetCropping(1),设置裁剪功能;
  • vtkVolumeMapper::SetCroppingRegionPlanes(),设置三个坐标轴上六个裁剪面位置。
  • vtkVolumeMapper::SetCroppingRegionFlag(),设置显示区域标记。
此外,该类也提供了其他成员函数设置显示区域,避免自行计算显示区域标记:
  • SetCroppingRegionFlagsToSubVolume();
  • SetCroppingRegionFlagsToFence();
  • SetCroppingRegionFlagsToInvertedFence();
  • SetCroppingRegionFlagsToCross();
  • SetCroppingRegionFlagsToInvertedCross();
示例代码如下:
[cpp] view plain copy
  1. <span style="font-size:18px;">#include <vtkAutoInit.h>  
  2. VTK_MODULE_INIT(vtkRenderingOpenGL);  
  3. VTK_MODULE_INIT(vtkRenderingVolumeOpenGL);  
  4. VTK_MODULE_INIT(vtkRenderingFreeType);  
  5. VTK_MODULE_INIT(vtkInteractionStyle);  
  6.   
  7.   
  8. #include <vtkSmartPointer.h>  
  9. #include <vtkStructuredPoints.h>//vtkStructuredPointsReader* -> vtkGPUVolumeRayCastMapper*  
  10. #include <vtkStructuredPointsReader.h>  
  11. #include <vtkGPUVolumeRayCastMapper.h>  
  12. #include <vtkVolumeProperty.h>  
  13. #include <vtkPiecewiseFunction.h>  
  14. #include <vtkColorTransferFunction.h>  
  15. #include <vtkVolume.h>  
  16. #include <vtkRenderer.h>  
  17. #include <vtkRenderWindow.h>  
  18. #include <vtkRenderWindowInteractor.h>  
  19. #include <vtkCamera.h>  
  20.   
  21.   
  22. int main()  
  23. {  
  24.     vtkSmartPointer<vtkStructuredPointsReader> reader =  
  25.         vtkSmartPointer<vtkStructuredPointsReader>::New();  
  26.     reader->SetFileName("mummy.128.vtk");  
  27.     reader->Update();  
  28.   
  29.   
  30.     vtkSmartPointer<vtkGPUVolumeRayCastMapper> origMapper =  
  31.         vtkSmartPointer<vtkGPUVolumeRayCastMapper>::New();  
  32.     origMapper->SetInputData(reader->GetOutput());  
  33.   
  34.   
  35.     vtkSmartPointer<vtkGPUVolumeRayCastMapper> volumeMapper =  
  36.         vtkSmartPointer<vtkGPUVolumeRayCastMapper>::New();  
  37.     volumeMapper->SetInputData(reader->GetOutput());  
  38.     volumeMapper->SetCropping(1);//开启Cropping功能  
  39.     volumeMapper->SetCroppingRegionPlanes(50, 150, 50, 200, 50, 150);  
  40.     volumeMapper->SetCroppingRegionFlags(0x0002000);  
  41.     /*****************************************************************/  
  42.     //设置体绘制相关属性  
  43.     vtkSmartPointer<vtkVolumeProperty> volumeProperty =  
  44.         vtkSmartPointer<vtkVolumeProperty>::New();  
  45.     volumeProperty->SetInterpolationTypeToLinear(); //设置线性插值方式  
  46.     volumeProperty->ShadeOn();//开启阴影属性  
  47.     volumeProperty->SetAmbient(0.4);//设置环境温度  
  48.     volumeProperty->SetDiffuse(0.6);//设置漫反射系数  
  49.     volumeProperty->SetSpecular(0.2);//设置镜面反射系数  
  50.     //添加灰度不透明度属性  
  51.     vtkSmartPointer<vtkPiecewiseFunction> compositeOpacity =  
  52.         vtkSmartPointer<vtkPiecewiseFunction>::New();  
  53.     compositeOpacity->AddPoint(70, 0.0);  
  54.     compositeOpacity->AddPoint(90, 0.4);  
  55.     compositeOpacity->AddPoint(180, 0.6);  
  56.     volumeProperty->SetScalarOpacity(compositeOpacity);  
  57.     //添加梯度不同明度属性  
  58.     vtkSmartPointer<vtkPiecewiseFunction> gradientOpacity =  
  59.         vtkSmartPointer<vtkPiecewiseFunction>::New();  
  60.     gradientOpacity->AddPoint(10, 0.0);  
  61.     gradientOpacity->AddPoint(90, 0.5);  
  62.     gradientOpacity->AddPoint(100, 1.0);  
  63.     volumeProperty->SetGradientOpacity(gradientOpacity);  
  64.     //添加颜色传输  
  65.     vtkSmartPointer<vtkColorTransferFunction> color =  
  66.         vtkSmartPointer<vtkColorTransferFunction>::New();  
  67.     color->AddRGBPoint(0, 0, 0, 0);  
  68.     color->AddRGBPoint(64, 1.0, 0.52, 0.3);  
  69.     color->AddRGBPoint(190.0, 1.00, 1.00, 1.00);  
  70.     color->AddRGBPoint(220.0, 0.20, 0.20, 0.20);  
  71.     volumeProperty->SetColor(color);  
  72.     /***********************************************************/  
  73.     //渲染管道  
  74.     vtkSmartPointer<vtkVolume> origVolume =  
  75.         vtkSmartPointer<vtkVolume>::New();  
  76.     origVolume->SetMapper(origMapper);  
  77.     origVolume->SetProperty(volumeProperty);  
  78.   
  79.   
  80.     vtkSmartPointer<vtkVolume> croppingVolume =  
  81.         vtkSmartPointer<vtkVolume>::New();  
  82.     croppingVolume->SetMapper(volumeMapper);  
  83.     croppingVolume->SetProperty(volumeProperty);  
  84.   
  85.   
  86.     /////////////////////////////////  
  87.     double origView[4] = { 0, 0, 0.5, 1 };  
  88.     double croppingView[4] = { 0.5, 0, 1, 1 };  
  89.     vtkSmartPointer<vtkRenderer> origRender =  
  90.         vtkSmartPointer<vtkRenderer>::New();  
  91.     origRender->AddVolume(origVolume);  
  92.     origRender->SetBackground(1, 1, 0);  
  93.     origRender->SetViewport(origView);  
  94.   
  95.   
  96.     vtkSmartPointer<vtkRenderer> croppingRender =  
  97.         vtkSmartPointer<vtkRenderer>::New();  
  98.     croppingRender->AddVolume(croppingVolume);  
  99.     croppingRender->SetBackground(0, 1, 0);  
  100.     croppingRender->SetViewport(croppingView);  
  101.     ///////////////////////////////////  
  102.     vtkSmartPointer<vtkRenderWindow> rw =  
  103.         vtkSmartPointer<vtkRenderWindow>::New();  
  104.     rw->AddRenderer(origRender);  
  105.     rw->AddRenderer(croppingRender);  
  106.     rw->SetWindowName("Cropping Volume");  
  107.     rw->SetSize(640, 320);  
  108.   
  109.   
  110.     vtkSmartPointer<vtkRenderWindowInteractor> rwi =  
  111.         vtkSmartPointer<vtkRenderWindowInteractor>::New();  
  112.     rwi->SetRenderWindow(rw);  
  113.   
  114.   
  115.     origRender->GetActiveCamera()->SetPosition(0, -1, 0);  
  116.     origRender->GetActiveCamera()->SetFocalPoint(0, 0, 0);  
  117.     origRender->GetActiveCamera()->SetViewUp(0,0,1);  
  118.     origRender->GetActiveCamera()->Azimuth(30);  
  119.     origRender->GetActiveCamera()->Elevation(30);  
  120.     origRender->ResetCamera();  
  121.     croppingRender->SetActiveCamera(origRender->GetActiveCamera());  
  122.       
  123.     rw->Render();  
  124.     rwi->Start();  
  125.     return 0;  
  126. }</span>  
输出结果如下:
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 党关系丢了10年怎么办? 离婚后生孩子怎么办出生证明 注册公司没有注册地址怎么办 银行流水不够2倍怎么办 个体户小店怎么办五险 姓和名五行相克怎么办? 三星s7刷机后计算器没有了怎么办 线雕鼻子山根鼓怎么办 在日本没有日币怎么办 明知合同回扣特别高怎么办 医院药品断货了怎么办 空腹吃菠萝胃疼怎么办 小孩黑户口怎么办上户 别人说名字起大了怎么办? 念佛号时心老是不集中怎么办 扑lv期嗓子痛头痛怎么办 公众号忘记了账号怎么办 公众号账号密码忘记了怎么办 现实生活被小人缠上怎么办 五行缺木和水怎么办 八字火旺的人怎么办 综合旺衰得分负怎么办 妈妈误打死一只黄鼠狼怎么办 油笔画在白墙上怎么办 壁纸上的水彩笔怎么办 隐形拉链头脱了怎么办 拉链的一边掉了怎么办 帝豪gs加了乙醇汽油怎么办 命理五行缺木怎么办 微信改名含有特殊符号怎么办 户口名字打错了怎么办 寻仙会心几率差怎么办 注册商标下来了没收到怎么办 金融公司倒闭欠的钱怎么办 买车贷款被骗了怎么办 定投终止后钱怎么办 受到小贷公司催款威胁怎么办 合同保证金单据丢了怎么办 公司注销期间发现欠税怎么办 公司注销后银行账户怎么办 注销公司营业执照和公章丢失怎么办