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 查看本文章