VTK将二维图像向三维空间中无参数化的曲面表面进行纹理映射(含代码)

实现纹理映射主要是建立纹理空间与模型空间、模型空间与屏幕空间之间的映射关系(见图 6-28):

                              

        其中纹理空间可以定义为u-v 空间,每个轴标范围为 (0.1)。其中对于一个纹理图像,其左下角 v 标为 0.0),右上角标为 1.1)。而对于简单的参数模型,可以方便地建立模型与纹理空间的映射关系,例如球面、圆柱面等。

        而根据图形学三维空间变换容易实现模型空间到屏幕空间的变换,因此最终显示在计算机屏幕上的图像即是纹理映射后的结果。

        而对于无参数化曲面的纹理映射技术,通常需要将纹理空间到模型空间的映射分解为两个简单映射。这里需要引入一个包围景物的中介三维曲面作为中介映射媒介,主要实现步骤如下:

        1.先将二维纹理空间映射为一个简单的三维物体表面,例如球面、圆柱面等;

        2.然后将上述中介物体表面的纹理映射到模型表面,例如以模型表面法线与中介模型的交点作为映射点。这样即可实现由纹理空间到模型空间的映射。
        VTK中定义了多个类实现纹理空间到模型空间的映射,例如vtkTextureMapToPlane通过一个平面建立纹理空间到模型空间的映射关系;

        vtkTextureMapToCylinder 通过圆柱面建立映射关系;

        vtkTextureMapToSphere 通过球面建立映射关系。

        vtkTexture 则实现加载纹理(在第2章中已经介绍过)。另外,vtkTransformTextureCoords 也是一个非常有用的类,可以实现纹理坐标的平移和缩放,例如,如果要实现重复纹理,只需通过vtkTransformTextureCoords::SetScale()将纹理坐标每个方向进行放大,如由[0,1]变换到[0,101即可。

下例中使用vtkTextureMapToCylinder 来建立纹理映射(TextureMap.cpp):

#include <vtkSmartPointer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkActor.h>
#include <vtkPolyDataMapper.h>
#include <vtkTransformTextureCoords.h>
#include <vtkTexture.h>
#include <vtkTextureMapToSphere.h>
#include <vtkTextureMapToCylinder.h>
#include <vtkBMPReader.h>
#include <vtkTexturedSphereSource.h>
#include <vtkXMLPolyDataReader.h>

//测试:../data/masonry.bmp ../data/cow.vtp
int main (int argc, char *argv[])
{
	if (argc < 3)
	{
		std::cout << "Usage: " << argv[0]
		<< "texture(.png)"
			<< "model(.vtp)" <<std::endl;
		return EXIT_FAILURE;
	}

	double translate[3];
	translate[0] = 10.0;
	translate[1] = 0.0;
	translate[2] = 0.0;
	std::cout << translate[0] << ", "
		<< translate[1] << ", "
		<< translate[2] << "\n";

	vtkSmartPointer<vtkBMPReader> texReader =
		vtkSmartPointer<vtkBMPReader>::New();
	texReader->SetFileName(argv[1]);

	vtkSmartPointer<vtkTexture> texture =
		vtkSmartPointer<vtkTexture>::New();
	texture->SetInputConnection(texReader->GetOutputPort());

	vtkSmartPointer<vtkXMLPolyDataReader> modelReader =
		vtkSmartPointer<vtkXMLPolyDataReader>::New();
	modelReader->SetFileName(argv[2]);

	vtkSmartPointer<vtkTextureMapToCylinder> texturemap = 
		vtkSmartPointer<vtkTextureMapToCylinder>::New();
	texturemap->SetInputConnection(modelReader->GetOutputPort());

	vtkSmartPointer<vtkPolyDataMapper> mapper =
		vtkSmartPointer<vtkPolyDataMapper>::New();
	mapper->SetInputConnection(texturemap->GetOutputPort());

	vtkSmartPointer<vtkActor> actor =
		vtkSmartPointer<vtkActor>::New();
	actor->SetMapper( mapper );
	actor->SetTexture( texture );

	vtkSmartPointer<vtkRenderer> renderer =
		vtkSmartPointer<vtkRenderer>::New();
	renderer->AddActor(actor);
	renderer->SetBackground(1.0, 1.0, 1.0);

	vtkSmartPointer<vtkRenderWindow> renderWindow =
		vtkSmartPointer<vtkRenderWindow>::New();
	renderWindow->AddRenderer( renderer );

	vtkSmartPointer<vtkRenderWindowInteractor> renWinInteractor =
		vtkSmartPointer<vtkRenderWindowInteractor>::New();
	renWinInteractor->SetRenderWindow( renderWindow );

	renderWindow->SetSize(640, 480);
	renderWindow->Render();
	renderWindow->SetWindowName("TextureMap");
	renderWindow->Render();
	renderWindow->Render();
	renWinInteractor->Start();

	return EXIT_SUCCESS;
}

代码中先使用vtkTexture 来加载纹理图像,并通过vtkActor::SetTexture()设置纹理:然后
使用vtkTextureMapToCylinder 来建立纹理空间与模型空间的映射关系;最后通过VTK 渲染
引擎进行渲染,执行结果如图 6-29所示:

几何纹理
图像纹理不能模拟形状的变化.1978年,Blinn提出产生几何纹理,模拟凸凹不平的物体表面的方法(凹凸映射,Bump mapping)

基本思想
生成图像时,对曲面的法向量进行扰动。

对景物表面各采样点位置作微小的扰动,改变表面的微观几何形状,引起景物表面法向量的扰动。
景物表面光亮度是法向量的函数:法向量的扰动导致表面光亮度的突变,产生表面凹凸不平的真实效果。


几何纹理的实现
1.将扰动后的法向量单位化,用于计算曲面的明暗度,产生凹凸不平的几何纹理;
2.几何纹理函数:用二维数组记录各象素的值,图案中较暗颜色对应较小F值,较亮颜色对应较大F值;
3.F的偏导数的计算,可以用中心差分实现。

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CBCT是计算机体层摄影技术的一种,通常使用多张二维tiff图片重构三维图像VTK是一个用于三维图像处理和可视化的开源库。下面是使用VTK对多张二维tiff图片进行三维可视化的Python代码: ```python import vtk # 设置读取器 reader = vtk.vtkTIFFReader() # 读取多张二维tiff图片 for i in range(1, 101): filename = "image{}.tiff".format(i) reader.SetFileName(filename) reader.Update() # 设置用于显示的数据 input_data = reader.GetOutput() # 创建VTK数据集 image_data = vtk.vtkImageData() image_data.SetDimensions(input_data.GetDimensions()) image_data.SetSpacing(input_data.GetSpacing()) image_data.SetOrigin(input_data.GetOrigin()) image_data.SetScalarTypeToUnsignedChar() image_data.AllocateScalars() # 将二维图像拷贝到VTK数据集 for z in range(input_data.GetDimensions()[2]): for y in range(input_data.GetDimensions()[1]): for x in range(input_data.GetDimensions()[0]): pixel = input_data.GetScalarComponentAsDouble(x, y, z, 0) image_data.SetScalarComponentFromDouble(x, y, z, 0, pixel) # 创建VTK可视化对象 actor = vtk.vtkImageActor() actor.SetInputData(image_data) # 将可视化对象添加到渲染器 renderer.AddActor(actor) # 创建渲染窗口和交互器 render_window = vtk.vtkRenderWindow() render_window.SetSize(800, 800) render_window.AddRenderer(renderer) interactor = vtk.vtkRenderWindowInteractor() interactor.SetRenderWindow(render_window) # 渲染并开始交互 render_window.Render() interactor.Start() ``` 此代码将多张二维tiff图片读取为VTK数据集,然后创建VTK可视化对象并将其添加到渲染器。最后创建渲染窗口和交互器,并启动交互。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值