My code is long since it is not easy to produce a spring in space with a vector inside it, at least in my opinion. There are many variables and constants (for the vectors a and b, and their cross-product, for the sprig's radius and so on). You can also try to change the point of view...
The code
\documentclass[border=10pt]{standalone}
\usepackage{tikz}
\usepackage{tikz-3dplot}
\usetikzlibrary{math, calc, arrows.meta}
\begin{document}
\tikzset{%
view/.style 2 args={% observer longitude and latitude (y upwards)
% Remark. lomg=0 means x=0
z={({-sin(#1)}, {-cos(#1)*sin(#2)})},
x={({cos(#1)}, {-sin(#1)*sin(#2)})},
y={(0, {cos(#2)})},
evaluate={%
\tox={sin(#1)*cos(#2)};
\toy={sin(#2)};
\toz={cos(#1)*cos(#2)};
},
longitude = #1,
latitude = #2
}
}
\pgfkeys{/tikz/.cd,
latitude/.store in=\aLatit, % observer's latitude
latitude=0
}
\pgfkeys{/tikz/.cd,
longitude/.store in=\aLongit, % observer's longitude
longitude=0 % corresponds to x=0
}
\tikzset{
arc from/.style args={#1 towards #2}{%
insert path={coordinate (tmp) let
\p1 = (tmp),
\p2 = (#1),
\p3 = (#2),
\n1 = {veclen(\x1-\x2, \y1-\y2)},
\n2 = {atan2(\y2-\y1, \x2-\x1)},
\n3 = {atan2(\y3-\y1, \x3-\x1)}
in (\p2) arc (\n2: \n3 : \n1)
}
}
}
\tikzmath{
real \ax, \ay, \az, \bx, \by, \bz, \cx, \cy, \cz;
\ax = 2; \ay = -1.5; \az = 1;
\bx = 1.5; \by = .5; \bz = -.75;
\cx = \ay*\bz -\az*\by;
\cy = -\ax*\bz +\az*\bx;
\cz = \ax*\by -\ay*\bx;
real \an, \bn, \ux, \uy, \uz, \vx, \vy, \vz, \vn, \uv, \wx, \wy, \wz;
\an = {sqrt(\ax*\ax +\ay*\ay + \az*\az)};
\ux = \ax/\an; \uy = \ay/\an; \uz = \az/\an;
\bn = {sqrt(\bx*\bx +\by*\by + \bz*\bz)};
\vx = \bx/\bn; \vy = \by/\bn; \vz = \bz/\bn;
\uv = \ux*\vx +\uy*\vy +\uz*\vz;
\vx = \vx -\uv*\ux;
\vy = \vy -\uv*\uy;
\vz = \vz -\uv*\uz;
\vn = {sqrt(\vx*\vx +\vy*\vy + \vz*\vz)};
\vx = \vx/\vn; \vy = \vy/\vn; \vz = \vz/\vn;
\wx = \uy*\vz -\uz*\vy;
\wy = -\ux*\vz +\uz*\vx;
\wz = \ux*\vy -\uy*\vx;
real \r, \wl;
\r = .2;
\wl = .5;
integer \N, \nbPoints;
\N = 4;
\nbPoints = 24;
}
\begin{tikzpicture}[view={45}{28}, line width=.8pt, every node/.style={scale=.7}]
% canonical coordinate system
\begin{scope}[color=gray!80, line width=.2pt]
\draw[->] (0, 0, 0) -- (1, 0, 0) node[shift={(.2, .1, 0)}] {$x$};
\draw[->] (0, 0, 0) -- (0, 1, 0) node[shift={(.2, .2, 0)}] {$y$};
\draw[->] (0, 0, 0) -- (0, 0, 1) node[shift={(0, .2, .2)}] {$z$};
\end{scope}
% the vectors
\draw[arrows={-Latex}] (0, 0, 0) -- (\ax, \ay, \az)
node[pos=.7, left] {$\vec{a}$};
\draw[arrows={-Latex}] (0, 0, 0) -- (\bx, \by, \bz)
node[pos=.7, above] {$\vec{b}$};
\draw (0, 0, 0) -- (\cx, \cy, \cz)
node[pos=.7, above right] {$\vec{a}\times\vec{b}$};
% Gram Schmidt on the vectors
\begin{scope}[color=orange!80, line width=.4pt]
\draw[->] (0, 0, 0) -- (\ux, \uy, \uz) coordinate (U);
\path (\bx/\bn, \by/\bn, \bz/\bn) coordinate (V);
\draw[->] (0, 0, 0) -- (\vx, \vy, \vz);
% \draw[->] (0, 0, 0) -- (\wx, \wy, \wz);
\end{scope}
% the arc
\draw[->, very thin] (0, 0, 0) [arc from=U towards V];
% cross product inside the spring
\draw[white, opacity=.7, line width=3pt]
(0, 0, 0) -- (${(\N -1)*\wl}*(\wx, \wy, \wz)$) coordinate (seen);
% the spring
\foreach \j [parse=true, evaluate=\j as \s using {(\j -1)/\nbPoints*360},
evaluate=\j as \t using {\j/\nbPoints*360}]
in {1, ..., \N*\nbPoints}{%
\tikzmath{%
\x1 = \r*cos(\s)*\ux +\r*sin(\s)*\vx +(\j -1)/\nbPoints*\wl*\wx;
\y1 = \r*cos(\s)*\uy +\r*sin(\s)*\vy +(\j -1)/\nbPoints*\wl*\wy;
\z1 = \r*cos(\s)*\uz +\r*sin(\s)*\vz +(\j -1)/\nbPoints*\wl*\wz;
\x2 = \r*cos(\t)*\ux +\r*sin(\t)*\vx +\j/\nbPoints*\wl*\wx;
\y2 = \r*cos(\t)*\uy +\r*sin(\t)*\vy +\j/\nbPoints*\wl*\wy;
\z2 = \r*cos(\t)*\uz +\r*sin(\t)*\vz +\j/\nbPoints*\wl*\wz;
}
\draw[blue, preaction={draw=white, opacity=.9, line width=2pt}]
(\x1, \y1, \z1) -- (\x2, \y2, \z2);
}
% the cross product over the spring
\draw[arrows={-Latex}, preaction={draw=white, opacity=.9, line width=2pt}]
(seen) -- (\cx, \cy, \cz);
\end{tikzpicture}
\end{document}
3d
library intikz
. See section 40 of the pgf manual. It starts on page 564.