El cubo en TikZ no se dibujó correctamente: ¿posiblemente sea un error en TikZ?

El cubo en TikZ no se dibujó correctamente: ¿posiblemente sea un error en TikZ?

Tengo un cubo simple en 3 espacios, 4 caras dibujadas en rojo y la parte superior e inferior en verde.

 \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}

que vistos desde ciertos ángulos en TikZ, muestran una proyección inesperada. Parece que cuando ciertas caras se superponen, ¡se vuelven transparentes!

ingrese la descripción de la imagen aquí

¿Es esto un error o hay algún problema con la forma en que se construye el cubo?

Respuesta1

Como cada rectángulo se rellena de forma independiente, ninguno se trata como un agujero. Para un sólido, es necesario dibujar las caras de lejos a cerca, o asignar un vector normal y dibujar solo las caras que apunten en esta dirección.

matemáticas aquí

\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}

Si inviertes los signos en \nearx, \nearyse \nearzmostrará el otro lado del cubo.

El vector normal es una línea perpendicular a la cara y (para nuestros propósitos) que apunta en dirección opuesta al centro. Para poliedros regulares se puede utilizar el vector desde el centro del objeto hasta el centro de la cara.

El centro del cubo está en (10,10,10). Dado que el centro de la cara inferior estaba en (10,10,0), el vector normal (normalizado) para esa cara era (0,0,-1).

información relacionada