文本投影到 3D pgf 图的平面上

文本投影到 3D pgf 图的平面上

我希望文本看起来就像写在 3D tikz 图的其中一面墙上一样。MWE:

\documentclass{standalone}

\usepackage{tikz,pgfplots}
\usetikzlibrary{positioning,3d}
\pgfplotsset{compat=1.10}

\begin{document}

\begin{tikzpicture}
\begin{axis}[
    view={60}{30},
    %axis equal,
    clip=false,
    xmin=0,xmax=1,
    ymin=0,ymax=1,
    zmin=0,zmax=1,
    ]

    %\addplot3 (1,1,1);

    \path (axis cs:0,0,0) -- (axis cs:0,1,0) node[midway,above, sloped,xslant=0.2] {Text};

\end{axis}
\end{tikzpicture}

\end{document}

1型

在这种情况下,让我不满意的是我需要xslant手动设置。我可以根据几何图形计算它,但 pgfplots 角度似乎并不总是如您所期望的那样。示例:

\documentclass{standalone}

\usepackage{tikz,pgfplots}
\usetikzlibrary{positioning,3d}
\pgfplotsset{compat=1.10}

\begin{document}

\begin{tikzpicture}
\begin{axis}[
    view={45}{90},
    %axis equal,
    clip=false,
    xmin=0,xmax=1,
    ymin=0,ymax=1,
    zmin=0,zmax=1,
    ]

    %\addplot3 (1,1,1);

    \path (axis cs:0,0,0) -- (axis cs:0,1,0) node[midway,above, sloped,xslant=0.2] {Text};

\end{axis}
\end{tikzpicture}

\end{document}

微波辐射计

[这与上一个示例完全相同,只是我改变了视图]。这给出了从正上方看到的图,显示 x 轴和 y 轴不垂直。我认为这可以用axis equal或来改变axis equal image,但我宁愿不使用它们,因为它们有副作用。

我假设 pgfplots 已经在内部计算了 x、y 和 z 方向向量如何映射到二维页面……有没有办法提取这些信息?如果我有这个,那么使用三角函数很容易找到合适的斜率。这在没有axis equal或的情况下也可以工作axis equal image

答案1

我不确定您想要的是平面字母还是垂直字母,所以我两者都选了。请注意 [scale mode=scale uniformly] 的使用。还请注意,yscale 是 xslant 的分母,xscale 是 yslant 的分母。

3D 文本

\documentclass{standalone}

\usepackage{tikz,pgfplots}
\usetikzlibrary{positioning,3d}
\pgfplotsset{compat=1.10}

\begin{document}

\begin{tikzpicture}
\def\h{80}% horizontaql viewing angle
\def\v{10}% vertical viewing angle
\begin{axis}[
    scale mode=scale uniformly,
    view={\h}{\v},
    clip=false,
    xmin=0,xmax=1,
    ymin=0,ymax=1,
    zmin=0,zmax=1,
   ]
  \pgfmathparse{atan(tan(\h)*sin(\v))}
  \let\a=\pgfmathresult
  \pgfmathparse{atan(tan(90-\h)*sin(\v))}
  \let\b=\pgfmathresult  

    \path (axis cs:0,0,0) -- (axis cs:0,1,0) node[color=blue,midway,above,sloped,
    xslant=tan(\a+\b+90),yscale=sin(\a+\b)] {Text};

    \path (axis cs:0,0,0) -- (axis cs:0,1,0) node[color=red,midway,above,
    yslant=tan(\b),xscale=cos(\b)] {Text};

\end{axis}
\end{tikzpicture}
\end{document}

算一算

答案2

您应该切换到PST-solides3d,它可以产生令人满意的文本和图形投影。请参阅以下示例文档在此处输入图片描述

在此处输入图片描述

答案3

基于 John 的解决方案,这里有一个 MWE,它使用选项cm明确设置每个节点的转换矩阵:

\documentclass{standalone}

\usepackage{tikz,pgfplots}
\pgfplotsset{compat=1.10}

\begin{document}

\begin{tikzpicture}

\newcommand{\viewa}{30}
\newcommand{\viewb}{30}

\begin{axis}[scale mode=scale uniformly,% needed for text
    view={\viewa}{\viewb},
    clip=false,
    xmin=0,xmax=1,
    ymin=0,ymax=1,
    zmin=0,zmax=1,
    ]           

    \node[color=red,
        cm={sin(\viewa),cos(\viewa)*sin(\viewb),
        0,cos(\viewb),
        (0,0)}
            ]   
     at (axis cs:0,0.5,0.5) {$x$ plane};                                

    \node[color=blue,
        cm={cos(\viewa),-sin(\viewa)*sin(\viewb),
        sin(\viewa),cos(\viewa)*sin(\viewb),
        (0,0)}
            ]   
     at (axis cs:0.5,0.5,0) {$z$ plane};     

    \node[color=black,
        cm={cos(\viewa),-sin(\viewa)*sin(\viewb),
        0,cos(\viewb),
        (0,0)}
            ]   
     at (axis cs:0.5,1,0.5) {$y$ plane};     

\end{axis}
\end{tikzpicture}

\end{document}

在此处输入图片描述

一般来说,要使节点看起来好像悬挂在方向向量 u = (u_x,u_y,u_z) 和 v = (v_z,v_y,v_z) 的平面上

  • 定义 a = u_x * cos(a) + u_y * sin(a),其中 a 和 b 是上面 LaTeX 代码中定义的视角
  • 定义 b = - u_x * sin(a)sin(b) + u_y * cos(a)sin(b) + u_z * cos(b)
  • 定义 c = v_x * cos(a) + v_y * sin(a)
  • 定义 d = - v_x * sin(a)sin(b) + v_y * cos(a)sin(b) + v_z * cos(b)
  • 放置带有选项的节点cm={a,b,c,d,(0,0)},其中 ad 代表上述表达式。

在 MWE 中,我使用了

  • 蓝色文字:u = (1,0,0),v = (0,1,0)
  • 红色文字:u = (0,1,0),v = (0,0,1)
  • 黑色文字:u = (1,0,0),v = (0,0,1)

相关内容