VTK中导入并显示STL、3DS文件
VTK(visualization toolkit)是一個開源的免費軟件系統,主要用于三維計算機圖形學、圖像處理和科學計算可視化。VTK是在三維函數庫OpenGL 的基礎上采用面向對象的設計方法發展起來的,它將我們在可視化開發過程中會經常遇到的細節屏蔽起來,并將一些常用的算法封裝起來。它包含一個C++類庫,和解釋封裝層,包括Tcl/Tk、Java、Python等。 采用這種架構的優勢是我們能使用C++語言建立高效的算法,用其他的腳本語言(如TCL、Python)可以進行快速的開發。
VTK中可以導入/導出或讀/寫多種三維格式的文件,可以參考What 3D file formats can VTK import and export?The following table identifies the file formats that VTK can read and write. Importer and Exporter classes move full scene information into or out of VTK. Reader and Writer classes move just geometry.
| File Format | Read | Write |
|---|---|---|
| 3D Studio | vtk3DSImporter | |
| AVS "UCD" format | vtkAVSucdReader | |
| Movie BYU | vtkBYUReader | vtkBYUWriter |
| Renderman | vtkRIBExporter | |
| Open Inventor 2.0 | vtkIVExporter/vtkIVWriter | |
| CAD STL | vtkSTLReader | vtkSTLWriter |
| Fluent GAMBIT ASCII | vtkGAMBITReader | |
| Unigraphics Facet Files | vtkUGFacetReader | |
| Marching Cubes | vtkMCubesReader | vtkMCubesWriter |
| Wavefront OBJ | vtkOBJExporter | |
| VRML 2.0 | vtkVRMLExporter | |
| VTK Structured Grid † | vtkStructuredGridReader | vtkStructuredWriter |
| VTK Poly Data † | vtkPolyDataReader | vtkPolyDataWriter |
| PLOT3D | vtkPLOT3DReader | |
| CGM | vtkCGMWriter | |
| OBJ | vtkOBJReader | |
| Particle | vtkParticleReader | |
| PDB | vtkPDBReader | |
| PLY | vtkPLYReader | vtkPLYWriter |
| Gaussian | vtkGaussianCubeReader | |
| Facet | vtkFacetReader | vtkFacetWriter |
| XYZ | vtkXYZMolReader | |
| Ensight ‡ | vtkGenericEnSightReader |
STL格式是一種3D模型文件格式,它采用三角形離散地近似表示三維模型,目前已被工業界認為是快速成形領域的標準描述文件格式。這種文件不包括模型的材質等信息。下面的代碼將讀入一個STL文件將其顯示在窗口中,并可以用鼠標和鍵盤進行一些簡單的交互。
#!/usr/bin/env python import vtk filename = "myfile.stl" reader = vtk.vtkSTLReader() reader.SetFileName(filename) mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(reader.GetOutputPort()) actor = vtk.vtkActor() actor.SetMapper(mapper) # Create a rendering window and renderer ren = vtk.vtkRenderer() renWin = vtk.vtkRenderWindow() renWin.AddRenderer(ren) # Create a renderwindowinteractor iren = vtk.vtkRenderWindowInteractor() iren.SetRenderWindow(renWin) # Assign actor to the renderer ren.AddActor(actor) # Enable user interface interactor iren.Initialize() renWin.Render() iren.Start()
C++版代碼如下:
#include <vtkPolyData.h>
#include <vtkSTLReader.h>
#include <vtkSmartPointer.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
int main ( int argc, char *argv[] )
{
if ( argc != 2 )
{
cout << "Required parameters: Filename" << endl;
return EXIT_FAILURE;
}
std::string inputFilename = argv[1];
vtkSmartPointer<vtkSTLReader> reader =
vtkSmartPointer<vtkSTLReader>::New();
reader->SetFileName(inputFilename.c_str());
reader->Update();
// Visualize
vtkSmartPointer<vtkPolyDataMapper> mapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(reader->GetOutputPort());
vtkSmartPointer<vtkActor> actor =
vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
vtkSmartPointer<vtkRenderer> renderer =
vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderWindow> renderWindow =
vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
renderer->AddActor(actor);
renderer->SetBackground(.3, .6, .3); // Background color green
renderWindow->Render();
renderWindowInteractor->Start();
return EXIT_SUCCESS;
}
View Code
3ds文件是是Autodesk 3dsMax使用的一種二進制存儲格式,VTK中可以使用vtk3DSImporter類導入3ds文件。
vtkImporter is an abstract class that specifies the protocol for importing actors, cameras, lights and properties into a vtkRenderWindow. The following takes place: 1) Create a RenderWindow and Renderer if none is provided. 2) Call ImportBegin, if ImportBegin returns False, return 3) Call ReadData, which calls: a) Import the Actors b) Import the cameras c) Import the lights d) Import the Properties 7) Call ImportEnd
Subclasses optionally implement the ImportActors, ImportCameras, ImportLights and ImportProperties or ReadData methods. An ImportBegin and ImportEnd can optionally be provided to perform Importer-specific initialization and termination. The Read method initiates the import process. If a RenderWindow is provided, its Renderer will contained the imported objects. If the RenderWindow has no Renderer, one is created. If no RenderWindow is provided, both a RenderWindow and Renderer will be created. Both the RenderWindow and Renderer can be accessed using Get methods.
#!/usr/bin/env python
# This example demonstrates the use of vtk3DSImporter.
# vtk3DSImporter is used to load 3D Studio files. Unlike writers,
# importers can load scenes (data as well as lights, cameras, actors
# etc.). Importers will either generate an instance of vtkRenderWindow
# and/or vtkRenderer or will use the ones you specify.
import vtk
# Create the importer and read a file
importer = vtk.vtk3DSImporter()
importer.ComputeNormalsOn()
importer.SetFileName("myfile.3ds")
importer.Read()
# Here we let the importer create a renderer and a render window for
# us. We could have also create and assigned those ourselves like so:
# renWin = vtk.vtkRenderWindow()
# importer.SetRenderWindow(renWin)
# Assign an interactor.
# We have to ask the importer for it's render window.
renWin = importer.GetRenderWindow()
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)
# Set the render window's size
renWin.SetSize(500, 500)
# Set some properties on the renderer.
# We have to ask the importer for it's renderer.
ren = importer.GetRenderer()
ren.SetBackground(0.1, 0.2, 0.4)
iren.Initialize()
renWin.Render()
iren.Start()
參考:
VTK/Examples/Python/STLReader
vtk3DSImporter Class Reference
常見三維文件格式之STL, VRML, X3D
3D模型文件--STL,OBJ,3DS
讀取3ds文件
Example demonstrates the use of vtk3DSImporter
http://public.kitware.com/pipermail/vtkusers/2011-June/068231.html
http://www.vtk.org/gitweb?p=VTK.git;a=blob;f=Examples/Rendering/Python/CADPart.py
總結
以上是生活随笔為你收集整理的VTK中导入并显示STL、3DS文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: struts數據庫訪問
- 下一篇: Mac OS X的Apple Tail控