前言:本博文主要研究vtkAbstractTransform及其子类的实现原理,以及由此扩展的类。
目录
vtkAbstractTransform
vtkGeneralTransform
vtkGeoSphereTransform(9.0.3中没有该接口)
vtkGeoTransform(9.0.3中没有该接口)
vtkHomogeneousTransform
vtkIdentityTransform
vtkIterativeClosestPointTransform
vtkLandmarkTransform
vtkMartixToLinearTransform
vtkTransform
vtkWarpTransform
vtkCylindricalTransform
vtkSphericalTransform
vtkThinPlateSplineTransform
vtkAbstractTransform
位置:..\Common\Transforms
描述:vtkAbstractTransforms是VTK中几何变换的父类。vtk中几何变换主要分为两类:翘曲变换和齐次变换(包括线性变换)。
vtkGeneralTransform
描述:vtkGeneralTransform类似于vtkTransform和vtkPerspectiveTransform,但是它可以使用任何vtkAbstractTransform作为输入。然而,它不如其他两个有效,因为任意变换不能通过矩阵乘法连接起来。转换连接通过传递每个输入点来模拟。
vtkGeoSphereTransform(9.0.3中没有该接口)
vtkGeoTransform(9.0.3中没有该接口)
vtkHomogeneousTransform
描述:齐次变换。主要包括vtkLinearTransform、vtkMatrixToHomgeneousTransform、vtkPerspectiveTransform。vtkLinearTransform为线性几何变换。vtkPerspectiveTransform透视变换。vtkMatrixToHomgeneousTransform是一个非常简单的类,允许使用vtkMatrix4x4来代替vtkHomogeneousTransform或vtkAbstractTransform。例如,如果您使用它作为矩阵和vtkTransformPolyDataFilter之间的代理,那么对矩阵的任何修改都将自动反映在过滤器的输出中。
vtkLinearTransform包含以下子类:
vtkIdentityTransform
描述:vtkIdentityTransform只是简单的传递坐标而数据不变。其它转换类型也可以实现,但该接口的效率更高。
vtkIterativeClosestPointTransform(9.0.3中没有该接口)
vtkLandmarkTransform
描述:vtkLandmarkTransform由两组地标定义,计算的转换给出了最小二乘意义上的最佳拟合映射。索引是对应的,所以第一个集合中的点1将被映射到第二个集合中的点1,以此类推。调用SetSourceLandmarks和SetTargetLandmarks来指定两组地标,确保它们具有相同数量的点。
注意:无论何时添加、减去或设置点,都必须在vtkPoints对象上调用Modified(),否则转换可能不会更新。
vtkMartixToLinearTransform
描述:vtkMartixToLinearTransform是一个非常简单的类,允许使用vtkMatrix4x4来代替vtkLinearTransform或vtkAbstractTransform。例如,如果您使用它作为矩阵和vtkTransformPolyDataFilter之间的代理,那么对矩阵的任何修改都将自动反映在过滤器的输出中。
vtkTransform
描述:vtkTransform可用于描述三维线性(也称为仿射)坐标变换的全范围,在内部表示为4x4齐次变换矩阵。当您创建一个新的vtkTransform时,它总是初始化为标识转换。
SetInput()方法允许您将另一个变换(而不是恒等变换)设置为基变换。有一个管道机制来确保当输入被修改时,当前转换将相应地更新。Concatenate()方法也支持这种管道机制。
大多数用于操作此转换的方法,例如翻译,旋转和连接,可以在PreMultiply(默认值)或PostMultiply ode中操作。在预正片叠底模式下,转换、拼接等将在当前矩阵表示的任何转换之前发生。在PostMultiply模式下,附加的转换将发生在当前矩阵表示的任何转换之后。这个类在一个右手坐标系中使用右手旋转执行它的所有操作。其他一些图形库使用左手坐标系和旋转。
vtkWarpTransform
描述:翘曲变换。vtk中非线性几何变换的父类,包括vtkBSplineTransform、vtkCylindricalTransform、vtkGridTransform、vtkSphericalTransform、 vtkThinPlateSplineTransform。其中vtkBSplineTransform和vtkGridTransform在9.0.3版本中不存在。
vtkCylindricalTransform
描述:vtkCylindricalTransform将(r,theta,z)坐标转换为(x,y,z)坐标,然后再转换回来。角以弧度表示。默认情况下,它将柱坐标转换为矩形坐标,但GetInverse()返回的转换将做相反的事情。使用的方程是x = r*cos() y = r*sin() z = z。
vtkSphericalTransform
描述:vtkSphericalTransform将(r,phi,theta)坐标转换为(x,y,z)坐标,然后再转换回来。角以弧度表示。默认情况下,它将球形坐标转换为矩形坐标,但GetInverse()返回的转换将做相反的事情。所使用的方程是x = r*sin()*cos() ,y = *sin()*sin() ,z = r*cos()。
vtkThinPlateSplineTransform
描述:
vtkThinPlateSplineTransform描述了由一组源地标和目标地标定义的非线性扭曲转换。网格上任何靠近源地标的点都将被移动到靠近相应目标地标的地方。中间的点平滑地插入使用布克斯坦薄板样条算法。
要获得正确的TPS扭曲,如果数据是2D,则使用R2LogR内核,如果数据是3D,则使用R内核。或者你可以指定你自己的RBF。(因此这个类比纯TPS转换更通用。)
注意:
1)反变换是用迭代法计算的,比正变换更费时。
2)无论何时添加、减去或设置点,都必须在vtkPoints对象上调用Modified(),否则转换可能不会更新。
3)共线点构型(除了那些位于XY平面上的点)导致不稳定转换。通过禁用批量转换正则化,可以为任何配置计算正向转换。
另:
vtkAbstractTransform可以作为vtkTransformPolyDataFilter和vtkTransformFilter的输入。但两者存在不同之处。vtkTransformPolyDataFilter继承自父类vtkPolyDataAlgorithm;vtkTransformFilter继承自父类vtkPointSetAlgorithm。实现方式如下:
vtkSmartPointer<vtkTransform> transform =
vtkSmartPointer<vtkTransform>::New();
transform->Translate(100, 100, 0);
vtkSmartPointer<vtkTransformFilter> transformFilter =
vtkSmartPointer<vtkTransformFilter>::New();
transformFilter->SetInputConnection(stlreader->GetOutputPort());
transformFilter->SetTransform(transform);
vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(transformFilter->GetOutputPort());
vtkSmartPointer<vtkActor> actor =
vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
//actor->SetPosition(200,200,0);
vtkNew<vtkPolyData> pd;
vtkNew<vtkTransformPolyDataFilter> transformFilter2 ;
transformFilter2->SetInputData(stlreader->GetOutput());
transformFilter2->SetTransform(transform);
transformFilter2->Update();
//transformFilter2->GetOutput(); 为vtkPolyData数据。