Как масштабировать PolyData в vtk без его перевода? - PullRequest
0 голосов
/ 23 апреля 2019

Я использую VTK в Python для импорта файлов .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 Ответ

1 голос
/ 24 апреля 2019

Простой ответ (без объяснения) можно найти здесь: Масштабирование 3D-моделей, поиск источника

Это потому, что преобразование масштабирования определяется просто как умножение координат на данный коэффициент(см., например, https://www.tutorialspoint.com/computer_graphics/3d_transformation.htm).. Это по сути означает, что это сделано по отношению к определенной контрольной точке. Ваш вызов transform.Scale () будет использовать источник (0,0,0) в качестве этой контрольной точки и, поскольку ваш объекточевидно не центрирован вокруг источника, вы получаете перевод (не вращение, как вы заявляете, кстати).

Чтобы получить локально-центрированное масштабирование, вам нужно выбрать опорную точку R на вашем объекте, вокруг которого вы хотите масштабировать(в вашем случае, поскольку вы хотите, чтобы масштабированный объект находился внутри оригинала, вам нужен какой-то центр - поскольку объект «почти выпуклый», центроид - среднее по всем точкам - может быть достаточно хорошим). Переведите объект с помощью-R, чтобы выровнять его с системой координат, масштабировать и затем перевести обратно на + R.

Попробуйте немного exerДля наглядности приведем простой пример: нарисуйте квадрат из точек с координатами (2,2), (2,3), (3,3), (3,2) и «масштабируйте его на 2» - выget (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) (нарисуйте его)При масштабировании на два вы получаете (-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) и ничья - видите разницу?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...