This is not my code, I copied at [here](https://www.facebook.com/groups/toanvalatex/) I do not understand all code. I do not see the author uses `\tdplotmainphi` or `\tdplotmaintheta` to draw cylinder. Is this code true? ``` \documentclass[tikz,border=5mm]{standalone} %\usepackage{tikz} \usepackage{tikz-3dplot} \usepackage{ifthen} \usetikzlibrary{shadows,calc,fadings,shadings} \pagecolor{yellow!35} \begin{document} \foreach \m in{80,79,...,31,30,31,...,80}{ \ifthenelse{\m>30}{ \def\l{70} \begin{tikzpicture} \tdplotsetmaincoords{\m}{70} \pgfmathsetmacro{\k}{\l+180} \clip (-6,-5)rectangle(10,10); \begin{scope}[line join=bevel,tdplot_main_coords] \clip(0,0,0)circle(9cm); \draw[cyan](0,0,4)circle(4); \tikzset{cylinder/.pic={ \fill [samples=100,green, fill opacity = 3/5,domain=0:360]plot ({4*cos(\x)},{4*sin(\x)},0); \fill[orange](-4,0,0)--(0,4,0)--(4,0,0)--(4,0,0)--(0,-4,0); } } \path(0,0,0)pic{cylinder}; \fill[upper right=cyan, upper left =green,lower left = cyan,lower right =green,opacity=2/5]plot [samples=100,domain={180+\k}:{360+\k}]({4*cos(\x)},{4*sin(\x)},0)--plot [samples=100,domain={360+\k}:{\k+180}]({4*cos(\x)},{4*sin(\x)},4); \draw[red](0,-4,0)--(0,4,0); \draw[red](0,4,0)--(0,8,0); \draw[red](-4,0,0)--(4,0,0); \fill[violet,opacity=0.5](-4,0,0)--(0,4,0)--(0,4,4)--(-4,0,4)--cycle; \draw[blue,->](0,0,4)--(0,0,8); \fill[red,opacity=3/4](4,0,0)--(0,4,0)--(0,4,4)--(4,0,4)--cycle; \fill[green,opacity=3/4](4,0,0)--(0,-4,0)--(0,-4,4)--(4,0,4)--cycle; \fill[yellow,opacity=3/4](0,-4,0)--(0,-4,4)--(-4,0,4)--(-4,0,0)--cycle; \fill[blue,opacity=3/5]plot [samples=100,domain={\k}:{180+\k}]({4*cos(\x)},{4*sin(\x)},0)--plot [samples=100,domain={180+\k}:{\k}]({4*cos(\x)},{4*sin(\x)},4); \draw[green](0,0,0)--(0,0,4); \draw[green](-4,0,4)--(4,0,4); \draw[green](0,-4,4)--(0,4,4)(0,0,4)circle(2pt); \draw[red,->](4,0,0)--(8,0,0); \draw[red,->](0,4,0)--(0,8,0); \end{scope} \end{tikzpicture}} { \foreach \l in{70,71,...,149,150,149,...,70}{ \begin{tikzpicture} \tdplotsetmaincoords{30}{\l} \pgfmathsetmacro{\k}{\l+180} \clip (-6,-5)rectangle(10,10); \begin{scope}[line join=bevel,tdplot_main_coords] \draw[cyan](0,0,4)circle(4); \tikzset{cylinder/.pic={ \fill [samples=100,green, fill opacity = 3/5,domain=0:360]plot ({4*cos(\x)},{4*sin(\x)},0); \fill[orange](-4,0,0)--(0,4,0)--(4,0,0)--(4,0,0)--(0,-4,0); } } \path(0,0,0)pic{cylinder}; \fill[upper right=cyan, upper left =green,lower left = cyan,lower right =green,opacity=2/5]plot [samples=100,domain={180+\k}:{360+\k}]({4*cos(\x)},{4*sin(\x)},0)--plot [samples=100,domain={360+\k}:{\k+180}]({4*cos(\x)},{4*sin(\x)},4); \draw[red](0,-4,0)--(0,4,0); \draw[red](0,4,0)--(0,8,0); \draw[red](-4,0,0)--(4,0,0); \fill[violet,opacity=0.5](-4,0,0)--(0,4,0)--(0,4,4)--(-4,0,4)--cycle; \draw[blue,->](0,0,4)--(0,0,8); \fill[red,opacity=3/4](4,0,0)--(0,4,0)--(0,4,4)--(4,0,4)--cycle; \fill[green,opacity=3/4](4,0,0)--(0,-4,0)--(0,-4,4)--(4,0,4)--cycle; \fill[yellow,opacity=3/4](0,-4,0)--(0,-4,4)--(-4,0,4)--(-4,0,0)--cycle; \fill[blue,opacity=3/5]plot [samples=100,domain={\k}:{180+\k}]({4*cos(\x)},{4*sin(\x)},0)--plot [samples=100,domain={180+\k}:{\k}]({4*cos(\x)},{4*sin(\x)},4); \draw[green](0,0,0)--(0,0,4); \draw[green](-4,0,4)--(4,0,4); \draw[green](0,-4,4)--(0,4,4)(0,0,4)circle(2pt); \draw[red,->](4,0,0)--(8,0,0); \draw[red,->](0,4,0)--(0,8,0); \end{scope} \end{tikzpicture}} } } \end{document} ```
As mentioned in the comments, the code does use `\tdplotmainphi`. However, this is actually not necessary. This answer comes with a pic that draws a cyclinder with an arbitrary axis. It also can be rotated by using rotated coordinates. It does not use `\tdplotmainphi` or `\tdplotmaintheta`. It does not rely on the specific way you installed your 3d view. The same statement applies to the polyhedron. So in order to know whether or not a code is correct it is generally not suffcient to check whether it uses certain macros. ``` \documentclass[tikz,border=3mm]{standalone} \usepackage{tikz-3dplot} \usetikzlibrary{3dtools} \tikzset{pics/3d/cylinder/.style={code={ \tikzset{3d/cylinder/.cd,#1} \def\pv##1{\pgfkeysvalueof{/tikz/3d/cylinder/##1}}% \pgfmathsetmacro{\axisnorm}{TD("\pv{axis}o\pv{axis}")}% \ifdim\axisnorm pt<0.01pt\relax \typeout{Axis too short.}% \else \pgfmathsetmacro{\cylinderx}{TD("\pv{axis}x(nscreenx,nscreeny,nscreenz)")}% \pgfmathsetmacro{\normcylinderx}{TD("(\cylinderx)o(\cylinderx)")}% \ifdim\normcylinderx pt<0.005pt\relax % cylinder axis rather parallel to normal on screen \else \pgfmathsetmacro{\normcylinderx}{1/sqrt(\normcylinderx)}% \pgfmathsetmacro{\cylinderx}{TD("\normcylinderx*(\cylinderx)")}% \pgfmathsetmacro{\cylindery}{TD("\pv{axis}x(\cylinderx)")}% \pgfmathtruncatemacro{\itest}{screendepth(\cylindery)<0}% \ifnum\itest=1 \pgfmathsetmacro{\cylindery}{TD("-1*(\cylindery)")}% \fi \pgfmathsetmacro{\axisnorm}{1/sqrt(\axisnorm)} \pgfmathsetmacro{\cylinderz}{TD("\axisnorm*\pv{axis}")}% \path[overlay] (\cylinderx) coordinate (cylinderx) (\cylindery) coordinate (cylindery) (\cylinderz) coordinate (cylinderz); \begin{scope}[x={(cylinderx)},y={(cylindery)},z={(cylinderz)}] \begin{pgfonlayer}{\pgfkeysvalueof{/tikz/3d/cylinder/back layer}} \path[3d/cylinder/back] plot[variable=\t,domain=-180:0,smooth] ({\pv{r}*cos(\t)},{\pv{r}*sin(\t)},0) -- plot[variable=\t,domain=0:-180,smooth] ({\pv{r}*cos(\t)},{\pv{r}*sin(\t)},\pv{h}) -- cycle; \end{pgfonlayer} \begin{pgfonlayer}{\pgfkeysvalueof{/tikz/3d/cylinder/fore layer}} \path[3d/cylinder/fore] plot[variable=\t,domain=180:0,smooth] ({\pv{r}*cos(\t)},{\pv{r}*sin(\t)},0) -- plot[variable=\t,domain=0:180,smooth] ({\pv{r}*cos(\t)},{\pv{r}*sin(\t)},\pv{h}) -- cycle; \end{pgfonlayer} \end{scope} \fi \fi }}, 3d/cylinder/.cd,r/.initial=1,h/.initial=1, axis/.initial={(0,0,1)}, back/.style={fill=green!70!black}, fore/.style={fill=blue}, back layer/.initial={main}, fore layer/.initial={main} } \begin{document} \pgfdeclarelayer{background} \pgfdeclarelayer{foreground} \pgfdeclarelayer{behind} \pgfsetlayers{behind,background,main,foreground} \foreach \Angle in {0,2,...,40,38,36,...,2} {\tdplotsetmaincoords{70}{110} \begin{tikzpicture}[tdplot_main_coords, declare function={a=2;h=4;}] \path[tdplot_screen_coords,use as bounding box] (-7,-5) rectangle (7,9); \tdplotsetrotatedcoords{0}{\Angle}{0} \begin{scope}[tdplot_rotated_coords] \path[opacity=0.5] pic{3d/cylinder={r={a*sqrt(2)},h=h,axis={(0,0,1)}, fore layer=foreground,back layer=behind, back/.style={fill=green!70!black,opacity=0.6}, fore/.style={fill=blue,opacity=0.6}}}; \path (-a,-a,0) coordinate (A) (a,-a,0) coordinate (B) (a,a,0) coordinate (C) (-a,a,0) coordinate (D) (-a,-a,h) coordinate (A') (a,-a,h) coordinate (B') (a,a,h) coordinate (C') (-a,a,h) coordinate (D') (0,0,h/2) coordinate (I); \draw[-stealth] (-3,0,0) -- (6,0,0); \draw[-stealth] (0,-3,0) -- (0,6,0); \draw[-stealth] (0,0,-3) -- (0,0,6); \tikzset{3d/polyhedron/.cd,O={(I)}, fore/.style={opacity=0.6},fore layer=main, back/.style={opacity=0.6},back layer=background, draw face with corners={{(A)},{(B)},{(B')},{(A')}}, draw face with corners={{(B)},{(C)},{(C')},{(B')}}, draw face with corners={{(C)},{(D)},{(D')},{(C')}}, draw face with corners={{(D)},{(A)},{(A')},{(D')}}, }; \end{scope} \end{tikzpicture}} \end{document} ``` 