vtk类之vtkRotationalExtrusionFilter:建模筛选器, 它采用多边形数据作为输入,并生成输出的多边形数据
vtkRotationalExtrusionFilter 是一个建模筛选器。它采用多边形数据作为输入,并生成输出的多边形数据。输入数据集是围绕 z 轴扫描出来的,以创建新的多边形基元。这些基元构成一个"裙边"或扫掠的曲面。例如,扫描一个线作为输入数据,环绕z轴扫描一圈就创建圆环的多边形的数据。
此筛选器有许多参数可以设置。您可以控制是否 2D 对象 (即,多边形或三角地带) 的扫描上铺的生成几何通过"旋盖"的实例变量。另外,您可以控制旋转,角度和旋转以及是否执行沿 z 轴的平移。(平移是以创建类似"弹簧"的螺旋样式模型非常有用)。您还可以调整"DeltaRotation"来生成渐变的半径(形如始终发条模型)。
这条裙子是由定位某些拓扑功能生成的。自由边 (多边形或仅由一个多边形或三角带使用三角形条带的边缘) 生成曲面。这是真正还的直线或折线。顶点生成行。
此筛选器可用于模型轴对称的物体,如气瓶、 瓶、 和葡萄酒杯 ;或平移/旋转对称的物体,如弹簧或 corkscrews。
基本方法:
SetResolution() 设置生成瓶子表面的光滑度参数,瓶子的表面由多少个面构成
SetAngle() 置旋转生产新的poly data的最大角度
SetTranslation(0) 设置旋转产生沿着z轴方向,生产新的一列poly data 的时候,对该列沿着z方向的平移量,默认是0 不坐平移
SetDeltaRadius(0) 设置旋转产生新的列polydata 的时候,在x-y平面上,向外围扩展半径长度,每列比上一列半径加2, 默认是0
例:
#-*- coding: UTF-8 -*- #------------------------------------------------------------------------------- # Name: rotationalExtrusionFilterActorFactory package # Purpose: 测试 旋转filter # # Author: ankier # # Created: 13-12-2012 # Copyright: (c) ankier 2012 # Licence: <Copyright©2004-2012 ankier> #------------------------------------------------------------------------------- from ActorFactory import ActorFactory from glo import Global from vtk import * ## @brief 直线的actor factory class RotationalExtrusionFilterActorFactory(ActorFactory): def __init__(self): ActorFactory.__init__(self) self.__PolyDataPoints = vtkPoints() self.__PolyDataCells = vtkCellArray() self.__PolyData = vtkPolyData() self.__RotationalExtrusionFilter = vtkRotationalExtrusionFilter() self.__PolyDataMapper = vtkPolyDataMapper() self.__initialize() def __del__(self): del self.__PolyDataPoints del self.__PolyDataCells del self.__PolyData del self.__RotationalExtrusionFilter del self.__PolyDataMapper def __initialize(self): #定义瓶子轮廓线的点坐标 self.__PolyDataPoints.InsertPoint(0, 0.01,0.0,0.0) self.__PolyDataPoints.InsertPoint(1, 1.5,0.0,0.0) self.__PolyDataPoints.InsertPoint(2, 1.5,0.0,3.5) self.__PolyDataPoints.InsertPoint(3, 1.25,0.0,3.75) self.__PolyDataPoints.InsertPoint(4, 0.75,0.0,4.00) self.__PolyDataPoints.InsertPoint(5, 0.6,0.0,4.35) self.__PolyDataPoints.InsertPoint(6, 0.7,0.0,4.65) self.__PolyDataPoints.InsertPoint(7, 1.0,0.0,4.75) self.__PolyDataPoints.InsertPoint(8, 1.0,0.0,5.0) self.__PolyDataPoints.InsertPoint(9, 0.5,0.0,5.0) #构建线单元,绘制轮廓线 self.__PolyDataCells.InsertNextCell(10) self.__PolyDataCells.InsertCellPoint(0) self.__PolyDataCells.InsertCellPoint(1) self.__PolyDataCells.InsertCellPoint(2) self.__PolyDataCells.InsertCellPoint(3) self.__PolyDataCells.InsertCellPoint(4) self.__PolyDataCells.InsertCellPoint(5) self.__PolyDataCells.InsertCellPoint(6) self.__PolyDataCells.InsertCellPoint(7) self.__PolyDataCells.InsertCellPoint(8) self.__PolyDataCells.InsertCellPoint(9) #使用点集合和 cell集合组成poly data self.__PolyData.SetPoints(self.__PolyDataPoints) self.__PolyData.SetLines(self.__PolyDataCells) #压制轮廓线,形成瓶子实体 self.__RotationalExtrusionFilter.SetInput(self.__PolyData) #设置生成瓶子表面的光滑度参数,瓶子的表面由多少个面构成 self.__RotationalExtrusionFilter.SetResolution(10) #设置旋转生产新的poly data的最大角度 #self.__RotationalExtrusionFilter.SetAngle(90) #设置旋转产生沿着z轴方向,生产新的一列poly data 的时候,对该列沿着z方向的平移量,默认是0 不坐平移 self.__RotationalExtrusionFilter.SetTranslation(0) #设置旋转产生新的列polydata 的时候,在x-y平面上,向外围扩展半径长度,每列比上一列半径加2, 默认是0 self.__RotationalExtrusionFilter.SetDeltaRadius(0) self.__PolyDataMapper.SetInput(self.__RotationalExtrusionFilter.GetOutput()) ## @brief 更新线的poly data def __UpdateData(self): pass ## @brief 重写基类方法 # see ActorFactory._MakeActors def _MakeActors(self): actor = self._NewActor() actor.SetMapper(self.__PolyDataMapper) actor.GetProperty().SetColor((0.1, 0.1, 0.5)) return [actor]
运行效果:
如果以如下3个点作为filter的输入,
修改初始化函数如下:
def __initialize(self): #定义瓶子轮廓线的点坐标 self.__PolyDataPoints.InsertPoint(0, 1.0,0.0,0.0) self.__PolyDataPoints.InsertPoint(1, 1,0.0, 0.5) self.__PolyDataPoints.InsertPoint(2, 1,0.0, 1) #构建线单元,绘制轮廓线 self.__PolyDataCells.InsertNextCell(3) self.__PolyDataCells.InsertCellPoint(0) self.__PolyDataCells.InsertCellPoint(1) self.__PolyDataCells.InsertCellPoint(2) #使用点集合和 cell集合组成poly data self.__PolyData.SetPoints(self.__PolyDataPoints) self.__PolyData.SetLines(self.__PolyDataCells) #压制轮廓线,形成瓶子实体 self.__RotationalExtrusionFilter.SetInput(self.__PolyData) #设置生成瓶子表面的光滑度参数,瓶子的表面由多少个面构成 self.__RotationalExtrusionFilter.SetResolution(1000) #设置旋转生产新的poly data的最大角度 self.__RotationalExtrusionFilter.SetAngle(760) #设置旋转产生沿着z轴方向,生产新的一列poly data 的时候,对该列沿着z方向的平移量,默认是0 不坐平移 self.__RotationalExtrusionFilter.SetTranslation(0) #设置旋转产生新的列polydata 的时候,在x-y平面上,向外围扩展半径长度,每列比上一列半径加2, 默认是0 self.__RotationalExtrusionFilter.SetDeltaRadius(2) self.__PolyDataMapper.SetInput(self.__RotationalExtrusionFilter.GetOutput())
运行效果如下: