资讯详情

VTK:图形基本操作进阶——纹理映射

1.纹理映射

纹理映射是将纹理空间中的纹理像素映射到屏幕空间中的像素过程。纹理生成过程本质上是将定义的纹理映射到某个三维物体的表面,并参与后续的光计算。在三维图形中,纹理映射被广泛使用,特别是对真实物体的描述。 纹理映射的实现主要是建立纹理空间与模型空间、模型空间与屏幕空间的映射关系,如下图所示 在这里插入图片描述 其 纹理空间可以定义为u-v空间,每个坐标轴的范围为(0,1)。对于纹理图像,左下角的坐标为(0,0),右上角(1,1)。对于简单的参数模型,模型与纹理空间的映射关系可以很容易地建立起来,如球面和圆柱面。 根据图形学的三维空间转换,模型空间到屏幕空间的转换很容易实现,因此计算机屏幕图像及时纹理映射后最终显示的结果。 面对无参数曲面的纹理映射技术,通常需要将纹理空间的映射分解为两个简单的映射,并引入一个中介映射介质来包围场景。步骤如下:二维纹理空间映射为简单的三维物体表面(球圆柱形表面等);然后将中介物体表面的纹理映射到模型表面(例如,模型表面的法线和中间建筑模型的角度作为映射点),从纹理空间映射到模型空间。

2.VTK纹理映射映射

VTK从纹理空间到模型空间的映射定义了多个类别

  • vtkTextureMapToPlane:从平面到模型空间建立纹理空间的映射关系
  • vtkTextureToSphere:在球面上建立映射关系;
  • vtkTextureMapToCylinder:映射关系是通过圆柱面建立的;
  • vtkTexture:实现加载纹理;
  • vtkTransformTextureCoords:实现纹理坐标的平移和缩放。

3.使用vtkTextureMapToCylinder建立纹理映射实例

#include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL2); VTK_MODULE_INIT(vtkRenderingFreeType); VTK_MODULE_INIT(vtkInteractionStyle);  #include <vtkSmartPointer.h> #include <vtkBMPReader.h> ///阅读纹理图像 #include <vtkTexture.h> //加载纹理图像 #include <vtkXMLPolyDataReader.h>//加载模型数据 #include <vtkTextureMapToCylinder.h>///以圆柱为中介 #include <vtkPolyDataMapper.h> #include <vtkActor.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkOrientationMarkerWidget.h> #include <vtkAxesActor.h> #include <vtkOrientationMarkerWidget.>


int main(int argc, char* argv[])
{ 
        

	vtkSmartPointer<vtkBMPReader> texReader =
		vtkSmartPointer<vtkBMPReader>::New();
	texReader->SetFileName("data/Lena.bmp");

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

	vtkSmartPointer<vtkXMLPolyDataReader> modelReader =
		vtkSmartPointer<vtkXMLPolyDataReader>::New();
	modelReader->SetFileName("data/cow.vtp");
	//纹理映射
	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<vtkAxesActor> axes =
		vtkSmartPointer<vtkAxesActor>::New();

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

	vtkSmartPointer<vtkRenderWindow> rw =
		vtkSmartPointer<vtkRenderWindow>::New();
	rw->AddRenderer(renderer);
	rw->SetSize(640, 480);
	rw->SetWindowName("TextureMap");

	vtkSmartPointer<vtkRenderWindowInteractor> rwi =
		vtkSmartPointer<vtkRenderWindowInteractor>::New();
	rwi->SetRenderWindow(rw);
	/**********************************************************/
	vtkSmartPointer<vtkOrientationMarkerWidget> widget =
		vtkSmartPointer<vtkOrientationMarkerWidget>::New();
	widget->SetOutlineColor(1, 1, 1);
	widget->SetViewport(0, 0, 0.3, 0.3);
	widget->SetOrientationMarker(axes);
	widget->SetInteractor(rwi);
	widget->SetEnabled(1);
	widget->InteractiveOn();
	/**********************************************************/
	renderer->ResetCamera();
	rw->Render();
	rwi->Start();

	return 0;
}

标签: rwi电阻br4x121rok

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台