基于C++的VTK8学习笔记4(VTK体绘制)

    技术2025-09-13  58

    VTK资料分享:张晓东的《VTK图形图像开发进阶》全套资料(包含书籍电子版,配套每章节所有源码、实现效果图和工程配置文件)

    水灵VTK学习全套资料(包含全部视频、PPT、源码和每个项目对应的工程配置文件CmakeLists.txt)

    水灵VT视频在线观看本文参考的主要是张晓东的《VTK图形图像开发进阶》和水灵的视频Study VTK Together。使用的平台是VS2019+VTK8.2

     

    VTK系列目录:

    1 VTK基本概念

    2 VTK图像处理

    3 VTK图形处理

    4 VTK体绘制

     

    4 VTK体绘制

    实例64:体绘制管线(光线投影法体绘制) 实例65:最大密度投影法体绘制 实例66:GPU加速光线投影体绘制 实例67:裁剪 实例68:透明度

     

    实例64:体绘制管线(光线投影法体绘制)

    #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL2); VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2); //错误:no override found for 'vtkRayCastImageDisplayHelper'. VTK_MODULE_INIT(vtkRenderingFreeType); VTK_MODULE_INIT(vtkInteractionStyle); #include <vtkSmartPointer.h> #include <vtkStructuredPoints.h> #include <vtkStructuredPointsReader.h> #include <vtkFixedPointVolumeRayCastMapper.h> #include <vtkColorTransferFunction.h> #include <vtkPiecewiseFunction.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkVolumeProperty.h> #include <vtkAxesActor.h> #include <vtkOrientationMarkerWidget.h> int main(int argc, char* argv[]) { vtkSmartPointer<vtkStructuredPointsReader> reader = vtkSmartPointer<vtkStructuredPointsReader>::New(); reader->SetFileName("C:\\Users\\Administrator\\Desktop\\VTK2\\hellovtk\\vtk_图像处理学习\\第七章_VTK体绘制\\data\\mummy.128.vtk"); reader->Update(); vtkSmartPointer<vtkFixedPointVolumeRayCastMapper> volumeMapper = vtkSmartPointer<vtkFixedPointVolumeRayCastMapper>::New(); volumeMapper->SetInputData(reader->GetOutput()); //设置光线采样距离 //volumeMapper->SetSampleDistance(volumeMapper->GetSampleDistance()*4); //设置图像采样步长 //volumeMapper->SetAutoAdjustSampleDistances(0); //volumeMapper->SetImageSampleDistance(4); /*************************************************************************/ 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.00); compositeOpacity->AddPoint(90, 0.40); compositeOpacity->AddPoint(180, 0.60); volumeProperty->SetScalarOpacity(compositeOpacity); //设置不透明度传输函数 //compositeOpacity->AddPoint(120, 0.00);//测试隐藏部分数据,对比不同的设置 //compositeOpacity->AddPoint(180, 0.60); //volumeProperty->SetScalarOpacity(compositeOpacity); //设置梯度不透明属性 vtkSmartPointer<vtkPiecewiseFunction> volumeGradientOpacity = vtkSmartPointer<vtkPiecewiseFunction>::New(); volumeGradientOpacity->AddPoint(10, 0.0); volumeGradientOpacity->AddPoint(90, 0.5); volumeGradientOpacity->AddPoint(100, 1.0); volumeProperty->SetGradientOpacity(volumeGradientOpacity);//设置梯度不透明度效果对比 //设置颜色属性 vtkSmartPointer<vtkColorTransferFunction> color = vtkSmartPointer<vtkColorTransferFunction>::New(); color->AddRGBPoint(0.000, 0.00, 0.00, 0.00); color->AddRGBPoint(64.00, 1.00, 0.52, 0.30); 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> volume = vtkSmartPointer<vtkVolume>::New(); volume->SetMapper(volumeMapper); volume->SetProperty(volumeProperty); vtkSmartPointer<vtkRenderer> ren = vtkSmartPointer<vtkRenderer>::New(); ren->SetBackground(0, 1, 0); ren->AddVolume(volume); vtkSmartPointer<vtkRenderWindow> rw = vtkSmartPointer<vtkRenderWindow>::New(); rw->AddRenderer(ren); rw->SetSize(640, 480); rw->Render(); rw->SetWindowName("VolumeRendering PipeLine"); vtkSmartPointer<vtkRenderWindowInteractor> rwi = vtkSmartPointer<vtkRenderWindowInteractor>::New(); rwi->SetRenderWindow(rw); /********************************************************************************/ //vtkSmartPointer<vtkAxesActor> axes = vtkSmartPointer<vtkAxesActor>::New(); //axes->SetScale(10); //vtkSmartPointer<vtkOrientationMarkerWidget> widget = // vtkSmartPointer<vtkOrientationMarkerWidget>::New(); //widget->SetOutlineColor(1, 1, 1); //widget->SetViewport(0, 0, 0.2, 0.2); //widget->SetOrientationMarker(axes); //widget->SetInteractor(rwi); //widget->SetEnabled(1); //widget->InteractiveOn(); ren->ResetCamera(); rw->Render(); rwi->Start(); return 0; }

     

                              

    实例65:最大密度投影法体绘制

    #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL2); VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2); //错误:no override found for 'vtkRayCastImageDisplayHelper'. VTK_MODULE_INIT(vtkRenderingFreeType); VTK_MODULE_INIT(vtkInteractionStyle); #include <vtkSmartPointer.h> #include <vtkImageData.h> #include <vtkStructuredPoints.h> #include <vtkStructuredPointsReader.h> #include <vtkFixedPointVolumeRayCastMIPHelper.h> #include <vtkFixedPointVolumeRayCastMapper.h> #include <vtkColorTransferFunction.h> #include <vtkPiecewiseFunction.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkVolumeProperty.h> #include <vtkAxesActor.h> #include <vtkImageShiftScale.h> #include <vtkImageCast.h> //测试:../data/mummy.128.vtk int main(int argc, char *argv[]) { vtkSmartPointer<vtkStructuredPointsReader> reader = vtkSmartPointer<vtkStructuredPointsReader>::New(); reader->SetFileName("C:\\Users\\Administrator\\Desktop\\VTK2\\hellovtk\\vtk_图像处理学习\\第七章_VTK体绘制\\data\\mummy.128.vtk"); reader->Update(); vtkSmartPointer<vtkFixedPointVolumeRayCastMIPHelper> rayCastFun = vtkSmartPointer<vtkFixedPointVolumeRayCastMIPHelper>::New(); vtkSmartPointer<vtkFixedPointVolumeRayCastMapper> volumeMapper = vtkSmartPointer<vtkFixedPointVolumeRayCastMapper>::New(); volumeMapper->SetInputData(reader->GetOutput()); //volumeMapper->Set //SetVolumeRayCastMapperFunction(rayCastFun);//必须设置,否则出错 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.00); compositeOpacity->AddPoint(90, 0.40); compositeOpacity->AddPoint(180, 0.60); volumeProperty->SetScalarOpacity(compositeOpacity); vtkSmartPointer<vtkColorTransferFunction> color = vtkSmartPointer<vtkColorTransferFunction>::New(); color->AddRGBPoint(0.000, 0.00, 0.00, 0.00); color->AddRGBPoint(64.00, 1.00, 0.52, 0.30); 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> volume = vtkSmartPointer<vtkVolume>::New(); volume->SetMapper(volumeMapper); volume->SetProperty(volumeProperty); vtkSmartPointer<vtkRenderer> ren = vtkSmartPointer<vtkRenderer>::New(); ren->SetBackground(1.0, 1.0, 1.0); ren->AddVolume( volume ); vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New(); renWin->AddRenderer(ren); renWin->SetSize(640, 480); renWin->Render(); renWin->SetWindowName("MIPVolRenderingApp"); vtkSmartPointer<vtkRenderWindowInteractor> iren = vtkSmartPointer<vtkRenderWindowInteractor>::New(); iren->SetRenderWindow(renWin); ren->ResetCamera(); renWin->Render(); iren->Start(); return EXIT_SUCCESS; }

    实例66:GPU加速光线投影体绘制

    #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL2); VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2); VTK_MODULE_INIT(vtkRenderingFreeType); VTK_MODULE_INIT(vtkInteractionStyle); #include <vtkSmartPointer.h> #include <vtkStructuredPoints.h> #include <vtkStructuredPointsReader.h> #include <vtkGPUVolumeRayCastMapper.h> #include <vtkColorTransferFunction.h> #include <vtkPiecewiseFunction.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkVolumeProperty.h> //#include <vtkVolumeRayCastIsosurfaceFunction.h> int main(int argc, char* argv[]) { vtkSmartPointer<vtkStructuredPointsReader> reader = vtkSmartPointer<vtkStructuredPointsReader>::New(); reader->SetFileName("C:\\Users\\Administrator\\Desktop\\VTK2\\hellovtk\\vtk_图像处理学习\\第七章_VTK体绘制\\data\\mummy.128.vtk"); reader->Update(); vtkSmartPointer<vtkGPUVolumeRayCastMapper> volumeMapper = vtkSmartPointer<vtkGPUVolumeRayCastMapper>::New(); volumeMapper->SetInputData(reader->GetOutput());; volumeMapper->SetSampleDistance(volumeMapper->GetSampleDistance() / 2); //设置光线采样距离 //volumeMapper->SetAutoAdjustSampleDistances(0);//设置图像采样步长 //volumeMapper->SetImageSampleDistance(4); /*************************************************************************/ 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.00); compositeOpacity->AddPoint(90, 0.40); compositeOpacity->AddPoint(180, 0.60); volumeProperty->SetScalarOpacity(compositeOpacity); //设置不透明度传输函数 //设置梯度不透明属性 vtkSmartPointer<vtkPiecewiseFunction> volumeGradientOpacity = vtkSmartPointer<vtkPiecewiseFunction>::New(); volumeGradientOpacity->AddPoint(10, 0.0); volumeGradientOpacity->AddPoint(90, 0.5); volumeGradientOpacity->AddPoint(100, 1.0); volumeProperty->SetGradientOpacity(volumeGradientOpacity);//设置梯度不透明度效果对比 //设置颜色属性 vtkSmartPointer<vtkColorTransferFunction> color = vtkSmartPointer<vtkColorTransferFunction>::New(); color->AddRGBPoint(0.000, 0.00, 0.00, 0.00); color->AddRGBPoint(64.00, 1.00, 0.52, 0.30); 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> volume = vtkSmartPointer<vtkVolume>::New(); volume->SetMapper(volumeMapper); volume->SetProperty(volumeProperty); vtkSmartPointer<vtkRenderer> ren = vtkSmartPointer<vtkRenderer>::New(); ren->SetBackground(0, 1, 0); ren->AddVolume(volume); vtkSmartPointer<vtkRenderWindow> rw = vtkSmartPointer<vtkRenderWindow>::New(); rw->AddRenderer(ren); rw->SetSize(640, 480); rw->Render(); rw->SetWindowName("VolumeRendering"); vtkSmartPointer<vtkRenderWindowInteractor> rwi = vtkSmartPointer<vtkRenderWindowInteractor>::New(); rwi->SetRenderWindow(rw); ren->ResetCamera(); rw->Render(); rwi->Start(); return 0; }

    实例67:裁剪

    #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL2); VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2); VTK_MODULE_INIT(vtkRenderingFreeType); VTK_MODULE_INIT(vtkInteractionStyle); #include <vtkSmartPointer.h> #include <vtkStructuredPoints.h>//vtkStructuredPointsReader* -> vtkGPUVolumeRayCastMapper* #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("C:\\Users\\Administrator\\Desktop\\VTK2\\hellovtk\\vtk_图像处理学习\\第七章_VTK体绘制\\data\\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()); volumeMapper->SetCropping(1);//开启Cropping功能 volumeMapper->SetCroppingRegionPlanes(50, 150, 50, 200, 50, 150); volumeMapper->SetCroppingRegionFlags(0x0002000); /*****************************************************************/ //设置体绘制相关属性 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> croppingVolume = vtkSmartPointer<vtkVolume>::New(); croppingVolume->SetMapper(volumeMapper); croppingVolume->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> croppingRender = vtkSmartPointer<vtkRenderer>::New(); croppingRender->AddVolume(croppingVolume); croppingRender->SetBackground(0, 1, 0); croppingRender->SetViewport(croppingView); /// vtkSmartPointer<vtkRenderWindow> rw = vtkSmartPointer<vtkRenderWindow>::New(); rw->AddRenderer(origRender); rw->AddRenderer(croppingRender); 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(); croppingRender->SetActiveCamera(origRender->GetActiveCamera()); rw->Render(); rwi->Start(); return 0; }

    实例68:透明度

    #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL2); VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2); VTK_MODULE_INIT(vtkRenderingFreeType); VTK_MODULE_INIT(vtkInteractionStyle); #include <vtkSmartPointer.h> #include <vtkStructuredPointsReader.h> #include <vtkStructuredPoints.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("C:\\Users\\Administrator\\Desktop\\VTK2\\hellovtk\\vtk_图像处理学习\\第七章_VTK体绘制\\data\\mummy.128.vtk"); reader->Update(); vtkSmartPointer<vtkGPUVolumeRayCastMapper> volumeMapper1 = vtkSmartPointer<vtkGPUVolumeRayCastMapper>::New(); volumeMapper1->SetInputData(reader->GetOutput()); vtkSmartPointer<vtkGPUVolumeRayCastMapper> volumeMapper2 = vtkSmartPointer<vtkGPUVolumeRayCastMapper>::New(); volumeMapper2->SetInputData(reader->GetOutput()); /****************************************************************/ vtkSmartPointer<vtkVolumeProperty> volumeProperty1 = vtkSmartPointer<vtkVolumeProperty>::New(); volumeProperty1->SetInterpolationTypeToLinear(); //设置线性插值 volumeProperty1->ShadeOn();//开启阴影功能 volumeProperty1->SetAmbient(0.4);//设置环境温度系数 volumeProperty1->SetDiffuse(0.6);//设置漫反射系数 volumeProperty1->SetSpecular(0.2);//设置镜面反射系数 vtkSmartPointer<vtkPiecewiseFunction> compositeOpacity1 = vtkSmartPointer<vtkPiecewiseFunction>::New(); compositeOpacity1->AddPoint(70, 0.0); compositeOpacity1->AddPoint(90, 0.4); compositeOpacity1->AddPoint(180, 0.6); volumeProperty1->SetScalarOpacity(compositeOpacity1); vtkSmartPointer<vtkVolumeProperty> volumeProperty2 = vtkSmartPointer<vtkVolumeProperty>::New(); volumeProperty2->SetInterpolationTypeToLinear(); //设置线性插值 volumeProperty2->ShadeOn();//开启阴影功能 volumeProperty2->SetAmbient(0.4);//设置环境温度系数 volumeProperty2->SetDiffuse(0.6);//设置漫反射系数 volumeProperty2->SetSpecular(0.2);//设置镜面反射系数 vtkSmartPointer<vtkPiecewiseFunction> compositeOpacity2 = vtkSmartPointer<vtkPiecewiseFunction>::New(); compositeOpacity2->AddPoint(100, 0.0); compositeOpacity2->AddPoint(140, 0.4); compositeOpacity2->AddPoint(180, 0.6); volumeProperty2->SetScalarOpacity(compositeOpacity2); / vtkSmartPointer<vtkPiecewiseFunction> gradientOpacity = vtkSmartPointer<vtkPiecewiseFunction>::New(); gradientOpacity->AddPoint(10, 0.0); gradientOpacity->AddPoint(90, 0.5); gradientOpacity->AddPoint(100, 1.0); volumeProperty1->SetGradientOpacity(gradientOpacity); volumeProperty2->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); volumeProperty1->SetColor(color); volumeProperty2->SetColor(color); /****************************************************************/ vtkSmartPointer<vtkVolume> volume1 = vtkSmartPointer<vtkVolume>::New(); volume1->SetMapper(volumeMapper1); volume1->SetProperty(volumeProperty1); vtkSmartPointer<vtkVolume> volume2 = vtkSmartPointer<vtkVolume>::New(); volume2->SetMapper(volumeMapper2); volume2->SetProperty(volumeProperty2); // double View1[4] = { 0, 0, 0.5, 1 }; double View2[4] = { 0.5, 0, 1, 1 }; vtkSmartPointer<vtkRenderer> render1 = vtkSmartPointer<vtkRenderer>::New(); render1->AddVolume(volume1); render1->SetViewport(View1); render1->SetBackground(1, 1, 0); vtkSmartPointer<vtkRenderer> render2 = vtkSmartPointer<vtkRenderer>::New(); render2->AddVolume(volume2); render2->SetViewport(View2); render2->SetBackground(0, 1, 0); vtkSmartPointer<vtkRenderWindow> rw = vtkSmartPointer<vtkRenderWindow>::New(); rw->AddRenderer(render1); rw->AddRenderer(render2); rw->SetSize(640, 320); rw->SetWindowName("Differ Gray Opacity Function"); vtkSmartPointer<vtkRenderWindowInteractor> rwi = vtkSmartPointer<vtkRenderWindowInteractor>::New(); rwi->SetRenderWindow(rw); render1->GetActiveCamera()->SetPosition(0, -1, 0); render1->GetActiveCamera()->SetFocalPoint(0, 0, 0); render1->GetActiveCamera()->SetViewUp(0, 0, 1); render1->GetActiveCamera()->Azimuth(30); render1->GetActiveCamera()->Elevation(30); render1->ResetCamera(); render2->SetActiveCamera(render1->GetActiveCamera()); rw->Render(); rwi->Start(); return 0; }

    Processed: 0.012, SQL: 9