Drawing spherical mirrors

What is the best way to draw 3D spherical mirrors like these on tikz?

• For things like that I just make a sketch in GeoGebra and export as TeX. – Rodrigo Apr 19 '19 at 17:06

This may be a starting point.

\documentclass[tikz,border=3.14mm]{standalone}
\usepackage{tikz-3dplot}
\usetikzlibrary{intersections}
\begin{document}
\tdplotsetmaincoords{90}{-30}
\begin{tikzpicture}[tdplot_main_coords,bullet/.style={circle,fill,inner sep=1pt}]
% parameters
\pgfmathsetmacro{\Angle}{120}
% left
\begin{scope}[shift={(-4,0,0)},local bounding box=L]
\draw[top color=gray!20,bottom color=gray!30,middle color=white]
--cycle ;
\foreach \X in {90,140}
{\draw plot[variable=\x,domain=90:-90,smooth]
\draw plot[variable=\x,domain=0:60,smooth]
node[bullet] (P1){};
node[bullet] (P0){};
\end{scope}
% left
\begin{scope}[shift={(4,0,0)},local bounding box=R]
\foreach \X in {90,140}
{\draw[dashed] plot[variable=\x,domain=90:-90,smooth]
\draw[dashed] plot[variable=\x,domain=90:270,smooth]
\draw[top color=gray!20,bottom color=gray!30,middle color=white]
--cycle ;
\path[name path=left boundary]  plot[variable=\x,domain=90:-90,smooth]
node[bullet,label=above:$P_2$] (P2){}
\path[name path=ray 1] (P1) -- (P2) coordinate[pos=0.5] (A);
\path[name path=ray 2] (P2) -- (P0);
\path[name path=ray 3] (P0) -- (P3);
\path[name path=ray 4] (P3) -- (P1);
\path[name intersections={of=left boundary and ray 1,by=i1},
name intersections={of=left boundary and ray 2,by=i2},
name intersections={of=left boundary and ray 3,by=i3},
name intersections={of=left boundary and ray 4,by=i4}];
\draw[thick,-stealth] (i2) -- (P0) -- (i3) (P1) -- (i1) (P1) -- (A);
\draw[thick,-stealth,shorten >=1.5cm] (i4) -- (P1);
\draw[dashed] (i1) -- (P2) -- (i2) (i3) -- (P3) -- (i4);
\end{scope}
\draw[stealth-stealth] (l) -- (r) node[midway,fill=white]{$r+\varepsilon$};
\end{tikzpicture}
\end{document}


Or with a more realistic (?) curvature of the mirrors.

\documentclass[tikz,border=3.14mm]{standalone}
\usepackage{tikz-3dplot}
\usetikzlibrary{intersections}
\begin{document}
\tdplotsetmaincoords{90}{-30}
\begin{tikzpicture}[tdplot_main_coords,bullet/.style={circle,fill,inner sep=1pt}]
% parameters
\pgfmathsetmacro{\Angle}{120}
% left
\begin{scope}[shift={(-4,0,0)},local bounding box=L]
\draw[top color=gray!20,bottom color=gray!30,middle color=white]
--cycle ;
\foreach \X in {90,140}
{\draw plot[variable=\x,domain=90:-90,smooth]
\draw plot[variable=\x,domain=0:60,smooth]
node[bullet] (P1){};
node[bullet] (P0){};
\end{scope}
% left
\begin{scope}[shift={(4,0,0)},local bounding box=R]
\foreach \X in {90,140}
{\draw[dashed] plot[variable=\x,domain=30:-30,smooth]
\draw[dashed] plot[variable=\x,domain=90:270,smooth]
\draw[top color=gray!20,bottom color=gray!30,middle color=white]
--cycle ;
\path[name path=left boundary]  plot[variable=\x,domain=90:-90,smooth]
node[bullet,label=above:$P_2$] (P2){}
\path[name path=ray 1] (P1) -- (P2) coordinate[pos=0.5] (A);
\path[name path=ray 2] (P2) -- (P0);
\path[name path=ray 3] (P0) -- (P3);
\path[name path=ray 4] (P3) -- (P1);
\path[name intersections={of=left boundary and ray 1,by=i1},
name intersections={of=left boundary and ray 2,by=i2},
name intersections={of=left boundary and ray 3,by=i3},
name intersections={of=left boundary and ray 4,by=i4}];
\draw[thick,-stealth] (i2) -- (P0) -- (i3) (P1) -- (i1) (P1) -- (A);
\draw[thick,-stealth,shorten >=1.5cm] (i4) -- (P1);
\draw[dashed] (i1) -- (P2) -- (i2) (i3) -- (P3) -- (i4);
\draw[stealth-stealth] (l) -- (r) node[midway,fill=white]{$r+\varepsilon$};