如何在vtk中缩放PolyData而不进行翻译?

问题描述 投票:0回答:1

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

我尝试了带有比例元组的vtkTransform,但问题是缩放的polydata正在旋转。

这是代码:

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

python scale transformation vtk
1个回答
1
投票

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

这是因为缩放变换简单地定义为将坐标乘以给定因子(参见例如https://www.tutorialspoint.com/computer_graphics/3d_transformation.htm)。这本质上意味着它是针对某个参考点完成的。您的transform.Scale()调用将使用原点(0,0,0)作为此参考点,并且由于您的对象显然不是以原点为中心,因此您获得了翻译(而不是您声称的旋转)。

要获得局部中心缩放,您需要在对象周围选择一个参考点R(在您的情况下,因为您希望缩放的对象位于原始对象内,您需要某种中心 - 因为对象是“几乎凸出”,质心 - 所有点的平均值 - 可能足够好)。通过-R转换对象以使其与坐标系对齐,缩放,然后通过+ R转换回来。

尝试一点练习可视化:简单的2D示例 - 绘制一个由坐标(2,2),(2,3),(3,3),(3,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)和平局 - 看到区别?

© www.soinside.com 2019 - 2024. All rights reserved.