tikz 和 3d,将正确的对象放在顶部

tikz 和 3d,将正确的对象放在顶部

当绘制 2d 对象时,很容易理解 tikz 的工作方式:简单地将最新的绘图放在顶部。此行为无法很好地转换为 3d,那么有没有一种好方法可以告诉 tikz 将哪个对象放在顶部?

这:

\documentclass{standalone}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}


\usepackage{tikz}

\begin{document}
\begin{tikzpicture}[darkstyle/.style={circle,draw,fill=gray!40,minimum size=20}]

        \filldraw[fill = red!20!white,fill opacity=0.6,draw = black] (0,2,0) -- ++(0,0,3) -- ++(3,0,0) -- ++ (0,0,-3) --++(-3,0,0) -- cycle;
        \filldraw[fill = red!10!white,fill opacity=0.6,draw = black] (0,2.1,0) -- ++(0,0,3) -- ++(3,0,0) -- ++ (0,0,-3) --++(-3,0,0) -- cycle;
        \foreach \x in {0,...,3}
        \foreach \y in {0,...,3}
        \foreach \z in {0,...,3}
        \filldraw[fill = white, draw = black] (\x,\y,\z) circle (5pt) ;


        \end{tikzpicture}
\end{document}

给出这个:

下面的飞机

但是这个:

\documentclass{standalone}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}


\usepackage{tikz}

\begin{document}
\begin{tikzpicture}[darkstyle/.style={circle,draw,fill=gray!40,minimum size=20}]
        \foreach \x in {0,...,3}
        \foreach \y in {0,...,3}
        \foreach \z in {0,...,3}
        \filldraw[fill = white, draw = black] (\x,\y,\z) circle (5pt) ;
        \filldraw[fill = red!20!white,fill opacity=0.6,draw = black] (0,2,0) -- ++(0,0,3) -- ++(3,0,0) -- ++ (0,0,-3) --++(-3,0,0) -- cycle;
        \filldraw[fill = red!10!white,fill opacity=0.6,draw = black] (0,2.1,0) -- ++(0,0,3) -- ++(3,0,0) -- ++ (0,0,-3) --++(-3,0,0) -- cycle;
        \end{tikzpicture}
\end{document}

给出这个:

飞机在顶部

有什么好办法可以分辨tikz哪些球应该画在平面上方,哪些球应该画在平面下方?或者更好的办法是,有没有办法知道tikz每个填充的哪一部分应该在平面下方,哪一部分应该在平面上方?这样,一个球的一半可以呈现红色,而另一半保持白色?

答案1

因此,根据 Henri Menke 的建议,我选择使用图层来Tikz实现这一点。但是,图层结构并不完美,我希望使用“基于坐标的图层”,这样绘制在上方的所有内容y=2都会比下方的内容处于更高的图层,这将把一个圆圈分成两个图层。我认为目前还不可能做到这一点。

我确实想出了以下解决方案:

\documentclass{standalone}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}


\usepackage{tikz}

\pgfdeclarelayer{bottom}
\pgfdeclarelayer{middleb}
\pgfdeclarelayer{middlet}
\pgfdeclarelayer{top}
\pgfsetlayers{bottom,middleb,main,middlet,top}

\begin{document}
\begin{tikzpicture}[darkstyle/.style={circle,draw,fill=gray!40,minimum size=20}]
        \begin{pgfonlayer}{bottom}
        \foreach \x in {0,...,3}
        \foreach \y in {1}
        \foreach \z in {0,...,3}
        \filldraw[fill = white, draw = black] (\x,\y,\z) circle (0.15) ;
        \end{pgfonlayer}

        \begin{pgfonlayer}{middleb}
                \filldraw[fill = red!20!white,fill opacity=0.8,draw = black!80!red] (0,1.9,0) -- ++(0,0,3) -- ++(3,0,0) -- ++ (0,0,-3) --++(-3,0,0) -- cycle;
        \end{pgfonlayer}

        \foreach \x in {0,...,3}
        \foreach \y in {2}
        \foreach \z in {0,...,3}
        \filldraw[fill = white, draw = black] (\x,\y,\z) circle (0.15) ;

        \begin{pgfonlayer}{middlet}
        \filldraw[fill = red!30!white,fill opacity=0.8,draw = black!80!green] (0,2.2,0) -- ++(0,0,3) -- ++(3,0,0) -- ++ (0,0,-3) --++(-3,0,0) -- cycle;
        \end{pgfonlayer}

        \begin{pgfonlayer}{top}
        \foreach \x in {0,...,3}
        \foreach \y in {3}
        \foreach \z in {0,...,3}
        \filldraw[fill = white, draw = black] (\x,\y,\z) circle (0.15) ;
        \end{pgfonlayer}

        \end{tikzpicture}
\end{document}

屈服

比以前好多了

遗憾的是,我仍然无法将圆切成两半。但现在我可以在每个平面上方和下方各放一层圆。由于使用了透明度,因此也很容易看到哪些圆位于单层或两层下方。

我将这些\foreach \y in {n}部分保留在那里,这样可以更容易地获得更多的层。

我也意识到我展示的结果不需要图层,因为我以它们本来显示的方式绘制图层。但现在我可以移动部分代码并获得相同的结果。

比这个更好的答案是在圆圈内设置层,或者其他东西,这样可以让一半的\draw命令位于某层之上,另一半位于某层之下。

再次感谢 Henri Menke 提出这个想法 ;-)

相关内容