VTK渲染raw格式的三维点云数据,并纹理贴图(纹理映射)

#include<vtkSmartPointer.h>
#include<vtkRenderWindow.h>
#include<vtkRenderer.h>
#include<vtkRenderWindowInteractor.h>
#include<vtkInteractorStyleTrackballCamera.h>
#include<vtkCylinderSource.h>
#include <vtkPolyDataMapper.h>
#include<vtkPolyData.h>
#include<vtkActor.h>
#include<vtkBMPReader.h>
#include<vtkTexture.h>
#include<vtkLight.h>
#include<vtkCamera.h>
#include<vtkStructuredPointsReader.h>
#include<vtkImageDataGeometryFilter.h>
#include<vtkImageReader.h>
#include<vtkCellArray.h>
#include<vtkIdTypeArray.h>
#include<fstream>
#include<vtkProperty.h>
#include<vtkSphereSource.h>
#include<vtkPolyDataNormals.h>
#include<vtkTextureMapToPlane.h>
#include<vtkTextureMapToCylinder.h>
#include<vtkTransformTextureCoords.h>
#include<vtkPlaneSource.h>
#include<vtkTextureMapToPlane.h>
#include<vtkObject.h>
#include<vtkImageFlip.h>
#include<vtkTransform.h>
#include<vtkTransformPolyDataFilter.h>
#include<vtkTransform2D.h>
#include<vtkTransformFilter.h>
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);

#define RAW_FILE "E:\\1.raw"
#define BMP_File "E:\\PatMatch.bmp"
#define TEX_FILE "E:\\1000wMono8_3840_2748.raw"
#define TEX_WIDE 3840
#define TEX_HIGH 2748


//R,S,T轴是否翻转
#define R_FLIP 1
#define S_FLIP 1
#define T_FLIP 1
#define MAX_Point 1000000

typedef struct 3D_POINT__
{
	float fX;
	float fY;
	float fZ;
} 3D_POINT;

3D_POINT  3D_point[MAX_Point];
long  nPointNum = 0;

double X_angle = 0;
double Y_angle = 0;
double Z_angle = 0; //一般修改此参数来调整贴图方向


int main()
{

	//读取BMP
	vtkSmartPointer<vtkBMPReader>bmpReader = vtkSmartPointer<vtkBMPReader>::New();
	bmpReader->SetFileName(BMP_File);

    //读取缓存或网络的raw格式的纹理
	/*vtkSmartPointer<vtkImageData> raw_bmp = vtkSmartPointer<vtkImageData>::New();  //创建图像
	vtkSmartPointer<vtkInformation> info = vtkSmartPointer<vtkInformation>::New();
	raw_bmp->SetDimensions(TEX_WIDE,TEX_HIGH,1);      //指定维数
	raw_bmp->SetScalarType(VTK_UNSIGNED_CHAR,info);  //指定图像的像素数据类型为unsigned char 
	raw_bmp->SetNumberOfScalarComponents(1, info);  //每个像素值为一个标量
	raw_bmp->SetSpacing(1, 1,0);
	raw_bmp->AllocateScalars(info);    //分配内存

	unsigned char *ptr = (unsigned char*)raw_bmp->GetScalarPointer();
	
	ifstream fin_Tex(TEX_FILE, ios::binary | ios::in);
	if (!fin_Tex)
	{
		cout << "File open error!\n";
		return 1;
	}
	int i = 0;
	while (!fin_Tex.eof())
	{
		
		fin_Tex.read((char *)&pData[i],sizeof(char));
		i++;
	}
	fin_Tex.close();

	for (int j = 0; j < TEX_WIDE*TEX_HIGH; j++)
	{
		*ptr= (unsigned char)pData[j];
		ptr++;
		
	}

	*/

	/*
	//读取本地raw格式的纹理
	vtkSmartPointer<vtkImageReader> rawReader = vtkSmartPointer<vtkImageReader>::New();
	rawReader->SetFileName(TEX_FILE);
	rawReader->SetFileDimensionality(2);//设置显示图像的维数
	rawReader->SetDataScalarTypeToUnsignedChar();//将数据转换为unsigned char型
	rawReader->SetDataExtent(0, 3840, 0, 2784, 0,0);//需手动设置图像各维的大小
	rawReader->SetDataSpacing(1,1,0); //设置像素间间距
	//rawReader->SetDataOrigin(0.0, 0.0, 0.0);//设置基准点
	*/

	//在纹理上设置变换,进行缩放,旋转和平移纹理。
	vtkSmartPointer<vtkTransform> transform = vtkSmartPointer<vtkTransform>::New();
	//旋转
	//创建一个关于X、Y或Z轴的旋转矩阵,角度以度表示
	transform->RotateX(X_angle);
	transform->RotateY(Y_angle);
	transform->RotateZ(Z_angle); //一般调整此参数来调整贴图方向

	//纹理
	vtkSmartPointer<vtkTexture>texture = vtkSmartPointer<vtkTexture>::New();
	texture->SetInputConnection(bmpReader->GetOutputPort());
    //texture->SetInputConnection(rawReader->GetOutputPort());
    //texture->SetInputData(raw_bmp);
	texture->InterpolateOn();
	texture->SetTransform(transform);

	
	vtkSmartPointer <vtkPoints> points = vtkSmartPointer <vtkPoints>::New();  //点
	vtkSmartPointer <vtkCellArray> cells = vtkSmartPointer <vtkCellArray>::New(); //顶点,用于焦点渲染

	vtkIdType idtype;

	//读取raw的二进制数据
	ifstream fin(RAW_FILE, ios::binary | ios::in);
	if (!fin)
	{
		cout << "File open error!\n";
		return 1;
	}

	while (!fin.eof())    
	{
		fin.read((char *)&3D_point[nPointNum], sizeof(3D_POINT)); 
		idtype = points->InsertNextPoint(3D_point[nPointNum].fX, 3D_point[nPointNum].fY, 3D_point[nPointNum].fZ);
		cells->InsertNextCell(1, &idtype);
		nPointNum++;
	}
	fin.close();

	

	//设置polyData的内容
	vtkSmartPointer <vtkPolyData> polyData = vtkSmartPointer <vtkPolyData>::New();
	polyData->SetPoints(points);
	polyData->SetVerts(cells);

	//将二维纹理空间映射到一个简单的三维物体表面,例如球面、圆柱面等
	//这里将 2D 纹理坐标生成映射输入的纹理数据集点至一个2D平面上

	vtkSmartPointer<vtkTextureMapToPlane> textureMap =
	vtkSmartPointer<vtkTextureMapToPlane>::New();
	
	textureMap->SetInputData(polyData);



	//用来变换纹理坐标,包括缩放、旋转和平移。
	vtkSmartPointer<vtkTransformTextureCoords> transformTextureCoords =
		vtkSmartPointer<vtkTransformTextureCoords>::New();
	transformTextureCoords->SetInputConnection(textureMap->GetOutputPort());


	//翻转
	transformTextureCoords->SetFlipR(R_FLIP);
	transformTextureCoords->SetFlipS(S_FLIP);
	transformTextureCoords->SetFlipT(T_FLIP);
	transformTextureCoords->SetOrigin(0.5,0.5,0.5); //设置原点
	transformTextureCoords->SetScale(1, 1, 0); //贴图大小


	//将polyData转换为几何图元
	vtkSmartPointer <vtkPolyDataMapper> mapper = vtkSmartPointer <vtkPolyDataMapper>::New();
	mapper->SetInputConnection(transformTextureCoords->GetOutputPort());

	//可视化表达
	vtkSmartPointer <vtkActor> actor = vtkSmartPointer <vtkActor>::New();
	actor->SetMapper(mapper);
	actor->SetTexture(texture);
	
	//负责管理场景的渲染过程
	vtkSmartPointer <vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
	renderer->AddActor(actor);

	//连接操作系统与VTK的渲染引擎
	vtkSmartPointer <vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();
	renWin->AddRenderer(renderer);
	renWin->SetSize(800, 800);

	//交互
	vtkSmartPointer <vtkRenderWindowInteractor> iren = vtkSmartPointer<vtkRenderWindowInteractor>::New();
	iren->SetRenderWindow(renWin);

	//交互器样式中的“相机”,用来旋转放大缩小
	vtkSmartPointer <vtkInteractorStyleTrackballCamera> style = vtkSmartPointer <vtkInteractorStyleTrackballCamera>::New();
	iren->SetInteractorStyle(style);


	iren->Initialize();
	iren->Start();
	return 0;

}

RAW文件里是三维的二进制坐标X,Y,Z

 

参考文献:

fstream读写二进制文件

VTK教程系列导航

VTK实现纹理贴图

VTK 简单点云数据显示绘制

VTK点云数据显示

VTK笔记——纹理映射

VTK纹理映射之vtkTransformTextureCoods

VTK纹理映射及原理

图形处理之纹理映射vtkTextureMapToCylinder

纹理贴图(立方体、平面(vtkPlaneSource)、球(vtkSphereSource)、圆柱体(vtkCylinderSource))


版权声明:本文为weirdo_coder原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。