我有一个渐近线我导出到 3D PDF 文件(包含 PRC)的 3D 曲面图(代码如下)。我包括带有 LaTeX 标签的漂亮轴,但除此之外,查看器在左下角显示非常小的轴(我尝试使用 Adobe Acrobat Pro X 和 Adobe 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));