VTK:纹理映射体绘制——三维纹理映射

1.三维纹理映射

利用三维纹理映射,将体数据映射至一组与视图平面平行的多边形,避免了二维纹理映射方法中因为纹理映射的切换造成的瑕疵。。VTK中三维纹理映射体绘制方法由vtkVolumeTexture3D类实现,使用方法与二维纹理映射体绘制方法一致。

#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL);
VTK_MODULE_INIT(vtkRenderingFreeType);
VTK_MODULE_INIT(vtkInteractionStyle);

#include <vtkSmartPointer.h>
#include <vtkStructuredPoints.h>
#include <vtkStructuredPointsReader.h>
//#include <vtkVolumeTextureMapper2D.h>
#include <vtkVolumeTextureMapper3D.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("data/mummy.128.vtk");
	reader->Update();


	/*vtkSmartPointer<vtkVolumeTextureMapper2D> volumeMapper =
		vtkSmartPointer<vtkVolumeTextureMapper2D>::New();
	volumeMapper->SetInputData(reader->GetOutput());;*/

	vtkSmartPointer<vtkVolumeTextureMapper3D> volumeMapper =
		vtkSmartPointer<vtkVolumeTextureMapper3D>::New();
	volumeMapper->SetInputData(reader->GetOutput());;
	/*************************************************************************/
	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(0, 1, 0);
	ren->AddVolume(volume);

	vtkSmartPointer<vtkRenderWindow> rw = vtkSmartPointer<vtkRenderWindow>::New();
	rw->AddRenderer(ren);
	rw->SetSize(480, 480);
	rw->Render();
	rw->SetWindowName("VolumeRendering by Texture2D");

	vtkSmartPointer<vtkRenderWindowInteractor> rwi =
		vtkSmartPointer<vtkRenderWindowInteractor>::New();
	rwi->SetRenderWindow(rw);

	ren->ResetCamera();
	rw->Render();
	rwi->Start();

	return 0;
}

2.硬件上的限制

受硬件纹理空间限制,当数据传递至vtkVolumeTextureMapper3D中后,在内部会进行重采样,以保证图像大小满足当前的空间。默认情况下,对于单组分数据的纹理最大为256:256:128;四元非独立数据最大256:128:128.三维纹理映射仅支持两种类型的显卡:NVIDIA和ATI。为了确保程序能够正确运行,其内部定义了核对函数:int ISRenderSupported(vtkVolumeProperty* , vtkRenderer* );,用来判断是否支持当前渲染,避免出现错误int valid = volumeMapper->IsRenderSupported(volumeProperty,ren);
当软件程序是否支持显卡类型满足时,就会返回TRUE。

3.总结

  1. vtk中不同的vtkVolumeMapper支持不同的数据类型。
  2. vtkVolumeRayCastMapper和vtkVolumeTextureMapper2D仅支持VTK_UNSIGNED_CHAR 和VTK_UNSIGNED_SHORT类型数据。当涉及到其他类型数据时,需要做数据强制转换,可以考虑使用vtkImageCast或vtkImageShiftScale类。
  3. vtkVolumeTextureMapper3D则支持任意类型数据,当然必须输单组分数据或者是多元独立数据。
  4. VTKFixedPointVolumeRayCastMapper灵活性最高,支持所有类型数据,最该可以支持四元数据。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
VTK(Visualization Toolkit)是一个用于可视化和图形处理的开源软件库。它提供了广泛的功能,包括三维可视化、绘制、图形处理、图像处理、科学可视化等。在VTK,可以使用标记点来标记三维场景的特定位置。而平面映射则是将三维场景的物投影到二维平面上,以便于展示和处理。 下面是VTK实现三维标记点平面映射的步骤: 1. 创建一个VTK Renderer和RenderWindow对象,用于显示场景。 2. 创建一个VTK PolyData对象,用于存储标记点的位置和属性。 3. 创建一个VTK PolyDataMapper对象,将PolyData对象映射到场景。 4. 创建一个VTK Actor对象,将Mapper对象添加到Actor。 5. 将Actor对象添加到Renderer。 6. 创建一个VTK Plane对象,用于进行平面映射。 7. 创建一个VTK ProjectPoints对象,将标记点投影到平面上。 8. 将投影结果添加到PolyData对象。 9. 更新RenderWindow对象,显示投影结果。 下面是实现代码示例: ```python import vtk # create a renderer and render window renderer = vtk.vtkRenderer() render_window = vtk.vtkRenderWindow() render_window.AddRenderer(renderer) # create polydata object to store marker points polydata = vtk.vtkPolyData() # create mapper object to map polydata to scene mapper = vtk.vtkPolyDataMapper() mapper.SetInputData(polydata) # create actor object to add mapper to renderer actor = vtk.vtkActor() actor.SetMapper(mapper) renderer.AddActor(actor) # create plane object for projection plane = vtk.vtkPlane() # create project points object for projection project_points = vtk.vtkProjectPoints() project_points.SetInputData(polydata) project_points.SetPlane(plane) project_points.Update() # add projection result to polydata polydata.SetPoints(project_points.GetOutput().GetPoints()) # update render window to show projection result render_window.Render() ``` 以上代码演示了如何创建一个VTK场景,并将标记点投影到平面上以显示投影结果。根据需要,可以调整代码以适应不同的应用场景。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

简 。单

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值