VTK-vtkAbstractTransform及其子类

前言:本博文主要研究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数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雪易

给我来点鼓励吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值