Ниже приведен пример вращения встроенного объекта цилиндра с помощью MayaVi transform_data:
import numpy as np
from mayavi import mlab
from mayavi.sources.builtin_surface import BuiltinSurface
from mayavi.modules.surface import Surface
from mayavi.filters.transform_data import TransformData
def rotMat3D(axis, angle, tol=1e-12):
"""Return the rotation matrix for 3D rotation by angle `angle` degrees about an
arbitrary axis `axis`.
"""
t = np.radians(angle)
x, y, z = axis
R = (np.cos(t))*np.eye(3) +\
(1-np.cos(t))*np.matrix(((x**2,x*y,x*z),(x*y,y**2,y*z),(z*x,z*y,z**2))) + \
np.sin(t)*np.matrix(((0,-z,y),(z,0,-x),(-y,x,0)))
R[np.abs(R)<tol]=0.0
return R
# Main code
fig = mlab.figure()
engine = mlab.get_engine()
# Add a cylinder builtin source
cylinder_src = BuiltinSurface()
engine.add_source(cylinder_src)
cylinder_src.source = 'cylinder'
cylinder_src.data_source.center = np.array([ 0., 0., 0.])
cylinder_src.data_source.radius = 1.0
cylinder_src.data_source.capping = False
cylinder_src.data_source.resolution = 25
# Add transformation filter to rotate cylinder about an axis
transform_data_filter = TransformData()
engine.add_filter(transform_data_filter, cylinder_src)
Rt = np.eye(4)
Rt[0:3,0:3] = rotMat3D((1,0,0), 0) # in homogeneous coordinates
Rtl = list(Rt.flatten()) # transform the rotation matrix into a list
transform_data_filter.transform.matrix.__setstate__({'elements': Rtl})
transform_data_filter.widget.set_transform(transform_data_filter.transform)
transform_data_filter.filter.update()
transform_data_filter.widget.enabled = False # disable the rotation control further.
# Add surface module to the cylinder source
cyl_surface = Surface()
engine.add_filter(cyl_surface, transform_data_filter)
# add color property
cyl_surface.actor.property.color = (1.0, 0.0, 0.0)
mlab.show()
В приведенном выше примере, линия Rt[0:3,0:3] = rotMat3D((1,0,0), 0)
создает матрицу вращения (ни один компонент перевода не присутствует в этом примере, хотя это также может быть там) для поворота объекта относительно оси x на нулевую степень (чтобы показать случай отсутствия вращения). Это может быть любое другое значение, как будет показано ниже. Запуск выше код дает следующее:
![enter image description here](https://i.stack.imgur.com/2XGcj.png)
Теперь вы можете вращать объект на 90 градусов, изменяя вышеуказанную линию Rt[0:3,0:3] = rotMat3D((1,0,0), 90)
, которая будет производить следующий рисунок:
![enter image description here](https://i.stack.imgur.com/IXuSE.png)
Примечание что вы, скорее всего, также получите предупреждение, например:
Warning: In C:\pisi\tmp\VTK-5.6.0-1\work\VTK\Common\vtkTransform.cxx, line 202 vtkTransform (000000000D3AB3A0): InternalUpdate: doing hack to support legacy code. This is deprecated in VTK 4.2. May be removed in a future version.
Это связано с тем, что Mayavi не был обновлен, чтобы использовать новый трубопровод VTK.
Какой тип данных для вращения? Вам нужно выполнить свое вращение с помощью майави или вы можете использовать методы и фильтры VTK? (для выполнения вращения перед рендерингом) – Marcassin
Я хочу использовать фильтр vtk для выполнения delaunay2D на основе x, z вместо x, y (следовательно, поворот по оси x). Сначала до и после этого .. – TazgerO
Попробуйте привязать вывод 'vtkTransform' к входу вашего фильтра delaunay. Сделайте поворот в фильтре преобразования с помощью метода 'vtkTransform :: RotateX (двойной угол). Вращение вокруг X ax может выполняться на ваших данных перед обработкой фильтра Delaunay. – Marcassin