vtk旋转扫描实体示例:vtkQuadRotationalExtrusionFilter、vtkRotationalExtrusionFilter
阅读原文时间:2023年07月14日阅读:2

sweep polygonal data creating "skirt" from free edges and lines, and lines from vertices

vtkQuadRotationalExtrusionFilter is a modeling filter. It takes polygonal data as input and generates polygonal data on output. The input dataset is swept around the z-axis to create new polygonal primitives. These primitives form a "skirt" or swept surface. For example, sweeping a line results in a cylindrical shell, and sweeping a circle creates a torus.

There are a number of control parameters for this filter. You can control whether the sweep of a 2D object (i.e., polygon or triangle strip) is capped with the generating geometry via the "Capping" instance variable. Also, you can control the angle of rotation, and whether translation along the z-axis is performed along with the rotation. (Translation is useful for creating "springs".) You also can adjust the radius of the generating geometry using the "DeltaRotation" instance variable.

The skirt is generated by locating certain topological features. Free edges (edges of polygons or triangle strips only used by one polygon or triangle strips) generate surfaces. This is true also of lines or polylines. Vertices generate lines.

This filter can be used to model axisymmetric objects like cylinders, bottles, and wine glasses; or translational/rotational symmetric objects like springs or corkscrews.

Warning:

If the object sweeps 360 degrees, radius does not vary, and the object does not translate, capping is not performed. This is because the cap is unnecessary.

Some polygonal objects have no free edges (e.g., sphere). When swept, this will result in two separate surfaces if capping is on, or no surface if capping is off.

See also:

vtkLinearExtrusionFilter vtkRotationalExtrusionFilter

Thanks:

This class was initially developed by Daniel Aguilera, CEA/DIF Ported and modified by Philippe Pebay, Kitware, 2011

Tests:

vtkQuadRotationalExtrusionFilter (Tests)

Definition at line 74 of file vtkQuadRotationalExtrusionFilter.h.

示例代码:

#ifndef INITIAL_OPENGL
#define INITIAL_OPENGL
#include
VTK_MODULE_INIT(vtkRenderingOpenGL)
VTK_MODULE_INIT(vtkInteractionStyle)
#endif
#include

using namespace std;
#include "vtkCamera.h"
#include "vtkInformation.h"
#include "vtkLineSource.h"
#include "vtkMultiBlockDataSet.h"
#include "vtkNew.h"
#include "vtkPolyDataMapper.h"
#include "vtkPolyDataNormals.h"
#include "vtkProperty.h"
#include "vtkRegressionTestImage.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkQuadRotationalExtrusionFilter.h"
#include "vtkTestUtilities.h"
int main()
{
// Create a line source
vtkNew line;
line->SetPoint1( ., ., . );
line->SetPoint2( ., ., . );
line->SetResolution( );
line->Update();

// Create mapper for line segment  
vtkNew<vtkPolyDataMapper> lineMapper;  
lineMapper->SetInputConnection( line->GetOutputPort() );

// Create actor for line segment  
vtkNew<vtkActor> lineActor;  
lineActor->SetMapper( lineMapper.GetPointer() );  
lineActor->GetProperty()->SetLineWidth(  );  
lineActor->GetProperty()->SetColor( ., ., . ); // deep sky blue

// Create multi-block data set for quad-based sweep  
vtkNew<vtkMultiBlockDataSet> lineMB;  
lineMB->SetNumberOfBlocks(  );  
lineMB->GetMetaData( static\_cast<unsigned>(  ) )->Set( vtkCompositeDataSet::NAME(), "Line" );  
lineMB->SetBlock( , line->GetOutput() );

// Create 3/4 of a cylinder by rotational extrusion  
vtkNew<vtkQuadRotationalExtrusionFilter> lineSweeper;  
lineSweeper->SetResolution(  );  
lineSweeper->SetInputData( lineMB.GetPointer() );  
lineSweeper->SetDefaultAngle(  );  
lineSweeper->Update();

// Retrieve polydata output  
vtkMultiBlockDataSet\* cylDS = vtkMultiBlockDataSet::SafeDownCast( lineSweeper->GetOutputDataObject(  ) );  
vtkPolyData\* cyl = vtkPolyData::SafeDownCast( cylDS->GetBlock(  ) );

// Create normals for smooth rendering  
vtkNew<vtkPolyDataNormals> normals;  
normals->SetInputData( cyl );

// Create mapper for surface representation  
vtkNew<vtkPolyDataMapper> cylMapper;  
cylMapper->SetInputConnection( normals->GetOutputPort() );  
cylMapper->SetResolveCoincidentTopologyToPolygonOffset();

// Create mapper for wireframe representation  
vtkNew<vtkPolyDataMapper> cylMapperW;  
cylMapperW->SetInputData( cyl );  
cylMapperW->SetResolveCoincidentTopologyToPolygonOffset();

// Create actor for surface representation  
vtkNew<vtkActor> cylActor;  
cylActor->SetMapper( cylMapper.GetPointer() );  
cylActor->GetProperty()->SetRepresentationToSurface();  
cylActor->GetProperty()->SetInterpolationToGouraud();  
cylActor->GetProperty()->SetColor( ., 0.3882, . ); // tomato

// Create actor for wireframe representation  
vtkNew<vtkActor> cylActorW;  
cylActorW->SetMapper( cylMapperW.GetPointer() );  
cylActorW->GetProperty()->SetRepresentationToWireframe();  
cylActorW->GetProperty()->SetColor( ., ., .);  
cylActorW->GetProperty()->SetAmbient( . );  
cylActorW->GetProperty()->SetDiffuse( . );  
cylActorW->GetProperty()->SetSpecular( . );

// Create a renderer, add actors to it  
vtkNew<vtkRenderer> ren1;  
ren1->AddActor( lineActor.GetPointer() );  
ren1->AddActor( cylActor.GetPointer() );  
ren1->AddActor( cylActorW.GetPointer() );  
ren1->SetBackground( ., ., . );

// Create a renderWindow  
vtkNew<vtkRenderWindow> renWin;  
renWin->AddRenderer( ren1.GetPointer() );  
renWin->SetSize( ,  );  
renWin->SetMultiSamples(  );

// Create a good view angle  
vtkNew<vtkCamera> camera;  
camera->SetClippingRange( 0.576398, 28.8199 );  
camera->SetFocalPoint( 0.0463079, -0.0356571, 1.01993 );  
camera->SetPosition( -2.47044, 2.39516, -3.56066 );  
camera->SetViewUp( 0.607296, -0.513537, -0.606195 );  
ren1->SetActiveCamera( camera.GetPointer() );

// Create interactor  
vtkNew<vtkRenderWindowInteractor> iren;  
iren->SetRenderWindow( renWin.GetPointer() );  
// Render and test  
renWin->Render();  
    iren->Start();

return ;  

}

运行显示结果:

sweep polygonal data creating "skirt" from free edges and lines, and lines from vertices

vtkRotationalExtrusionFilter is a modeling filter. It takes polygonal data as input and generates polygonal data on output. The input dataset is swept around the z-axis to create new polygonal primitives. These primitives form a "skirt" or swept surface. For example, sweeping a line results in a cylindrical shell, and sweeping a circle creates a torus.

There are a number of control parameters for this filter. You can control whether the sweep of a 2D object (i.e., polygon or triangle strip) is capped with the generating geometry via the "Capping" instance variable. Also, you can control the angle of rotation, and whether translation along the z-axis is performed along with the rotation. (Translation is useful for creating "springs".) You also can adjust the radius of the generating geometry using the "DeltaRotation" instance variable.

The skirt is generated by locating certain topological features. Free edges (edges of polygons or triangle strips only used by one polygon or triangle strips) generate surfaces. This is true also of lines or polylines. Vertices generate lines.

This filter can be used to model axisymmetric objects like cylinders, bottles, and wine glasses; or translational/rotational symmetric objects like springs or corkscrews.

Warning:

If the object sweeps 360 degrees, radius does not vary, and the object does not translate, capping is not performed. This is because the cap is unnecessary.

Some polygonal objects have no free edges (e.g., sphere). When swept, this will result in two separate surfaces if capping is on, or no surface if capping is off.

See also:

vtkLinearExtrusionFilter

Examples:

vtkRotationalExtrusionFilter (Examples)

Tests:

vtkRotationalExtrusionFilter (Tests)

示例代码:

#include
#ifndef INITIAL_OPENGL
#define INITIAL_OPENGL
#include
VTK_MODULE_INIT(vtkRenderingOpenGL)
VTK_MODULE_INIT(vtkInteractionStyle)
#endif
using namespace std;
// .SECTION Thanks
// This test was written by Philippe Pebay, Kitware SAS 2011

#include "vtkCamera.h"
#include "vtkLineSource.h"
#include "vtkNew.h"
#include "vtkPolyDataMapper.h"
#include "vtkPolyDataNormals.h"
#include "vtkProperty.h"
#include "vtkRegressionTestImage.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkRotationalExtrusionFilter.h"

int main()
{
// Create a line source
vtkNew line;
line->SetPoint1( ., ., . );
line->SetPoint2( ., ., . );
line->SetResolution( );

// Create mapper for line segment  
vtkNew<vtkPolyDataMapper> lineMapper;  
lineMapper->SetInputConnection( line->GetOutputPort() );

// Create actor for line segment  
vtkNew<vtkActor> lineActor;  
lineActor->SetMapper( lineMapper.GetPointer() );  
lineActor->GetProperty()->SetLineWidth(  );  
lineActor->GetProperty()->SetColor( ., ., . ); // deep sky blue

// Create 3/4 of a cylinder by rotational extrusion  
vtkNew<vtkRotationalExtrusionFilter> lineSweeper;  
lineSweeper->SetResolution(  );  
lineSweeper->SetInputConnection( line->GetOutputPort() );  
lineSweeper->SetAngle(  );

// Create normals for smooth rendering  
vtkNew<vtkPolyDataNormals> normals;  
normals->SetInputConnection( lineSweeper->GetOutputPort() );

// Create mapper for surface representation  
vtkNew<vtkPolyDataMapper> cylMapper;  
cylMapper->SetInputConnection( normals->GetOutputPort() );  
cylMapper->SetResolveCoincidentTopologyToPolygonOffset();

// Create mapper for wireframe representation  
vtkNew<vtkPolyDataMapper> cylMapperW;  
cylMapperW->SetInputConnection( lineSweeper->GetOutputPort() );  
cylMapperW->SetResolveCoincidentTopologyToPolygonOffset();  
// Create actor for surface representation  
vtkNew<vtkActor> cylActor;  
cylActor->SetMapper( cylMapper.GetPointer() );  
cylActor->GetProperty()->SetRepresentationToSurface();  
cylActor->GetProperty()->SetInterpolationToGouraud();  
cylActor->GetProperty()->SetColor( ., ., . ); // tomato  
// Create actor for wireframe representation  
vtkNew<vtkActor> cylActorW;  
cylActorW->SetMapper( cylMapperW.GetPointer() );  
cylActorW->GetProperty()->SetRepresentationToWireframe();  
cylActorW->GetProperty()->SetColor( ., ., .);  
cylActorW->GetProperty()->SetAmbient( . );  
cylActorW->GetProperty()->SetDiffuse( . );  
cylActorW->GetProperty()->SetSpecular( . );  
// Create a renderer, add actors to it  
vtkNew<vtkRenderer> ren1;  
ren1->AddActor( lineActor.GetPointer() );  
ren1->AddActor( cylActor.GetPointer() );  
ren1->AddActor( cylActorW.GetPointer() );  
ren1->SetBackground( ., ., . );

// Create a renderWindow  
vtkNew<vtkRenderWindow> renWin;  
renWin->AddRenderer( ren1.GetPointer() );  
renWin->SetSize( ,  );  
renWin->SetMultiSamples(  );  
// Create a good view angle  
vtkNew<vtkCamera> camera;  
camera->SetClippingRange( 0.576398, 28.8199 );  
camera->SetFocalPoint( 0.0463079, -0.0356571, 1.01993 );  
camera->SetPosition( -2.47044, 2.39516, -3.56066 );  
camera->SetViewUp( 0.607296, -0.513537, -0.606195 );  
ren1->SetActiveCamera( camera.GetPointer() );

// Create interactor  
vtkNew<vtkRenderWindowInteractor> iren;  
iren->SetRenderWindow( renWin.GetPointer() );

// Render and test  
renWin->Render();  
iren->Start();

return ;  

}

代码运行结果:

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章