enthought / mayavi

3D visualization of scientific data in Python
http://docs.enthought.com/mayavi/mayavi/
Other
1.3k stars 285 forks source link

Camera off-centered when loading saved visualization #283

Closed kitchoi closed 8 years ago

kitchoi commented 8 years ago

To reproduce the problem:

from mayavi import mlab

# save visualization
mlab.test_contour3d()
mlab.view(135.8, 73., 144., [ 32.5,  32.5,  32.5])
mlab.get_engine().save_visualization("test_bug")

# the image is off centered
mlab.get_engine().load_visualization("test_bug")

If I pop the camera.distance attribute then it works fine

# remove "distance" from the camera's attribute
from apptools.persistence import state_pickler
state = state_pickler.load_state("test_bug")
state.scenes[0].scene.camera.pop("distance")
state_pickler.dump(state, "test_fix_bug")

# the image is now fine
mlab.get_engine().load_visualization("test_fix_bug")

Branch: master OS: Ubuntu 12.04 LTS (on VirtualMachine, with OpenGL) Traits version: 4.5.0 Camera state:

{'__metadata__': {'class_name': 'OpenGLCamera',
  'has_instance': True,
  'id': 50,
  'initargs': (None, 0),
  'module': 'tvtk.tvtk_classes.open_gl_camera',
  'type': 'instance',
  'version': [(('CHasTraits', 'traits.ctraits'), -1),
   (('HasTraits', 'traits.has_traits'), -1),
   (('HasStrictTraits', 'traits.has_traits'), -1),
   (('TVTKBase', 'tvtk.tvtk_base'), -1),
   (('ObjectBase', 'tvtk.tvtk_classes.object_base'), -1),
   (('Object', 'tvtk.tvtk_classes.object'), -1),
   (('Camera', 'tvtk.tvtk_classes.camera'), -1),
   (('OpenGLCamera', 'tvtk.tvtk_classes.open_gl_camera'), -1)]},
 'clipping_range': array([  39.46454858,  275.93593257]),
 'debug': 0,
 'debug_': 0,
 'distance': 143.99999999999997,
 'eye_angle': 2.0,
 'focal_disk': 1.0,
 'focal_point': array([ 32.5,  32.5,  32.5]),
 'global_warning_display_': 0,
 'head_tracked': 0,
 'left_eye': 1,
 'parallel_projection': 0,
 'parallel_projection_': 0,
 'parallel_scale': 54.559600438419636,
 'position': array([ -66.22424341,  128.50513171,   74.60152548]),
 'thickness': 236.47138398428615,
 'use_horizontal_view_angle': 0,
 'use_horizontal_view_angle_': 0,
 'view_angle': 30.0,
 'view_plane_normal': array([-0.68558502,  0.6667023 ,  0.2923717 ]),
 'view_shear': array([ 0.,  0.,  1.]),
 'view_up': array([ 0.,  0.,  1.]),
 'window_center': array([ 0.,  0.])}

original reloaded

kitchoi commented 8 years ago

The camera state in the above thread is for when the scene is saved.

Here is the camera state after load_visualization is called. Notice that distance is actually correct, but focal_point and view_plane_normal are different.

{'__metadata__': {'class_name': 'OpenGLCamera',
  'has_instance': True,
  'id': 0,
  'initargs': (None, 0),
  'module': 'tvtk.tvtk_classes.open_gl_camera',
  'type': 'instance',
  'version': [(('CHasTraits', 'traits.ctraits'), -1),
   (('HasTraits', 'traits.has_traits'), -1),
   (('HasStrictTraits', 'traits.has_traits'), -1),
   (('TVTKBase', 'tvtk.tvtk_base'), -1),
   (('ObjectBase', 'tvtk.tvtk_classes.object_base'), -1),
   (('Object', 'tvtk.tvtk_classes.object'), -1),
   (('Camera', 'tvtk.tvtk_classes.camera'), -1),
   (('OpenGLCamera', 'tvtk.tvtk_classes.open_gl_camera'), -1)]},
 'clipping_range': array([  39.46454858,  275.93593257]),
 'debug': 0,
 'debug_': 0,
 'distance': 139.1905645553869,
 'eye_angle': 2.0,
 'focal_disk': 1.0,
 'focal_point': array([ 32.5       ,  32.5       ,  94.86360111]),
 'global_warning_display_': 1,
 'head_tracked': 0,
 'left_eye': 1,
 'parallel_projection': 0,
 'parallel_projection_': 0,
 'parallel_scale': 54.559600438419636,
 'position': array([ -66.22424341,  128.50513171,   74.60152548]),
 'thickness': 236.47138398428615,
 'use_horizontal_view_angle': 0,
 'use_horizontal_view_angle_': 0,
 'view_angle': 30.0,
 'view_plane_normal': array([-0.70927396,  0.68973879, -0.14557076]),
 'view_shear': array([ 0.,  0.,  1.]),
 'view_up': array([ 0.,  0.,  1.]),
 'window_center': array([ 0.,  0.])}

VTK version: 5.8.0

kitchoi commented 8 years ago

my mistake, the distance is wrong here too.