如何在vtk中缩放PolyData而不转换它?

时间:2019-04-23 14:53:46

标签: python scale transformation vtk

我正在python中使用VTK导入.stl文件。那么我想做的就是缩小网格并使其变小而不改变方向矩阵。

我尝试过使用缩放元组vtkTransform,但是问题是缩放后的多数据正在旋转。

代码如下:

def scaleSTL(filenameSTL, opacity=0.75, scale=(1,1,1), mesh_color="gold"):
    colors = vtk.vtkNamedColors()

    reader = vtk.vtkSTLReader()
    reader.SetFileName(filenameSTL)
    reader.Update()

    transform = vtk.vtkTransform()
    transform.Scale(scale)

    transformFilter = vtk.vtkTransformPolyDataFilter()
    transformFilter.SetInputConnection(reader.GetOutputPort())
    transformFilter.SetTransform(transform)
    transformFilter.Update()

    mapper = vtk.vtkPolyDataMapper()
    mapper.SetInputConnection(transformFilter.GetOutputPort())

    actor = vtk.vtkActor()
    actor.SetMapper(mapper)
    actor.GetProperty().SetColor(colors.GetColor3d(mesh_color))
    actor.GetProperty().SetOpacity(opacity)

    return actor

def render_scene(my_actor_list):
    renderer = vtk.vtkRenderer()
    for arg in my_actor_list:
        renderer.AddActor(arg)
    namedColors = vtk.vtkNamedColors()
    renderer.SetBackground(namedColors.GetColor3d("SlateGray"))

    window = vtk.vtkRenderWindow()
    window.SetWindowName("Oriented Cylinder")
    window.AddRenderer(renderer)

    interactor = vtk.vtkRenderWindowInteractor()
    interactor.SetRenderWindow(window)

    # Visualize
    window.Render()
    interactor.Start()

if __name__ == "__Main__":

    filename = "400_tri.stl"
    scale01 = (1, 1, 1)
    scale02 = (0.5, 0.5, 0.5)
    my_list = []
    my_list.append(scaleSTL(filename, 0.75, scale01, "Gold"))
    my_list.append(scaleSTL(filename, 0.75, scale02, "DarkGreen"))
    render_scene(my_list)

我使用了网格文件kidney.stl(黄色),但是得到的是缩放和旋转的网格。我将不透明度设置为0.75,以查看两个网格。在下面的图片中,您可以看到绿色的网格已完全移动,但是我要缩放以使绿色的网格完全在原始的黄色网格内。

above code result

1 个答案:

答案 0 :(得分:1)

简单的答案(没有解释)可以在这里找到:Scaling 3D models, finding the origin

这是因为缩放变换的定义很简单,就是将坐标乘以给定的因子(例如,参见https://www.tutorialspoint.com/computer_graphics/3d_transformation.htm)。从本质上讲,这是相对于某个参考点完成的。您的transform.Scale()调用将使用原点(0,0,0)作为该参考点,并且由于您的对象显然不在原点中心,因此可以进行平移(而不是旋转,因为您声称btw)。

要获得局部居中的缩放比例,您需要在要缩放的对象上选择参考点R(在这种情况下,由于您希望缩放后的对象位于原始对象之内,因此您需要某种中心-由于对象是“几乎是凸的”,因此质心-所有点的平均值-可能足够好)。用-R转换对象,使其与坐标系对齐,缩放,然后再按+ R转换。

尝试一些练习以可视化此内容:一个简单的2D示例-绘制一个由坐标为(2,2),(2,3),(3,3),(3,2)和“比例”的点组成的正方形按2“-您将得到(4,4),(4,6),(6,6),(6,4)-也将其绘制出来。现在尝试替代方法-首先通过正方形的中心(2.5,2.5)进行平移,您会得到(-0.5,-0.5),(-0.5,0.5),(0.5,0.5),(0.5,-0.5)(将其绘制) ,按2的比例缩放,则得到(-1,-1),(-1、1),(1,1),(1,-1)(绘制),最后平移2.5:(1.5,1.5), (1.5,3.5),(3.5,3.5),(3.5、1.5)和平局-看到区别了吗?