vtk多volume融合

  1. 将volume分别加入renderer中,渲染效果如下在这里插入图片描述
    可以看到,渲染中没有层次感。
#include "vtkAxesActor.h"
#include "vtkCamera.h"
#include "vtkColorTransferFunction.h"
#include "vtkCommand.h"
#include "vtkConeSource.h"
#include "vtkGPUVolumeRayCastMapper.h"
#include "vtkImageResample.h"
#include "vtkImageResize.h"
#include "vtkInteractorStyleTrackballCamera.h"
#include "vtkMultiVolume.h"
#include "vtkNew.h"
#include "vtkPiecewiseFunction.h"
#include "vtkRegressionTestImage.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkRenderer.h"
#include "vtkTestUtilities.h"
#include "vtkVolume16Reader.h"
#include "vtkVolumeProperty.h"
#include "vtkXMLImageDataReader.h"

#include "vtkAbstractMapper.h"
#include "vtkImageData.h"
#include "vtkOutlineFilter.h"
#include "vtkPolyDataMapper.h"

#include "vtkMath.h"
#include <chrono>

int main(int argc, char* argv[])
{
	// Load data
	vtkNew<vtkVolume16Reader> reader;
	reader->SetDataDimensions(64, 64);
	reader->SetImageRange(1, 93);
	reader->SetDataByteOrderToLittleEndian();
	reader->SetFilePrefix(R"(D:\VTK-9.2.6\Testing\Data\headsq\quarter)");
	reader->SetDataSpacing(3.2, 3.2, 1.5);

	vtkNew<vtkXMLImageDataReader> vaseSource;
	vaseSource->SetFileName(R"(D:\VTK-9.2.6\Testing\Data\vase_1comp.vti)");

	vtkSmartPointer<vtkXMLImageDataReader> xmlReader = vtkSmartPointer<vtkXMLImageDataReader>::New();
	xmlReader->SetFileName(R"(D:\VTK-9.2.6\Testing\Data\hncma-atlas.vti)");
	xmlReader->Update();

	// Volume 0 (upsampled headmr)
	// ---------------------------
	vtkNew<vtkImageResize> headmrSource;
	headmrSource->SetInputConnection(reader->GetOutputPort());
	headmrSource->SetResizeMethodToOutputDimensions();
	headmrSource->SetOutputDimensions(128, 128, 128);
	headmrSource->Update();

	vtkNew<vtkColorTransferFunction> ctf;
	ctf->AddRGBPoint(0, 0.0, 0.0, 0.0);
	ctf->AddRGBPoint(500, 1.0, 0.5, 0.3);
	ctf->AddRGBPoint(1000, 1.0, 0.5, 0.3);
	ctf->AddRGBPoint(1150, 1.0, 1.0, 0.9);

	vtkNew<vtkPiecewiseFunction> pf;
	pf->AddPoint(0, 0.00);
	pf->AddPoint(500, 0.15);
	pf->AddPoint(1000, 0.15);
	pf->AddPoint(1150, 0.85);

	vtkNew<vtkPiecewiseFunction> gf;
	gf->AddPoint(0, 0.0);
	gf->AddPoint(90, 0.1);
	gf->AddPoint(100, 0.7);

	vtkNew<vtkVolume> vol;
	vol->GetProperty()->SetScalarOpacity(pf);
	vol->GetProperty()->SetColor(ctf);
	vol->GetProperty()->SetGradientOpacity(gf);
	vol->GetProperty()->SetInterpolationType(VTK_LINEAR_INTERPOLATION);

	// Volume 1 (vase)
	// -----------------------------
	vtkNew<vtkColorTransferFunction> ctf1;
	ctf1->AddRGBPoint(0, 0.0, 0.0, 0.0);
	ctf1->AddRGBPoint(500, 0.1, 1.0, 0.3);
	ctf1->AddRGBPoint(1000, 0.1, 1.0, 0.3);
	ctf1->AddRGBPoint(1150, 1.0, 1.0, 0.9);

	vtkNew<vtkPiecewiseFunction> pf1;
	pf1->AddPoint(0, 0.0);
	pf1->AddPoint(500, 1.0);

	vtkNew<vtkPiecewiseFunction> gf1;
	gf1->AddPoint(0, 0.0);
	gf1->AddPoint(550, 1.0);

	vtkNew<vtkVolume> vol1;
	vol1->GetProperty()->SetScalarOpacity(pf1);
	vol1->GetProperty()->SetColor(ctf1);
	vol1->GetProperty()->SetGradientOpacity(gf1);
	vol1->GetProperty()->SetInterpolationType(VTK_LINEAR_INTERPOLATION);

	vol1->RotateX(-55.);
	vol1->SetPosition(80., 50., 130.);

	// Volume 2 (brain)
	// -----------------------------
	vtkNew<vtkPiecewiseFunction> pf2;
	pf1->AddPoint(0, 0.0);
	pf1->AddPoint(5022, 0.09);

	vtkNew<vtkColorTransferFunction> ctf2;
	ctf2->AddRGBPoint(0, 1.0, 0.3, 0.2);
	ctf2->AddRGBPoint(2511, 0.3, 0.2, 0.9);
	ctf2->AddRGBPoint(5022, 0.5, 0.6, 1.0);

	vtkNew<vtkPiecewiseFunction> gf2;
	gf2->AddPoint(0, 0.0);
	gf2->AddPoint(550, 0.5);

	vtkNew<vtkVolume> vol2;
	vol2->GetProperty()->SetScalarOpacity(pf2);
	vol2->GetProperty()->SetColor(ctf2);
	vol2->GetProperty()->SetGradientOpacity(gf2);
	vol2->GetProperty()->SetInterpolationType(VTK_LINEAR_INTERPOLATION);

	vol2->SetScale(0.8, 0.8, 0.8);
	vol2->SetPosition(210., 200., -90.);
	vol2->RotateX(90.);
	vol2->RotateY(-95.);
	vol2->RotateZ(-5.);

	// Rendering context
	vtkNew<vtkRenderWindow> renWin;
	renWin->SetSize(512, 512);
	renWin->SetMultiSamples(0);

	vtkNew<vtkRenderer> ren;

	vtkNew<vtkGPUVolumeRayCastMapper> mapper;
	mapper->SetInputConnection(headmrSource->GetOutputPort());
	vol->SetMapper(mapper);
	ren->AddVolume(vol);

	vtkNew<vtkGPUVolumeRayCastMapper> mapper1;
	mapper1->SetInputConnection(vaseSource->GetOutputPort());
	vol1->SetMapper(mapper1);
	ren->AddVolume(vol1);

	vtkNew<vtkGPUVolumeRayCastMapper> mapper2;
	mapper2->SetInputConnection(xmlReader->GetOutputPort());
	vol2->SetMapper(mapper2);
	ren->AddVolume(vol2);
	
	ren->UseDepthPeelingOn();
	ren->UseDepthPeelingForVolumesOn();

	renWin->AddRenderer(ren);
	ren->SetBackground(0.0, 0.0, 0.0);

	vtkNew<vtkRenderWindowInteractor> iren;
	iren->SetRenderWindow(renWin);

	vtkNew<vtkInteractorStyleTrackballCamera> style;
	iren->SetInteractorStyle(style);

	auto cam = ren->GetActiveCamera();
	cam->SetFocalPoint(41.9596, -17.9662, 78.5903);
	cam->SetPosition(373.891, 619.954, -53.5932);
	cam->SetViewUp(-0.0358384, -0.184856, -0.982112);
	renWin->Render();

	 Multi volume instance
	 ---------------------
	//vtkNew<vtkMultiVolume> overlappingVol;
	//vtkNew<vtkGPUVolumeRayCastMapper> mapper;
	//mapper->SetUseJittering(0);
	//overlappingVol->SetMapper(mapper);

	 Parameters that are global to all of the inputs are currently
	 set through the vtkVolumeProperty corresponding to the required
	 input port (port 0)
	//vol->GetProperty()->SetInterpolationType(VTK_LINEAR_INTERPOLATION);

	//mapper->SetInputConnection(4, xmlReader->GetOutputPort());
	//overlappingVol->SetVolume(vol2, 4);

	//mapper->SetInputConnection(0, headmrSource->GetOutputPort());
	//overlappingVol->SetVolume(vol, 0);

	//mapper->SetInputConnection(2, vaseSource->GetOutputPort());
	//overlappingVol->SetVolume(vol1, 2);

	//ren->AddVolume(overlappingVol);
	//renWin->Render();

	 Remove / add
	//mapper->RemoveInputConnection(4, 0);
	//overlappingVol->RemoveVolume(4);
	//renWin->Render();

	//mapper->RemoveInputConnection(2, 0);
	//overlappingVol->RemoveVolume(2);
	//renWin->Render();

	//mapper->SetInputConnection(4, xmlReader->GetOutputPort());
	//overlappingVol->SetVolume(vol2, 4);
	//renWin->Render();

	iren->Start();

	return 0;
}

  1. 采用vtkMultiVolume来渲染在这里插入图片描述
#include "vtkAxesActor.h"
#include "vtkCamera.h"
#include "vtkColorTransferFunction.h"
#include "vtkCommand.h"
#include "vtkConeSource.h"
#include "vtkGPUVolumeRayCastMapper.h"
#include "vtkImageResample.h"
#include "vtkImageResize.h"
#include "vtkInteractorStyleTrackballCamera.h"
#include "vtkMultiVolume.h"
#include "vtkNew.h"
#include "vtkPiecewiseFunction.h"
#include "vtkRegressionTestImage.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkRenderer.h"
#include "vtkTestUtilities.h"
#include "vtkVolume16Reader.h"
#include "vtkVolumeProperty.h"
#include "vtkXMLImageDataReader.h"

#include "vtkAbstractMapper.h"
#include "vtkImageData.h"
#include "vtkOutlineFilter.h"
#include "vtkPolyDataMapper.h"

#include "vtkMath.h"
#include <chrono>

int main(int argc, char* argv[])
{
	// Load data
	vtkNew<vtkVolume16Reader> reader;
	reader->SetDataDimensions(64, 64);
	reader->SetImageRange(1, 93);
	reader->SetDataByteOrderToLittleEndian();
	reader->SetFilePrefix(R"(D:\VTK-9.2.6\Testing\Data\headsq\quarter)");
	reader->SetDataSpacing(3.2, 3.2, 1.5);

	vtkNew<vtkXMLImageDataReader> vaseSource;
	vaseSource->SetFileName(R"(D:\VTK-9.2.6\Testing\Data\vase_1comp.vti)");

	vtkSmartPointer<vtkXMLImageDataReader> xmlReader = vtkSmartPointer<vtkXMLImageDataReader>::New();
	xmlReader->SetFileName(R"(D:\VTK-9.2.6\Testing\Data\hncma-atlas.vti)");
	xmlReader->Update();

	// Volume 0 (upsampled headmr)
	// ---------------------------
	vtkNew<vtkImageResize> headmrSource;
	headmrSource->SetInputConnection(reader->GetOutputPort());
	headmrSource->SetResizeMethodToOutputDimensions();
	headmrSource->SetOutputDimensions(128, 128, 128);
	headmrSource->Update();

	vtkNew<vtkColorTransferFunction> ctf;
	ctf->AddRGBPoint(0, 0.0, 0.0, 0.0);
	ctf->AddRGBPoint(500, 1.0, 0.5, 0.3);
	ctf->AddRGBPoint(1000, 1.0, 0.5, 0.3);
	ctf->AddRGBPoint(1150, 1.0, 1.0, 0.9);

	vtkNew<vtkPiecewiseFunction> pf;
	pf->AddPoint(0, 0.00);
	pf->AddPoint(500, 0.15);
	pf->AddPoint(1000, 0.15);
	pf->AddPoint(1150, 0.85);

	vtkNew<vtkPiecewiseFunction> gf;
	gf->AddPoint(0, 0.0);
	gf->AddPoint(90, 0.1);
	gf->AddPoint(100, 0.7);

	vtkNew<vtkVolume> vol;
	vol->GetProperty()->SetScalarOpacity(pf);
	vol->GetProperty()->SetColor(ctf);
	vol->GetProperty()->SetGradientOpacity(gf);
	vol->GetProperty()->SetInterpolationType(VTK_LINEAR_INTERPOLATION);

	// Volume 1 (vase)
	// -----------------------------
	vtkNew<vtkColorTransferFunction> ctf1;
	ctf1->AddRGBPoint(0, 0.0, 0.0, 0.0);
	ctf1->AddRGBPoint(500, 0.1, 1.0, 0.3);
	ctf1->AddRGBPoint(1000, 0.1, 1.0, 0.3);
	ctf1->AddRGBPoint(1150, 1.0, 1.0, 0.9);

	vtkNew<vtkPiecewiseFunction> pf1;
	pf1->AddPoint(0, 0.0);
	pf1->AddPoint(500, 1.0);

	vtkNew<vtkPiecewiseFunction> gf1;
	gf1->AddPoint(0, 0.0);
	gf1->AddPoint(550, 1.0);

	vtkNew<vtkVolume> vol1;
	vol1->GetProperty()->SetScalarOpacity(pf1);
	vol1->GetProperty()->SetColor(ctf1);
	vol1->GetProperty()->SetGradientOpacity(gf1);
	vol1->GetProperty()->SetInterpolationType(VTK_LINEAR_INTERPOLATION);

	vol1->RotateX(-55.);
	vol1->SetPosition(80., 50., 130.);

	// Volume 2 (brain)
	// -----------------------------
	vtkNew<vtkPiecewiseFunction> pf2;
	pf1->AddPoint(0, 0.0);
	pf1->AddPoint(5022, 0.09);

	vtkNew<vtkColorTransferFunction> ctf2;
	ctf2->AddRGBPoint(0, 1.0, 0.3, 0.2);
	ctf2->AddRGBPoint(2511, 0.3, 0.2, 0.9);
	ctf2->AddRGBPoint(5022, 0.5, 0.6, 1.0);

	vtkNew<vtkPiecewiseFunction> gf2;
	gf2->AddPoint(0, 0.0);
	gf2->AddPoint(550, 0.5);

	vtkNew<vtkVolume> vol2;
	vol2->GetProperty()->SetScalarOpacity(pf2);
	vol2->GetProperty()->SetColor(ctf2);
	vol2->GetProperty()->SetGradientOpacity(gf2);
	vol2->GetProperty()->SetInterpolationType(VTK_LINEAR_INTERPOLATION);

	vol2->SetScale(0.8, 0.8, 0.8);
	vol2->SetPosition(210., 200., -90.);
	vol2->RotateX(90.);
	vol2->RotateY(-95.);
	vol2->RotateZ(-5.);

	// Rendering context
	vtkNew<vtkRenderWindow> renWin;
	renWin->SetSize(512, 512);
	renWin->SetMultiSamples(0);

	vtkNew<vtkRenderer> ren;

	//vtkNew<vtkGPUVolumeRayCastMapper> mapper;
	//mapper->SetInputConnection(headmrSource->GetOutputPort());
	//vol->SetMapper(mapper);
	//ren->AddVolume(vol);

	//vtkNew<vtkGPUVolumeRayCastMapper> mapper1;
	//mapper1->SetInputConnection(vaseSource->GetOutputPort());
	//vol1->SetMapper(mapper1);
	//ren->AddVolume(vol1);

	//vtkNew<vtkGPUVolumeRayCastMapper> mapper2;
	//mapper2->SetInputConnection(xmlReader->GetOutputPort());
	//vol2->SetMapper(mapper2);
	//ren->AddVolume(vol2);
	//
	//ren->UseDepthPeelingOn();
	//ren->UseDepthPeelingForVolumesOn();

	renWin->AddRenderer(ren);
	ren->SetBackground(0.0, 0.0, 0.0);

	vtkNew<vtkRenderWindowInteractor> iren;
	iren->SetRenderWindow(renWin);

	vtkNew<vtkInteractorStyleTrackballCamera> style;
	iren->SetInteractorStyle(style);

	auto cam = ren->GetActiveCamera();
	cam->SetFocalPoint(41.9596, -17.9662, 78.5903);
	cam->SetPosition(373.891, 619.954, -53.5932);
	cam->SetViewUp(-0.0358384, -0.184856, -0.982112);
	renWin->Render();

	// Multi volume instance
	// ---------------------
	vtkNew<vtkMultiVolume> overlappingVol;
	vtkNew<vtkGPUVolumeRayCastMapper> mapper;
	mapper->SetUseJittering(0);
	overlappingVol->SetMapper(mapper);

	// Parameters that are global to all of the inputs are currently
	// set through the vtkVolumeProperty corresponding to the required
	// input port (port 0)
	vol->GetProperty()->SetInterpolationType(VTK_LINEAR_INTERPOLATION);

	mapper->SetInputConnection(4, xmlReader->GetOutputPort());
	overlappingVol->SetVolume(vol2, 4);

	mapper->SetInputConnection(0, headmrSource->GetOutputPort());
	overlappingVol->SetVolume(vol, 0);

	mapper->SetInputConnection(2, vaseSource->GetOutputPort());
	overlappingVol->SetVolume(vol1, 2);

	ren->AddVolume(overlappingVol);
	renWin->Render();

	// Remove / add
	mapper->RemoveInputConnection(4, 0);
	overlappingVol->RemoveVolume(4);
	renWin->Render();

	mapper->RemoveInputConnection(2, 0);
	overlappingVol->RemoveVolume(2);
	renWin->Render();

	mapper->SetInputConnection(4, xmlReader->GetOutputPort());
	overlappingVol->SetVolume(vol2, 4);
	renWin->Render();

	iren->Start();

	return 0;
}

参考: https://blog.csdn.net/qq_33598781/article/details/123037326?spm=1001.2014.3001.5502

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
vtk是一个开源的跨平台的科学可视化工具包,用于处理和呈现大规模的数据集。vtk中的volume三角网格显示是一种用于可视化体数据的技术,它可以将体数据转换为三角网格,并在屏幕上进行显示。 在vtk中,volume三角网格显示主要涉及以下几个步骤: 1. 数据加载:首先需要将体数据加载到vtk中。vtk支持多种数据格式,如DICOM、NIfTI等。可以使用vtkImageData或vtkVolumeData等类来加载和管理体数据。 2. 体数据转换:将体数据转换为三角网格是进行体数据可视化的关键步骤。vtk提供了多种方法来进行体数据的转换,如Marching Cubes算法、Marching Tetrahedra算法等。这些算法可以将体数据中的边界表面提取出来,并生成对应的三角网格。 3. 三角网格显示:将生成的三角网格进行显示。vtk提供了多种显示器件,如vtkActor、vtkMapper等。可以将生成的三角网格与显示器件进行关联,并将其添加到vtkRenderer中进行显示。 4. 光照和材质设置:为了增强体数据的可视效果,可以对显示器件进行光照和材质设置。vtk提供了多种光照和材质属性,如光源位置、光照强度、材质颜色等。通过设置这些属性,可以使体数据在显示时更加真实和逼真。 5. 交互操作:vtk还提供了交互操作的功能,可以通过鼠标和键盘进行视角的调整、缩放、旋转等操作。这样可以更加灵活地查看和分析体数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值