VTK中导入并显示STL、3DS文件
VTK(visualization toolkit)是一個(gè)開源的免費(fèi)軟件系統(tǒng),主要用于三維計(jì)算機(jī)圖形學(xué)、圖像處理和科學(xué)計(jì)算可視化。VTK是在三維函數(shù)庫(kù)OpenGL 的基礎(chǔ)上采用面向?qū)ο蟮脑O(shè)計(jì)方法發(fā)展起來(lái)的,它將我們?cè)诳梢暬_發(fā)過(guò)程中會(huì)經(jīng)常遇到的細(xì)節(jié)屏蔽起來(lái),并將一些常用的算法封裝起來(lái)。它包含一個(gè)C++類庫(kù),和解釋封裝層,包括Tcl/Tk、Java、Python等。 采用這種架構(gòu)的優(yōu)勢(shì)是我們能使用C++語(yǔ)言建立高效的算法,用其他的腳本語(yǔ)言(如TCL、Python)可以進(jìn)行快速的開發(fā)。
VTK中可以導(dǎo)入/導(dǎo)出或讀/寫多種三維格式的文件,可以參考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模型文件格式,它采用三角形離散地近似表示三維模型,目前已被工業(yè)界認(rèn)為是快速成形領(lǐng)域的標(biāo)準(zhǔn)描述文件格式。這種文件不包括模型的材質(zhì)等信息。下面的代碼將讀入一個(gè)STL文件將其顯示在窗口中,并可以用鼠標(biāo)和鍵盤進(jìn)行一些簡(jiǎn)單的交互。
#!/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使用的一種二進(jìn)制存儲(chǔ)格式,VTK中可以使用vtk3DSImporter類導(dǎo)入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
總結(jié)
以上是生活随笔為你收集整理的VTK中导入并显示STL、3DS文件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: struts數據庫訪問
- 下一篇: Mac OS X的Apple Tail控