2014-01-20 1 views
3

Я пытаюсь выполнить поворот моих данных о оси X. Я полагаю, что я должен использовать функцию mayavi.tools.pipeline.transform_data, но я не могу понять способ ее использования ...Как использовать mayavi.tools.pipeline.transform_data, чтобы завершить вращение вокруг оси x

Мне нужно применить матрицу поворота к данным, но я могу «Не знаю, как использовать функцию ... Любой намек?

+0

Какой тип данных для вращения? Вам нужно выполнить свое вращение с помощью майави или вы можете использовать методы и фильтры VTK? (для выполнения вращения перед рендерингом) – Marcassin

+0

Я хочу использовать фильтр vtk для выполнения delaunay2D на основе x, z вместо x, y (следовательно, поворот по оси x). Сначала до и после этого .. – TazgerO

+0

Попробуйте привязать вывод 'vtkTransform' к входу вашего фильтра delaunay. Сделайте поворот в фильтре преобразования с помощью метода 'vtkTransform :: RotateX (двойной угол). Вращение вокруг X ax может выполняться на ваших данных перед обработкой фильтра Delaunay. – Marcassin

ответ

4

Ниже приведен пример вращения встроенного объекта цилиндра с помощью 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

Теперь вы можете вращать объект на 90 градусов, изменяя вышеуказанную линию Rt[0:3,0:3] = rotMat3D((1,0,0), 90), которая будет производить следующий рисунок:

enter image description here

Примечание что вы, скорее всего, также получите предупреждение, например:

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.