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

axesrotate3d

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.

Best 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