有没有一种简单的方法可以防止标签根据其与perspective
3D 视图中的相机的距离进行缩放?(例如,参见第一个关于这个问题的评论或者本教程第 65 页。
编辑:我使用光栅化(settings.render != 0),因为使用 settings.render=0 时命令的顺序(而不是数学方程式)决定了哪些对象在前面(参见教程中的第 54 页)。
答案1
我刚刚意识到,实际上有一个简单的解决方案。首先,演示一下通常发生的情况(如果您愿意,可以称为 MWE):
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));
label
如果我们使用命令而不是命令添加标签dot
,那么有一个名为的参数interaction
可以解决问题。在中定义的交互three_surface.asy
是使用构造函数创建的
interaction(int type, bool targetsize=false);
我们真正关心的参数是第二个参数,targetsize
如果是true
,则标签会重新缩放,以便从当前视角看它们的大小相同(从任何其他视角看它们都很奇怪)。第一个参数确定标签是否在交互式视图中旋转以面向查看者:1
如果是,则旋转,0
否则不旋转。
因此,以下代码给出了所需的结果(尽管交互式视图并不好):
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);
请注意,相机实际上处于略微不同的位置,因为它不必移动即可保持a
视野范围内较大的物体。