VTK可视化工具包之旅05-二维图片纹理映射

476 阅读1分钟

纹理映射是创建逼真效果的强大的图形工具,其原理是吧二维的图像贴到物体的表面上面去。根据二维图像渲染出丰富多彩的效果,所以也叫纹理贴图。纹理映射需要三个要素:待贴图的表面,纹理映射以及纹理坐标。其中纹理映射在VTK中就是vtkImageData的数据集。而纹理坐标则用于控制纹理图在表面的位置。

效果预览

image.png

实现步骤

  1. 首先读入一张JPEG的二维纹理图
  2. 定义一个纹理类vtkTexture对象
  3. 吧读入的JPEG输入到vtkTexture中去。
  4. 定义一个planeSouuce对象,然后将贴图贴到plane上面去
  5. 生成一个平面放入到场景中去

关键步骤

// 创建一个vtkJPEGReader的智能指针
vtkSmartPointer< vtkJPEGReader > reader =
		vtkSmartPointer< vtkJPEGReader >::New();
	reader->SetFileName(argv[1]);
        //创建一个材质对象
	vtkSmartPointer< vtkTexture > texture =
		vtkSmartPointer< vtkTexture >::New();
	texture->SetInputConnection(reader->GetOutputPort());
	texture->InterpolateOn();
// 给模型添加材质
actor->SetTexture(texture);

代码实现


#include <vtkSmartPointer.h>
#include <vtkJPEGReader.h>
#include <vtkTexture.h>
#include <vtkPlaneSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>


#include "vtkAutoInit.h" 
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
int main(int argc, char* argv[])
{
	if (argc < 2)
	{
		std::cout << argv[0] << " " << "TextureFile(*.jpg)" << std::endl;
		return EXIT_FAILURE;
	}
	vtkSmartPointer< vtkJPEGReader > reader =
		vtkSmartPointer< vtkJPEGReader >::New();
	reader->SetFileName(argv[1]);

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

	vtkSmartPointer< vtkPlaneSource > plane =
		vtkSmartPointer< vtkPlaneSource >::New();
	vtkSmartPointer< vtkPolyDataMapper > mapper =
		vtkSmartPointer< vtkPolyDataMapper >::New();
	mapper->SetInputConnection(plane->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> renWin =
		vtkSmartPointer<vtkRenderWindow>::New();
	renWin->AddRenderer(renderer);
	renWin->SetSize(640, 480);
	renWin->Render();
	renWin->SetWindowName("TextureExample");

	vtkSmartPointer<vtkRenderWindowInteractor> iren =
		vtkSmartPointer<vtkRenderWindowInteractor>::New();
	iren->SetRenderWindow(renWin);
	iren->Initialize();
	iren->Start();

	return EXIT_SUCCESS;
}