渐近线:防止 3D 透视图中的标签缩放

渐近线:防止 3D 透视图中的标签缩放

有没有一种简单的方法可以防止标签根据其与perspective3D 视图中的相机的距离进行缩放?(例如,参见第一个关于这个问题的评论或者本教程第 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));

圆柱体上有两个点,分别标记为 a 和 b,较远的标记看起来小得多

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 和 b,两个标签大小相同

请注意,相机实际上处于略微不同的位置,因为它不必移动即可保持a视野范围内较大的物体。

相关内容