TikZ 中的立方体绘制不正确 - 可能是 TikZ 中的一个错误?

TikZ 中的立方体绘制不正确 - 可能是 TikZ 中的一个错误?

我在三维空间中有一个简单立方体,4 个面用红色画,顶部和底部用绿色画。

 \documentclass[border=5,tikz]{standalone}

 \usepackage{tikz-3dplot}

 \begin{document}
 \foreach\s in{2,4,...,360}{
     \tdplotsetmaincoords{2.71828+\s}{2.71828+\s*2}
     \tikz[tdplot_main_coords,scale=.1]{
         \path(-15cm,-15cm)(15cm,15cm);
         \draw[ultra thick, color=black, fill=green!80!black]
             (0,0,0)--(20,0,0)--(20,20,0)--(0,20,0)--cycle        % bottom
             (0,0,20)--(20,0,20)--(20,20,20)--(0,20,20)--cycle;   % top
         \draw[ultra thick, color=black, fill=red!80!black]
             (0,0,0)--(20,0,0)--(20,0,20)--(0,0,20)--cycle
             (0,20,0)--(20,20,0)--(20,20,20)--(0,20,20)--cycle
             (0,0,0)--(0,20,0)--(0,20,20)--(0,0,20)--cycle
             (20,0,0)--(20,20,0)--(20,20,20)--(20,0,20)--cycle;
     }
 }

 \end{document}

在 TikZ 中从某些角度看时,会呈现出意想不到的投影。似乎当某些面相互叠在一起时——它们会变得透明!

在此处输入图片描述

这是一个错误,还是立方体的构建方式有问题?

答案1

由于每个矩形都是独立填充的,因此没有一个矩形被视为孔洞。对于实体,需要从远到近绘制面,或者指定一个法向量并仅绘制指向此方向的面。

这里有数学

\documentclass[border=5,tikz]{standalone}

% Uses \nearx, \neary and \nearz
% #1=x, #2=y, #3=z, #4={code to be executed}
\def\ifnear(#1,#2,#3)#4 
  {\pgfmathparse{#1*\nearx+#2*\neary+#3*\nearz}%
  \ifdim\pgfmathresult pt>0pt\relax #4\fi}

 \usepackage{tikz-3dplot}

 \begin{document}
 \foreach\s in{2,4,...,360}{
   \pgfmathsetmacro{\aTheta}{2.71828+\s}
   \pgfmathsetmacro{\aPhi}{2.71828+\s*2}
   \pgfmathsetmacro{\nearx}{sin(\aPhi)*sin(\aTheta)}
   \pgfmathsetmacro{\neary}{-cos(\aPhi)*sin(\aTheta)}
   \pgfmathsetmacro{\nearz}{cos(\aTheta)}
   \begin{tikzpicture}[scale=.1]
     \path(-15cm,-15cm)(15cm,15cm);
     \tdplotsetmaincoords{\aTheta}{\aPhi}
     \begin{scope}[tdplot_main_coords]
       \ifnear(0,0,-1){\draw[fill=green!80!black]
             (0,0,0)--(20,0,0)--(20,20,0)--(0,20,0)--cycle;}       % bottom
       \ifnear(0,0,1){\draw[fill=green!80!black]
             (0,0,20)--(20,0,20)--(20,20,20)--(0,20,20)--cycle;}   % top
       \ifnear(0,-1,0){\draw[fill=red!80!black]
             (0,0,0)--(20,0,0)--(20,0,20)--(0,0,20)--cycle;}
       \ifnear(0,1,0){\draw[fill=red!80!black]
             (0,20,0)--(20,20,0)--(20,20,20)--(0,20,20)--cycle;}
       \ifnear(-1,0,0){\draw[fill=red!80!black]
             (0,0,0)--(0,20,0)--(0,20,20)--(0,0,20)--cycle;}
       \ifnear(1,0,0){\draw[fill=red!80!black]
             (20,0,0)--(20,20,0)--(20,20,20)--(20,0,20)--cycle;}
     \end{scope}
   \end{tikzpicture}
 }

 \end{document}

如果您反转上的符号\nearx\neary它将\nearz显示立方体的另一侧。

法向量是一条垂直于面的线,并且(就我们的目的而言)指向远离中心的方向。对于正多面体,可以使用从物体中心到面中心的向量。

立方体的中心位于 (10,10,10)。由于底面的中心位于 (10,10,0),因此该面的 (标准化) 法向量为 (0,0,-1)。

相关内容