TikZ의 큐브가 올바르게 그려지지 않았습니다. TikZ의 버그일까요?

TikZ의 큐브가 올바르게 그려지지 않았습니다. TikZ의 버그일까요?

나는 3공간에 빨간색으로 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)입니다.

관련 정보