VTK:体绘制——体绘制管线&图形渲染管线
时间:2022-10-28 19:30:00
1.几何渲染和体画
- 几何渲染:通过绘制几何图元(顶点、线段、面片等)来渲染数据。例如,绘制图像需要在空间中建立一个四边图元,然后在图元上绘制图像;三维模型通常分解为一系列多边图片。这种通过生成中间几何图元来渲染的方法称为几何渲染。几何渲染速度快,但数据内部细节无法显示。例如,渲染人的三维CT在体数据中,切片图像只能通过几何渲染切换,而不是切换,而不是三维观察体数据的内部细节。
- 身体绘制:又称三维重建(不同于投影图像的三维重建),是一种直接利用身体数据生成二维图像的绘制技术。与表面绘制不同,身体绘制不需要提取数据内部的等值表面。它是一个采样和合成三维数据的过程。身体数据可以通过设置不透明度值来显示身体数据中的不同组成部分和细节,如显示人体CT不同的器官和组织图像。
2.图形渲染管道
在学习体画管道之前,有必要回顾一下前面VTK可视化管道的基本组成。习惯渲染窗口vtkRenderWindow作为剧院,剧院通常需要灯光(vtkLight)、相机(vtkCamera)和舞台(vtkRenderer)呈现精彩的表演。舞台上的表演自然是演员(vtk Actor),而且演员的数量不是唯一的,可以根据需要在舞台上加入更多的演员(vtkActor)。
每个演员都有自己的特点,用来表达自己的特点vtkProperty(负责控制颜色、材质、不透明度等。
存储每个演员的数据和渲染信息vtkMapper负责将原始数据转换为渲染所需的图元数据。
3.体画管道
体绘制管线的渲染管线与几何渲染管线基本一致,下面的实例:
#include VTK_MODULE_INIT(vtkRenderingOpenGL2); VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2); //错误:no override found for 'vtkRayCastImageDisplayHelper'. VTK_MODULE_INIT(vtkRenderingFreeType); VTK_MODULE_INIT(vtkInteractionStyle); #include #include #include #include #include #include #include #include #include #include #include #include int main(int argc, char* argv[])
{
vtkSmartPointer<vtkStructuredPointsReader> reader =
vtkSmartPointer<vtkStructuredPointsReader>::New();
reader->SetFileName("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 axes = vtkSmartPointer::New();
//axes->SetScale(10);
//vtkSmartPointer widget =
// vtkSmartPointer::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;
}