I've just realized that there is, in fact, a simple solution. First, a demonstration of what happens normally (a MWE if you will):
settings.outformat="png";
settings.render=4;
import three;
size(4cm);
currentprojection = perspective(2,0.7,0.8);
path3 thecircle = circle(c=X, r=0.5, normal=X);
surface cyl = extrude(thecircle, -2X);
draw(cyl, surfacepen=white);
dot((1,0.5,0), L=Label("$a$", align=E));
dot((-1,0.5,0), L=Label("$b$", align=E));

If we add the labels using a label
command rather than the dot
command, then there is a parameter called interaction
that comes to the rescue. An interaction, defined in three_surface.asy
, is created with the constructor
interaction(int type, bool targetsize=false);
The parameter we really care about is the second one, targetsize
; if it's true
, then the labels are rescaled so that they appear the same size from the current point of view (and look very strange from any other point of view). The first parameter determines whether the labels rotate to face the viewer in interactive view: 1
if they do, 0
if they don't.
Thus, the following code gives the desired result (although the interactive view is not good):
settings.outformat="png";
settings.render=4;
import three;
size(4cm);
currentprojection = perspective(2,0.7,0.8);
path3 thecircle = circle(c=X, r=0.5, normal=X);
surface cyl = extrude(thecircle, -2X);
draw(cyl, surfacepen=white);
interaction constantsize = settings.autobillboard ? interaction(1,true) : interaction(0,true);
dot((1,0.5,0) ^^ (-1,0.5,0));
label(position=(1,0.5,0), L=Label("$a$", align=E), constantsize);
label(position=(-1,0.5,0), L=Label("$b$", align=E), constantsize);

Note that the camera is actually in a slightly different position since it does not have to move to keep the larger a
within view.
-render 0
it does three-D as vectors with no scaling. This might help with the labels, but perhaps won't make the lines look as good.-render 0
the label scaling is disabled and all the lines are drawn as simple vectors rather than rendered as proper 3D lines. Does this do what you want?