如何摆脱 Asymptote 3D 图形中查看器的(错误)轴

如何摆脱 Asymptote 3D 图形中查看器的(错误)轴

我有一个渐近线我导出到 3D PDF 文件(包含 PRC)的 3D 曲面图(代码如下)。我包括带有 LaTeX 标签的漂亮轴,但除此之外,查看器在左下角显示非常小的轴(我尝试使用 Adob​​e Acrobat Pro X 和 Adob​​e Reader 9):

在此处输入图片描述

真正让我烦恼的是,这些查看器轴实际上与我的模型轴不对应,这不仅使它们不好看,而且令人困惑。我如何从 Asymptote 源代码中禁用 PDF 中的这些轴?

编辑:根据这个Adobe 论坛主题,我应该scene.showOrientationAxes = false;在某些 Javascript 中使用。我该如何将其附加到我的 Asymptote 源代码中?




该图的 Asymptote 源代码如下:

import graph3; import solids;
settings.outformat="pdf";
size(200,0); currentprojection=orthographic(-0.1,1,0.2);
real pow2(real x) { return (x)*(x); }
real pow4(real x) { return pow2(x)*pow2(x); }
triple sph2cart (triple t)
{ return (t.x*sin(t.y)*cos(t.z),t.x*sin(t.y)*sin(t.z),t.x*cos(t.y)); }
triple f(pair t) {
  return sph2cart((1/(0. - 1.3005572680251514*pow2(cos(t.x))*pow2(cos(t.y))*pow2(sin(t.x)) + 0.13201243635761023*pow2(cos(t.x))*pow2(sin(t.x))*pow2(sin(t.y)) + 1.110738498635555*pow4(cos(t.x)) + 0.11721516517669359*pow2(cos(t.y))*pow2(sin(t.y))*pow4(sin(t.x)) + 0.40749453039149086*pow4(cos(t.y))*pow4(sin(t.x)) + 0.01640741258244529*pow4(sin(t.x))*pow4(sin(t.y))), t.x, t.y));
}

pen p=rgb(0.2,0.5,0.7);
surface s=surface(f,(0,0),(pi,2pi), 30, 30, Spline);
draw(s,lightred);

real max=94.7252;
xaxis3("$x$",-max,max,red,Arrow3);
yaxis3("$y$",-max,max,green,Arrow3);
zaxis3("$z$",-max,max,blue,Arrow3);

它应该用 来运行asy -tex pdflatex input.asy

答案1

更新:

从 Asymptote 2.17 开始,下面列出的解决方法已过时。现在,模型轴始终与查看器轴对齐,与输入中设置的投影角度无关asy


错位的原因是,asymptote 根据以下公式在 PRC 文件的 xyz 世界坐标系中转换 3D 对象:

currentprojection=orthographic(-0.1,1,0.2);

在 asy 源中设置。最好只将给定的向量应用于查看器中的初始相机位置。(应该有人告诉渐近线开发人员这一点。)

要使 3D 对象的轴与世界轴对齐,请执行以下操作:使用

currentprojection=orthographic(0,0,1);

在 asy 源文件中。并使用

asy -keep -tex pdflatex source.asy

然后,嵌入使用该包生成的 prc media9

\documentclass{article}

\usepackage{media9}

\includemedia[
  width=0.8\linewidth,height=0.8\linewidth,
  activate=pageopen,
  add3Djscript=asylabels.js,
  add3Djscript=3Dspintool.js,
  3Dmenu,
  3Dc2c=1 1 0.2, %object-to-camera vector
  %settings below found by right-click-->Generate Default View
  3Dcoo=-1.2360605001449585 -2.1437549591064453 -345.6598815917969,
  3Droo=377.89275461201964,
  3Dlights=Headlamp,
]{\includegraphics{source+0.pdf}}{source+0.prc}

\end{document}

本例中附加了两个 JavaScript。asylabels.js启用文本标签的“广告牌”行为。启用 3D 旋转工具,以便于移动 3D 对象。使用选项(即对象到相机的方向向量)3Dspintool.js设置初始相机位置。3Dc2c

答案2

好的,这可以通过 Javascript 访问scene.showOrientationAxes = false。我发现最快捷的方法是修补 Asymptote,让它在每次创建 3D 场景时执行此操作:

--- three.asy.orig  2012-04-08 19:28:50.000000000 +0200
+++ three.asy   2012-04-08 19:31:01.000000000 +0200
@@ -2558,6 +2558,8 @@ private string billboard(int[] index, tr
 {
   if(index.length == 0) return "";
   string s="
+scene.showOrientationAxes = false;
+
 var zero=new Vector3(0,0,0);
 var nodes=scene.nodes;
 var count=nodes.count;

当然,如果能通过 Asymptote 进行设置就更好了!

答案3

currentprojection=orthographic(camera=(1,0.5,0.2));

相关内容