
Eu tenho um cubo simples em 3 espaços, 4 faces desenhadas em vermelho e parte superior e inferior em 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 quando vistos de certos ângulos no TikZ, mostram uma projeção inesperada. Parece que quando certos rostos se sobrepõem, eles se tornam transparentes!
Isso é um bug ou há algo errado com a forma como o cubo é construído?
Responder1
Como cada retângulo é preenchido de forma independente, nenhum deles é tratado como furo. Para um sólido, é necessário desenhar as faces de longe para perto, ou atribuir um vetor normal e desenhar apenas faces apontando nesta direção.
\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}
Se você inverter os sinais \nearx
, \neary
ele \nearz
mostrará o outro lado do cubo.
O vetor normal é uma linha perpendicular à face e (para nossos propósitos) apontando para fora do centro. Para poliedros regulares pode-se usar o vetor do centro do objeto ao centro da face.
O centro do cubo está em (10,10,10). Como o centro da face inferior estava em (10,10,0), o vetor normal (normalizado) para essa face era (0,0,-1).