如何使用 Latex 创建交互式 3D 图形

如何使用 Latex 创建交互式 3D 图形

大约两年前,我在这个论坛上看到了一个交互式 3D 图表,可能是用 latex 制作的,可能使用了 pgfplots。基本上,用户可以使用鼠标拖动(或滑动)pdf 图表来更改查看图表的角度。基于原始代码,我创建了两个静态图表,如下所示(请忽略添加的黑线)。不知何故,我丢失了当前项目所需的交互式 3D 图表的原始代码。我整个下午和晚上都在网上搜索,但仍然找不到它(可能是原作者删除了它),所以有人可以给我指明正确的方向或提供一个类似的例子,让我有个开始。顺便说一句,我想创建一个交互式 pdf,这样我就可以拖动以从不同角度查看第三张图片中形状的不同视图。谢谢。

这些是我用来创建这两个图表的代码。

\documentclass[tikz]{standalone}

\usepackage{tikz}
\usepackage{pgfplots}

\pgfplotsset{compat=1.15}

\begin{document}

% 3D
\pgfplotsset{%
 colormap={myblack}{rgb255(0cm)=(0,0,0); rgb255(1cm)=(0,0,0)},
}

\pgfplotsdefinecstransform{polarrad along x}{cart}{%
% First, swap axis such that we can apply polarrad->cart.
% Note that polarrad expects (<angle>,<radius>,Z):
\pgfkeysgetvalue{/data point/x}\X
\pgfkeysgetvalue{/data point/y}\Y
\pgfkeyslet{/data point/y}\X
\pgfkeyslet{/data point/x}\Y
\pgfplotsaxistransformcs
    {polarrad}
    {cart}%
%
% Ok, now we have cartesian. Swap axes such that we have them
% along X:
\pgfkeysgetvalue{/data point/x}\X
\pgfkeysgetvalue{/data point/y}\Y
\pgfkeysgetvalue{/data point/z}\Z
\pgfkeyslet{/data point/y}\X
\pgfkeyslet{/data point/z}\Y
\pgfkeyslet{/data point/x}\Z
}%


\begin{tikzpicture}
% This creates a color gradient for the filled area of the two functions
\pgfdeclareverticalshading{brighter}{100bp}{
    rgb(0bp)=(0.1,0.55,0);
    rgb(100bp)=(0.8,0.9,0)
}
%
\pgfdeclareverticalshading{darker}{100bp}{
    rgb(0bp)=(0.5,0.75,0);
    rgb(100bp)=(0,0.5,0)
}
%
\begin{axis}[axis lines=middle,
    title={},
    view={30}{30},
   colormap name=myblack]

    \def\generatrix{(x^0.5)}

    \addplot3[colormap/greenyellow,
        surf,
        shader=faceted interp,
        samples=30,
        domain=0:3,
        domain y=0:-2*pi,
        z buffer=sort,
        data cs=polarrad along x]
    ({\generatrix},y,x);

    \addplot3[
        surf,
        samples=30,
        domain=1.5:1.6,
        domain y=0:-2*pi,
       z buffer=sort,
        data cs=polarrad along x]
    ({\generatrix},y,x);

\end{axis}
\end{tikzpicture}

\begin{tikzpicture}
% This creates a color gradient for the filled area of the two functions
\pgfdeclareverticalshading{brighter}{100bp}{
    rgb(0bp)=(0.1,0.55,0);
    rgb(100bp)=(0.8,0.9,0)
}
%
\pgfdeclareverticalshading{darker}{100bp}{
    rgb(0bp)=(0.5,0.75,0);
    rgb(100bp)=(0,0.5,0)
}
%
\begin{axis}[axis lines=middle,
    title={},
    view={90}{0},
   colormap name=myblack]

    \def\generatrix{(x^0.5)}

    \addplot3[colormap/greenyellow,
        surf,
        shader=faceted interp,
        samples=30,
        domain=0:3,
        domain y=0:-2*pi,
        z buffer=sort,
        data cs=polarrad along x]
    ({\generatrix},y,x);

    \addplot3[
        surf,
        samples=30,
        domain=1.5:1.6,
        domain y=0:-2*pi,
       z buffer=sort,
        data cs=polarrad along x]
    ({\generatrix},y,x);

\end{axis}
\end{tikzpicture}

\end{document}

侧面图 顶视图 有可能的使用

答案1

开源渐近线媒体9包很好地结合起来,实现了这一点。从 asymptote 文件开始查尔斯·斯塔茨

// code from https://tex.stackexchange.com/a/228963/121799

import graph3;

size(400,400,IgnoreAspect);
currentprojection=orthographic(4,4.1,2);
defaultrender.merge=true;

defaultpen(0.5mm);

//Draw the surface z^2 - x^2 - y^2=1 
triple f(pair t) {
  return (cos(t.y)*tan(t.x), sin(t.y)*tan(t.x),1/cos(t.x));
}

surface s=surface(f,(-1,0),(1,2*pi),32,16,
          usplinetype=new splinetype[] {notaknot,notaknot,monotonic},
          vsplinetype=Spline);

pen p=rgb(0,0,.7); 
draw(s,rgb(.6,.6,1)+opacity(.7),meshpen=p);

我们可以用这个命令把它编译成一个 prc 文件:
asy -prc -outformat prc asyfile.asy
然后我们可以使用 tex 源

\documentclass{article}
\usepackage{media9}
\begin{document}

\includemedia[
  width=0.8\linewidth,height=0.8\linewidth,
  add3Djscript=asylabels.js,  %upright text labels
  add3Djscript=3Dspintool.js, %let scene rotate about z-axis
  3Dmenu,
  3Dc2c=.37 -.72 -.58, % magic numbers
  3Dcoo=109 -199 188, % magic numbers
  3Droo=499, % magic number
]{alternate output}{asyfile.prc}

\end{document}

然后使用支持 prc 格式的 pdf 查看器(据我所知,只有 Adob​​e 的),您可以通过单击“替代输出”(信任文档并再次单击)与生成的 pdf 进行交互。您要做的第一件事之一就是找到神奇的数字。摆弄交互式图像,直到它看起来正确,然后右键单击图像并选择“获取当前视图”。这将打开 javascript 控制台,其中包含数字供您复制和粘贴。

您可能还想做的另一件事是获得比“替代输出”更好的东西。最有可能的是,您希望将\includegraphics同一幅图像用作静态 pdf,可以使用
asy -noprc -outformat pdf asyfile.asy
另一种可能性创建,即将同一幅图像用作静态 png,它来自
asy -noprc -outformat png -render 4 asyfile.asy

完成所有这些操作后,您需要随身携带一份渐近线文档或教程。文档可在渐近线网站上找到;Marmot 找到了Charles Staats 的精彩教程也一样。

相关内容