
나는 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)입니다.