簡體   English   中英

如何在vtk中縮放PolyData而不轉換它?

[英]How to scale a PolyData in vtk without translating it?

我在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,以查看兩個網格。 在下面的圖片中,您可以看到綠色的網格已完全移動,但是我要縮放,因此綠色的網格完全在原始的黃色網格內。

以上代碼結果

可以在此處找到簡單答案(無解釋): 縮放3D模型,找到起點

那是因為縮放變換被簡單地定義為將坐標乘以給定的因子(例如,參見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)和平局-看到區別了嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM