Поверните vtkDiskSource / vtkPolyDataMapper по нормали - PullRequest
0 голосов
/ 11 ноября 2018

Мне нужно поместить несколько vtkDiskSource поверх поверхности сетки (представленной как vtkPolyDataMapper), чтобы диски лежали на поверхности. Такие объекты, как vtkRegularPolygonSource, имеют метод SetNormal, который можно использовать для «вращения». Также есть vtkTransform, но я не знаю, как рассчитать значения X, Y, Z. Кто-нибудь может мне помочь с этим?

disk = vtk.vtkDiskSource()
disk.SetInnerRadius(1.0)
disk.SetOuterRadius(2.0)

<---- rotation

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

1 Ответ

0 голосов
/ 29 ноября 2018

Вы можете использовать vtk.Transform, чтобы поместить vtk.DiskSource в правильную ориентацию на поверхности сетки.

disk = vtk.vtkDiskSource()
disk.SetInnerRadius(1.0)
disk.SetOuterRadius(2.0)
disk.Update()

# Assume we have the normal of the mesh surface in normal
# and the position in coords

z_axis = [0., 0., 1.]
axis = np.cross(z_axis, normal)
angle = np.arccos(n.dot(z_axis, normal))
transform = vtk.vtkTransform()
# Put the disks a bit above the mesh, otherwise they might be partially burried
transform.Translate(*(coords + 0.1 * normal))
transform.RotateWXYZ(n.degrees(angle), *axis)
transform_filter = vtk.vtkTransformPolyDataFilter()
transform_filter.SetTransform(transform)
transform_filter.SetInputConnection(disk.GetOutputPort())
transform_filter.Update()

diskmapper = vtk.vtkPolyDataMapper()
diskmapper.SetInputConnection(transform_filter.GetOutputPort())
# Go on setting up actors 
...