MATLAB Answers

0

Make 3-D annotations independent of viewpoint

Asked by Marijn Nijenhuis on 14 Jul 2017
Latest activity Commented on by Marijn Nijenhuis on 21 Jul 2017
I would like to annotate various straight lines in a 3-D plot in MATLAB, by showing the line number in the middle of the line. It serves as an identifier to users, so it should remain visible and readable when the plot is being rotated. Currently, I am using this:
plot3([0 1],[0 1],[0 1])
th = text(0.5,0.5,0.5,'1');
set(th,'BackgroundColor','w','EdgeColor','k')
The label stays 'upright' when rotating (which is good), but depending on the viewpoint, the lines cross the number, making it hard to read.
Example 1: this viewpoint is OK:
Example 2: this viewpoint is not OK:
Do you have a suggestion for improving the annotations, such that the lines do not cross the line number visually? I cannot figure out how to deal with something like the z-index in these plots (e.g. uistack(th) does not seem to work).

  0 Comments

Sign in to comment.

1 Answer

Answer by Saurabh Gupta on 19 Jul 2017

Conceptually speaking, I think there is a fundamental difference between what you want to achieve and the way the plot is being rendered in 3D. I'm not an expert in this area, but I will try to explain as follows.
The concept of uistack applies to 2D UI design where you have to decide which visual elements appear at what part of visual ordering because there is exactly one viewpoint. On the other hand, 3D rendering depends upon the relative ordering of the specific points in the current viewpoint. A point is hidden if there is another point closer to the observer obscuring it.
Your text box is being rendered at point (0.5,0.5,0.5) in space with default (i.e. left) horizontal alignment, as per your design. During rotation, the text is re-rendered using the same logic based on the view-point to make sure it is consistently readable. But the text is very much a visual element in the 3D space/axes.
The part of the line that you are perceiving to be crossing the text is actually in front of the text-box in 3D space and is expected to be displayed. The part that gets cut-off is the part that is behind the text-box, and hence obscured. You may be able to observe this effect more clearly using a longer string of text with centered horizontal alignment.
In order for the text to always stay in front of the plot, it will need to be outside the axes. You could use text style 'uicontrol' object and keep it on top of the visual UI stack (on top of the axes), but it would affect your ability to interact with the plot and the position of the text will not correspond to a point on the axes.

  1 Comment

Thank you. I think I see what you're saying. Since you say that the 3-D rendering depends on the object ordering relative to the current viewpoint (which makes sense), am I right that a solution approach would be to not plot those parts of the lines that lie in front of the number tag? I looked into this but realized it's actually rather complicated, since the line portion to be omitted obviously depends on the viewpoint.. For this particular problem, I expect that the users are going to be 3-D rotating the plots a lot, so I'm thinking of a solution/hack that would at least improve the number tag readability.

Sign in to comment.