MATLAB Answers

0

How to add to a figure a second set of 3D axes insensitive to rotate3d, pan, zoom?

Asked by Octavian on 24 Feb 2015
Latest activity Edited by Stephen Cobeldick on 26 Feb 2015
Dear All,
I have a plot3 object (3D surface) in a figure that I can (and often have to) freely rotate3d, pan, zoom. I need to add text to the figure that would be still with respect to rotate3d, pan, zoom (would look like caption on TV). Here is the relevant code portion:
figure;
plot3(surface..)
...
panHandle = pan(gcf);
rotateHandle = rotate3d(gcf);
zoomHandle = zoom(gcf);
set(rotateHandle,'ActionPreCallback',@rotationStarted);
set(rotateHandle,'ActionPostCallback',@rotationDone);
rotateHandle.Enable='on';
set(zoomHandle,'ActionPreCallback',@zoomStarted)
set(zoomHandle,'ActionPostCallback',@zoomEnded)
zoomHandle.Enable='on';
set(panHandle,'ActionPreCallback',@panStarted)
set(panHandle,'ActionPostCallback',@panEnded)
panHandle.Enable='on';
function rotationStarted(~,rotateHandle)
for i=1:length(Handle)
set(Handle{i},'visible','off');
end
end
function rotationDone(~,rotateHandle)
for i=1:length(Handle)
set(Handle{i},'visible','on');
end
end
function zoomStarted(~,zoomHandle)
for i=1:length(Handle)
set(Handle{i},'visible','off');
end
end
function zoomEnded(~,zoomHandle)
for i=1:length(Handle)
set(Handle{i},'visible','on');
end
end
function panStarted(~,panHandle)
for i=1:length(Handle)
set(Handle{i},'visible','off');
end
end
function panEnded(~, panHandle)
for i=1:length(Handle)
set(Handle{i},'visible','on');
end
end
I thought that the natural way is to add a second set of 3D axes identical to the plot3 object ones, however which would not be subject to rotate3d, pan, zoom (ie. restrict the rotation handles to axes1 instead of gcf), and add text to this second axis set.
Please advise, thank you,
Octavian.

  0 Comments

Sign in to comment.

1 Answer

Answer by Stephen Cobeldick on 24 Feb 2015
Edited by Stephen Cobeldick on 26 Feb 2015
 Accepted Answer

I did something very similar to this in a FEX submssion:
Run the function cubehelix_view: you can see how the warning text is always static, even when the 3D axes are clickable and rotatable. This text is actually on some 2D axes, invisible and infront of the 3D axes, and so does not move when the 3D axes are rotated or panned.
Simply add the static axes in front of the zoomable axes (either after creating the zoomable axes, or using uistack to adjust the order), then change its axes properties :
  • Visible -> off
  • HitTest -> off
  • PickableParts -> none

  3 Comments

great, it worked, thank you Stephen. although I get an error if trying to use PickableParts for axes, states not a viable axes property, I use matlab 13b Octavian
I'm glad it worked for you. PickableParts seems to be a new feature. It doesn't exist in my version either, so I wouldn't worry about it!
The PickableParts property was added in R2014b so that you could control the visibility and pickability separately. If you don't set PickableParts, then it will just match your setting for Visible. I think that's fine for what you're trying to do here.

Sign in to comment.