@@ -864,17 +864,21 @@ def get_proj(self):
864
864
eye = R + self ._dist * ps
865
865
self .eye = eye
866
866
867
+ # Calculate the viewing axes for the eye position
868
+ u , v , n = self ._calc_view_axes (eye )
869
+ self ._view_u = u
870
+ self ._view_v = v
871
+ self ._view_n = n
872
+
867
873
# Generate the view and projection transformation matrices
868
874
if self ._focal_length == np .inf :
869
875
# Orthographic projection
870
- u , v , n = self ._get_view_axes (eye )
871
876
viewM = proj3d .view_transformation (u , v , n , eye )
872
877
projM = proj3d .ortho_transformation (- self ._dist , self ._dist )
873
878
else :
874
879
# Perspective projection
875
880
# Scale the eye dist to compensate for the focal length zoom effect
876
881
eye_focal = R + self ._dist * ps * self ._focal_length
877
- u , v , n = self ._get_view_axes (eye_focal )
878
882
viewM = proj3d .view_transformation (u , v , n , eye_focal )
879
883
projM = proj3d .persp_transformation (- self ._dist ,
880
884
self ._dist ,
@@ -1110,8 +1114,8 @@ def drag_pan(self, button, key, x, y):
1110
1114
return
1111
1115
1112
1116
# Transform the pan from the view axes to the data axees
1113
- u , v , n = self . _get_view_axes ( self .eye )
1114
- R = - np . array ([ u , v , n ]) / self ._box_aspect * self ._dist
1117
+ R = np . array ([ self ._view_u , self . _view_v , self . _view_n ] )
1118
+ R = - R / self ._box_aspect * self ._dist
1115
1119
dxyz_projected = R .T @ np .array ([dx , dy , dz ])
1116
1120
1117
1121
# Calculate pan distance
@@ -1125,7 +1129,7 @@ def drag_pan(self, button, key, x, y):
1125
1129
self .set_ylim3d (miny + dyy , maxy + dyy )
1126
1130
self .set_zlim3d (minz + dzz , maxz + dzz )
1127
1131
1128
- def _get_view_axes (self , eye ):
1132
+ def _calc_view_axes (self , eye ):
1129
1133
"""
1130
1134
Get the unit viewing axes in data coordinates.
1131
1135
`u` is towards the right of the screen
@@ -1237,8 +1241,7 @@ def _zoom_data_limits(self, scale_x, scale_y, scale_z):
1237
1241
angles. A scale factor > 1 zooms out and a scale factor < 1 zooms in.
1238
1242
"""
1239
1243
# Convert from the scale factors in the view frame to the data frame
1240
- u , v , n = self ._get_view_axes (self .eye )
1241
- R = np .array ([u , v , n ])
1244
+ R = np .array ([self ._view_u , self ._view_v , self ._view_n ])
1242
1245
S = np .array ([scale_x , scale_y , scale_z ])
1243
1246
scale = np .linalg .norm (R .T @(np .eye (3 )* S ), axis = 1 )
1244
1247
0 commit comments