环境:vs2017+qt5+VTK9.1
实现代码:
在原图中调用创建立方体部分代码:
void vtk91test::test2()
{
QElapsedTimer timer;
timer.start();
//=========================读取并渲染原mhd图像===============================
//QVTKOpenGLNativeWidget 加入renderer
vtkRenderer* render = vtkRenderer::New();
widget->GetRenderWindow()->AddRenderer(render);
vtkMetaImageReader* reader = vtkMetaImageReader::New();
reader->SetFileName("1.mhd");
reader->Update();
vtkSmartPointer<vtkGPUVolumeRayCastMapper> volumeMapper1 =
vtkSmartPointer<vtkGPUVolumeRayCastMapper>::New();
volumeMapper1->SetInputData(reader->GetOutput());
volumeMapper1->SetBlendModeToComposite();
vtkNew<vtkVolumeProperty> volumeProperty;
volumeProperty->SetInterpolationTypeToLinear();
volumeProperty->SetAmbient(0.4);
volumeProperty->SetDiffuse(0.6);
volumeProperty->SetSpecular(0.2);
vtkNew<vtkPiecewiseFunction> compositeOpacity;
compositeOpacity->AddPoint(70, 0.00);
compositeOpacity->AddPoint(90, 0.40);
compositeOpacity->AddPoint(180, 0.60);
volumeProperty->SetScalarOpacity(compositeOpacity); //设置灰度不透明度传输函数
//Gradient 斜率
vtkNew<vtkPiecewiseFunction> volumeGradientOpacity;
volumeGradientOpacity->AddPoint(10, 0.0);
volumeGradientOpacity->AddPoint(90, 0.5);
volumeGradientOpacity->AddPoint(100, 1.0);
//volumeProperty->SetGradientOpacity(volumeGradientOpacity);//设置梯度不透明度效果对比
//设置颜色传输函数
vtkNew<vtkColorTransferFunction> color;
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);
//相当于二维的vtkActor
vtkNew<vtkVolume> volume0;
volume0->SetMapper(volumeMapper1);
volume0->SetProperty(volumeProperty);
//==============加入立方体标注======================
//设置坐标
int maxX = 100;
int maxY = 100;
int maxZ = 100;
int minX = 10;
int minY = 10;
int minZ = 10;
QVector<int> vector;
vector.append(maxX);
vector.append(maxY);
vector.append(maxZ);
vector.append(minX);
vector.append(minY);
vector.append(minZ);
//调用添加标注函数
vtkSmartPointer<vtkActor> rectangleActor = vtkSmartPointer<vtkActor>::New();
rectangleActor = this->addRectangle3D(vector, 3, "Red");
render->AddVolume(volume0);
render->AddActor(rectangleActor);
qDebug() << "render time :" << timer.elapsed();
widget->GetInteractor()->Render();
qDebug() << "end time :" << timer.elapsed();
qDebug() << "test2=================";
}
创建立方体部分代码:
首先定义立方体的8个顶点,通过8个顶点创建出12条线段。
其中这段代码比较难理解,我的理解是通过这两行创建一个线段,线段的第一个顶点是Points中的第i个点,第一个顶点式Points中的第(i + 1) % 4 != 0 ? (i + 1) : 0)个点。
boxGridCell->GetPointIds()->SetId(0, i);//0,1 0,2 0,3
boxGridCell->GetPointIds()->SetId(1, ((i + 1) % 4 != 0 ? (i + 1) : 0));
然后将其12个线段装入CellArray中进行渲染。
实验结果:
标注的立方体可以随原图移动,变换大小。