The theory behind this is actually not very difficult. One way (out of two ways) to make the spheres maximally packed is to put them on the root lattice of A_3=SU(4). The simple roots of A_3 can be chosen to be
\alpha_1=(1,0,0)
\alpha_2=(-1/2,1/\sqrt{2},-1/2)
\alpha_3=(0,0,1)
A lattice point has then the coordinates \sum_i n_i\alpha_i where the n_i\in\mathbbm{Z}. UPDATE: I gave up trying to do that by TeX only and asked Mathematica to compute the projections of the center coordinates of the spheres on the normal of the visible plane. Objects that should be hidden have a more negative projection than objects that could cover them. This yields a lengthy "master list" that can be used to draw the spheres in the right (?) order. In principle, this could be done with pgfplotstable also, but it would be considerably more effort for pgfplotstable dummies like me. The downside of the current answer is that the list has to be recreated for each new set of view angles.
\documentclass[tikz,border=3.14mm]{standalone}
\usepackage{tikz-3dplot}
\usetikzlibrary{3d}
\tikzset{declare function={posx(\x,\y,\z)=\x-\y/2;
posy(\x,\y,\z)=\y/sqrt(2);
posz(\x,\y,\z)=-\y/2+\z;
}}
\newsavebox\Proton
\newsavebox\Neutron
\sbox\Proton{\tikz{\shade[ball color=red] circle({1/sqrt(2)});}}
\sbox\Neutron{\tikz{\shade[ball color=blue] circle({1/sqrt(2)});}}
\begin{document}
% this list has been generated by Mathematica for the present projection
\xdef\MasterList{{{0, 0, 0}}, {{0, 0, 1},
{-1, -1, 0}, {0, -1, 0},
{0, 1, 1}, {-1, 0, 0}, {1, 1, 1},
{0, 0, 0}, {-1, -1, -1},
{1, 0, 0}, {0, -1, -1},
{0, 1, 0}, {1, 1, 0},
{0, 0, -1}}, {{-1, 0, 1},
{0, 0, 1}, {-1, -1, 0},
{1, 0, 1}, {0, -1, 0},
{-1, -2, -1}, {0, 1, 1},
{-1, 0, 0}, {1, 1, 1}, {0, 0, 0},
{-1, -1, -1}, {1, 0, 0},
{0, -1, -1}, {1, 2, 1},
{0, 1, 0}, {-1, 0, -1},
{1, 1, 0}, {0, 0, -1},
{1, 0, -1}}, {{-1, -1, 1},
{0, -1, 1}, {-1, -2, 0},
{0, 1, 2}, {-1, 0, 1},
{-2, -1, 0}, {1, 1, 2},
{0, 0, 1}, {-1, -1, 0},
{-2, -2, -1}, {-1, 1, 1},
{1, 0, 1}, {0, -1, 0},
{-1, -2, -1}, {1, 2, 2},
{0, 1, 1}, {-1, 0, 0},
{-2, -1, -1}, {1, -1, 0},
{0, -2, -1}, {1, 1, 1},
{0, 0, 0}, {-1, -1, -1},
{0, 2, 1}, {-1, 1, 0}, {2, 1, 1},
{1, 0, 0}, {0, -1, -1},
{-1, -2, -2}, {1, 2, 1},
{0, 1, 0}, {-1, 0, -1},
{1, -1, -1}, {2, 2, 1},
{1, 1, 0}, {0, 0, -1},
{-1, -1, -2}, {2, 1, 0},
{1, 0, -1}, {0, -1, -2},
{1, 2, 0}, {0, 1, -1},
{1, 1, -1}}, {{0, 0, 2},
{-1, -1, 1}, {-2, -2, 0},
{0, -1, 1}, {-1, -2, 0},
{0, 1, 2}, {-1, 0, 1},
{-2, -1, 0}, {0, -2, 0},
{1, 1, 2}, {0, 0, 1},
{-1, -1, 0}, {-2, -2, -1},
{0, 2, 2}, {-1, 1, 1},
{-2, 0, 0}, {1, 0, 1},
{0, -1, 0}, {-1, -2, -1},
{1, 2, 2}, {0, 1, 1}, {-1, 0, 0},
{-2, -1, -1}, {1, -1, 0},
{0, -2, -1}, {2, 2, 2},
{1, 1, 1}, {0, 0, 0},
{-1, -1, -1}, {-2, -2, -2},
{0, 2, 1}, {-1, 1, 0}, {2, 1, 1},
{1, 0, 0}, {0, -1, -1},
{-1, -2, -2}, {1, 2, 1},
{0, 1, 0}, {-1, 0, -1},
{2, 0, 0}, {1, -1, -1},
{0, -2, -2}, {2, 2, 1},
{1, 1, 0}, {0, 0, -1},
{-1, -1, -2}, {0, 2, 0},
{2, 1, 0}, {1, 0, -1},
{0, -1, -2}, {1, 2, 0},
{0, 1, -1}, {2, 2, 0},
{1, 1, -1}, {0, 0, -2}},
{{-1, 0, 2}, {-2, -1, 1},
{0, 0, 2}, {-1, -1, 1},
{-2, -2, 0}, {-1, 1, 2},
{-2, 0, 1}, {1, 0, 2},
{0, -1, 1}, {-1, -2, 0},
{-2, -3, -1}, {0, 1, 2},
{-1, 0, 1}, {-2, -1, 0},
{1, -1, 1}, {0, -2, 0},
{-1, -3, -1}, {1, 1, 2},
{0, 0, 1}, {-1, -1, 0},
{-2, -2, -1}, {0, 2, 2},
{-1, 1, 1}, {2, 1, 2},
{-2, 0, 0}, {1, 0, 1},
{0, -1, 0}, {-1, -2, -1},
{-2, -3, -2}, {1, 2, 2},
{0, 1, 1}, {-1, 0, 0}, {2, 0, 1},
{-2, -1, -1}, {1, -1, 0},
{0, -2, -1}, {-1, -3, -2},
{2, 2, 2}, {1, 1, 1}, {0, 0, 0},
{-1, -1, -1}, {-2, -2, -2},
{1, 3, 2}, {0, 2, 1}, {-1, 1, 0},
{2, 1, 1}, {-2, 0, -1},
{1, 0, 0}, {0, -1, -1},
{-1, -2, -2}, {2, 3, 2},
{1, 2, 1}, {0, 1, 0},
{-1, 0, -1}, {2, 0, 0},
{-2, -1, -2}, {1, -1, -1},
{0, -2, -2}, {2, 2, 1},
{1, 1, 0}, {0, 0, -1},
{-1, -1, -2}, {1, 3, 1},
{0, 2, 0}, {-1, 1, -1},
{2, 1, 0}, {1, 0, -1},
{0, -1, -2}, {2, 3, 1},
{1, 2, 0}, {0, 1, -1},
{-1, 0, -2}, {2, 0, -1},
{1, -1, -2}, {2, 2, 0},
{1, 1, -1}, {0, 0, -2},
{2, 1, -1}, {1, 0, -2}},
{{-1, 0, 2}, {-2, -1, 1},
{0, 0, 2}, {-1, -1, 1},
{-2, -2, 0}, {-1, 1, 2},
{-2, 0, 1}, {1, 0, 2},
{0, -1, 1}, {-1, -2, 0},
{-2, -3, -1}, {0, 1, 2},
{-1, 0, 1}, {-2, -1, 0},
{1, -1, 1}, {0, -2, 0},
{-1, -3, -1}, {1, 1, 2},
{0, 0, 1}, {-1, -1, 0},
{-2, -2, -1}, {0, 2, 2},
{-1, 1, 1}, {2, 1, 2},
{-2, 0, 0}, {1, 0, 1},
{0, -1, 0}, {-1, -2, -1},
{-2, -3, -2}, {1, 2, 2},
{0, 1, 1}, {-1, 0, 0}, {2, 0, 1},
{-2, -1, -1}, {1, -1, 0},
{0, -2, -1}, {-1, -3, -2},
{2, 2, 2}, {1, 1, 1}, {0, 0, 0},
{-1, -1, -1}, {-2, -2, -2},
{1, 3, 2}, {0, 2, 1}, {-1, 1, 0},
{2, 1, 1}, {-2, 0, -1},
{1, 0, 0}, {0, -1, -1},
{-1, -2, -2}, {2, 3, 2},
{1, 2, 1}, {0, 1, 0},
{-1, 0, -1}, {2, 0, 0},
{-2, -1, -2}, {1, -1, -1},
{0, -2, -2}, {2, 2, 1},
{1, 1, 0}, {0, 0, -1},
{-1, -1, -2}, {1, 3, 1},
{0, 2, 0}, {-1, 1, -1},
{2, 1, 0}, {1, 0, -1},
{0, -1, -2}, {2, 3, 1},
{1, 2, 0}, {0, 1, -1},
{-1, 0, -2}, {2, 0, -1},
{1, -1, -2}, {2, 2, 0},
{1, 1, -1}, {0, 0, -2},
{2, 1, -1}, {1, 0, -2}},
{{-1, -2, 1}, {-1, 0, 2},
{-2, -1, 1}, {0, 0, 2},
{-1, -1, 1}, {-2, -2, 0},
{-1, 1, 2}, {-2, 0, 1},
{1, 0, 2}, {0, -1, 1},
{-1, -2, 0}, {-2, -3, -1},
{1, 2, 3}, {0, 1, 2}, {-1, 0, 1},
{-2, -1, 0}, {1, -1, 1},
{-3, -2, -1}, {0, -2, 0},
{-1, -3, -1}, {1, 1, 2},
{0, 0, 1}, {-1, -1, 0},
{-2, -2, -1}, {0, 2, 2},
{-1, 1, 1}, {2, 1, 2},
{-2, 0, 0}, {1, 0, 1},
{0, -1, 0}, {-1, -2, -1},
{-2, -3, -2}, {1, 2, 2},
{0, 1, 1}, {-1, 0, 0}, {2, 0, 1},
{-2, -1, -1}, {1, -1, 0},
{0, -2, -1}, {-1, -3, -2},
{-1, 2, 1}, {2, 2, 2}, {1, 1, 1},
{0, 0, 0}, {-1, -1, -1},
{-2, -2, -2}, {1, -2, -1},
{1, 3, 2}, {0, 2, 1}, {-1, 1, 0},
{2, 1, 1}, {-2, 0, -1},
{1, 0, 0}, {0, -1, -1},
{-1, -2, -2}, {2, 3, 2},
{1, 2, 1}, {0, 1, 0},
{-1, 0, -1}, {2, 0, 0},
{-2, -1, -2}, {1, -1, -1},
{0, -2, -2}, {2, 2, 1},
{1, 1, 0}, {0, 0, -1},
{-1, -1, -2}, {1, 3, 1},
{0, 2, 0}, {3, 2, 1},
{-1, 1, -1}, {2, 1, 0},
{1, 0, -1}, {0, -1, -2},
{-1, -2, -3}, {2, 3, 1},
{1, 2, 0}, {0, 1, -1},
{-1, 0, -2}, {2, 0, -1},
{1, -1, -2}, {2, 2, 0},
{1, 1, -1}, {0, 0, -2},
{2, 1, -1}, {1, 0, -2},
{1, 2, -1}}}
\xdef\LstCol{"red","blue"}
\tdplotsetmaincoords{-90+109.471}{-90+70}
\foreach \Lst in \MasterList
{\typeout{\Lst}
\begin{tikzpicture}
\path[use as bounding box] (-3.5,-3.5) rectangle (3.5,3.5);
\draw (0,0) circle ({1}); % /sqrt(2)
%\node at (1,1) {\Y,\X};
\begin{scope}[tdplot_main_coords]
\draw[-latex] (0,0,0) coordinate (O) -- (1,0,0) node[right]{$\alpha_1$};
\draw[-latex] (O) -- (-1/2,{1/sqrt(2)},-1/2) node[right]{$\alpha_2$};
\draw[-latex] (O) -- (0,0,1) node[right]{$\alpha_3$};
\draw[red,-latex] (O) -- (1/2,{1/sqrt(2)},1/2) node[right]{$-\theta$};
\foreach \Z in \Lst
{\typeout{\Z}
\pgfmathsetmacro{\myx}{{\Z}[0]}
\pgfmathsetmacro{\myy}{{\Z}[1]}
\pgfmathsetmacro{\myz}{{\Z}[2]}
\pgfmathtruncatemacro{\mycol}{int(2*rnd)}
\ifnum\mycol=1
\node at ({posx(\myx,\myy,\myz)},
{posy(\myx,\myy,\myz)},{posz(\myx,\myy,\myz)}) {\usebox\Neutron};
\else
\node at ({posx(\myx,\myy,\myz)},
{posy(\myx,\myy,\myz)},{posz(\myx,\myy,\myz)}) {\usebox\Proton};
\fi}
\end{scope}
\end{tikzpicture}}
\end{document}

OLD ANSWER: The only problem I have (I think) is to adjust the order in which the spheres are drawn (or, equivalently, to dial the right view angles for the simple-minded order I chose).
\documentclass[tikz,border=3.14mm]{standalone}
\usepackage{tikz-3dplot}
\usetikzlibrary{3d}%{n1 - n2/2, n2/Sqrt[2], -n2/2 + n3}
\tikzset{declare function={posx(\x,\y,\z)=\x-\y/2;
posy(\x,\y,\z)=\y/sqrt(2);
posz(\x,\y,\z)=-\y/2+\z;
}}
\newsavebox\Proton
\newsavebox\Neutron
\sbox\Proton{\tikz{\shade[ball color=red] circle({1/sqrt(2)});}}
\sbox\Neutron{\tikz{\shade[ball color=blue] circle({1/sqrt(2)});}}
\begin{document}
\xdef\LstCol{"red","blue"}
\foreach \Lev in {0,...,4}
{\tdplotsetmaincoords{109.471}{0}
\begin{tikzpicture}
\path[use as bounding box] (-3.5,-3.5) rectangle (3.5,3.5);
\draw (0,0) circle ({1}); % /sqrt(2)
%\node at (1,1) {\Y,\X};
\begin{scope}[tdplot_main_coords]
\draw[-latex] (0,0,0) coordinate (O) -- (1,0,0) node[right]{$\alpha_1$};
\draw[-latex] (O) -- (-1/2,{1/sqrt(2)},-1/2) node[right]{$\alpha_2$};
\draw[-latex] (O) -- (0,0,1) node[right]{$\alpha_3$};
\draw[red,-latex] (O) -- (1/2,{1/sqrt(2)},1/2) node[right]{$-\theta$};
% level 0
\ifnum\Lev>0
\pgfmathtruncatemacro{\mycol}{int(2*rnd)}
\ifnum\mycol=1
\node at (0,0,0) {\usebox\Neutron};
\else
\node at (0,0,0) {\usebox\Proton};
\fi
\fi
% level 1
\ifnum\Lev>1
\foreach \Z in {{-1, -1, -1}, {-1, -1, 0},
{-1, 0, 0}, {0, -1, -1},
{0, -1, 0}, {0, 0, -1}, {0, 0, 1},
{0, 1, 0}, {0, 1, 1}, {1, 0, 0},
{1, 1, 0}, {1, 1, 1}}
{\pgfmathsetmacro{\myx}{{\Z}[0]}
\pgfmathsetmacro{\myy}{{\Z}[1]}
\pgfmathsetmacro{\myz}{{\Z}[2]}
\pgfmathtruncatemacro{\mycol}{int(2*rnd)}
\ifnum\mycol=1
\node at ({posx(\myx,\myy,\myz)},
{posy(\myx,\myy,\myz)},{posz(\myx,\myy,\myz)}) {\usebox\Neutron};
\else
\node at ({posx(\myx,\myy,\myz)},
{posy(\myx,\myy,\myz)},{posz(\myx,\myy,\myz)}) {\usebox\Proton};
\fi}
\fi
% level 2
\ifnum\Lev>2
\foreach \Z in {{-1, -2, -1}, {-1, 0, -1}, {-1, 0, 1}, {1, 0, -1}, {1, 0, 1}, {1, 2,
1}}
{\pgfmathsetmacro{\myx}{{\Z}[0]}
\pgfmathsetmacro{\myy}{{\Z}[1]}
\pgfmathsetmacro{\myz}{{\Z}[2]}
\pgfmathtruncatemacro{\mycol}{int(2*rnd)}
\ifnum\mycol=1
\node at ({posx(\myx,\myy,\myz)},
{posy(\myx,\myy,\myz)},{posz(\myx,\myy,\myz)}) {\usebox\Neutron};
\else
\node at ({posx(\myx,\myy,\myz)},
{posy(\myx,\myy,\myz)},{posz(\myx,\myy,\myz)}) {\usebox\Proton};
\fi}
\fi
% level 3
\ifnum\Lev>3
\foreach \Z in {{-2, -2, -1}, {-2, -1, -1}, {-2, -1, 0}, {-1, -2, -2}, {-1, -2,
0}, {-1, -1, -2}, {-1, -1, 1}, {-1, 1, 0}, {-1, 1,
1}, {0, -2, -1}, {0, -1, -2}, {0, -1, 1}, {0, 1, -1}, {0, 1, 2}, {0,
2, 1}, {1, -1, -1}, {1, -1, 0}, {1, 1, -1}, {1, 1, 2}, {1, 2,
0}, {1, 2, 2}, {2, 1, 0}, {2, 1, 1}, {2, 2, 1}}
{\pgfmathsetmacro{\myx}{{\Z}[0]}
\pgfmathsetmacro{\myy}{{\Z}[1]}
\pgfmathsetmacro{\myz}{{\Z}[2]}
\pgfmathtruncatemacro{\mycol}{int(2*rnd)}
\ifnum\mycol=1
\node at ({posx(\myx,\myy,\myz)},
{posy(\myx,\myy,\myz)},{posz(\myx,\myy,\myz)}) {\usebox\Neutron};
\else
\node at ({posx(\myx,\myy,\myz)},
{posy(\myx,\myy,\myz)},{posz(\myx,\myy,\myz)}) {\usebox\Proton};
\fi}
\fi
\end{scope}
\end{tikzpicture}}%}}
\end{document}

If I were to skip level 2, I think it would be fine. Perhaps that's the way to go because these spheres are partly covered by those of level 1.
z bufferofpgfplotscan order the drawing for you I think. – Max Sep 01 '18 at 07:36