ParaView和VTK中场景的导入与导出

ParaView作为一款优秀的后处理软件,可以说将VTK的功能已经发挥的淋漓尽致了,不过最近发现在场景导入导出方面二者还是有些差异。

场景的导入(Import)和导出(Export)是指将渲染场景中的对象,包括光照、相机、Actor、属性、变换矩阵等信息写入文件中,或者从外部文件中将这些对象导入渲染场景中,一般所导入的文件含有多个数据集。

VTK中一般以关键字Importer和Exporter命名的类是与场景的导入和导出相关的。Importer类可导入由其它3D模型软件(如3DS MAX)所生成的文件;Exporter则可以将VTK里的场景生成可被其它3D模型软件所处理的文件。

下面就看一下VTK和ParaView中支持的Importer和Exporter类型:

类别 VTK ParaView
Importer vtk3DSImporter 不能读取*.3ds
vtkVRMLImporter 可以读取*vrml
  可读取*.obj
Exporter vtkGL2PSExporter cinema database(*.cdb)
vtkIVExporter EPS files(*.eps)
vtkOBJExporter PDF files(*.pdf)
vtkOOGLExporter PS files(*.ps)
vtkRIBExporter SVG files(*.svg)
vtkVRMLExporter POV files(*.pov)
vtkPOVExporter *.vtp
vtkX3DExporter *.vrml
  *.webgl
  *.x3d
  *.x3db

从上表中可以看出,二者在导入导出场景方面存在一些差异,比如paraview不能导入3DS Max的结果,但是可以读入*.obj格式的文件。下面就通过一个实例展示VTK和ParaView的场景导入导出。

在VTK中读入*.3ds的文件,并导出*.obj格式的文件用于在Paraview中展示:

#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtk3DSImporter.h>
#include <vtkOBJExporter.h>
#include <vtkDataSet.h>
#include <vtkPolyData.h>
#include <vtkSmartPointer.h>


int main ( int argc, char *argv[])
{
	if(argc != 2)
	{
		std::cout << "Required arguments: Filename(*.3ds)" << std::endl;
		return EXIT_FAILURE;
	}

	std::string filename = argv[1];
	std::cout << "Reading " << filename << std::endl;

	// 导入3DS文件(*.3ds)
	vtkSmartPointer<vtk3DSImporter> importer = vtkSmartPointer<vtk3DSImporter>::New();
	importer->SetFileName ( filename.c_str() );
    // 计算法向量
	importer->ComputeNormalsOn();
	importer->Read();

	vtkSmartPointer<vtkRenderer> renderer = importer->GetRenderer();
	vtkSmartPointer<vtkRenderWindow> renderWindow = importer->GetRenderWindow();
	vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = 
		vtkSmartPointer<vtkRenderWindowInteractor>::New();
	renderWindowInteractor->SetRenderWindow(renderWindow);

	renderer->GradientBackgroundOn();
	renderer->SetBackground(1.0, 1.0, 1.0);
	renderer->SetBackground2(0.0, 0.0, 0.0);
	renderWindow->Render();
	renderWindow->SetSize(640, 480);
	renderWindow->SetWindowName("Import3DS");

    // 导出obj文件(*.obj),用于在paraview中显示
	vtkSmartPointer<vtkOBJExporter> exporter = vtkSmartPointer<vtkOBJExporter>::New();
	exporter->SetFilePrefix("car");
	exporter->SetRenderWindow(renderWindow);
	exporter->Write();


	renderWindowInteractor->Start();

	return EXIT_SUCCESS;
}

运行后在VTK中的显示效果为:

然后在Paraview中导入生成的car.obj,效果如下(显示的颜色是其属性数据:法向量):

 

扫描二维码关注公众号,回复: 2520034 查看本文章

猜你喜欢

转载自blog.csdn.net/dsfsdffgfd/article/details/81333918