Well, I wrote an interactive Variable Calculus book and, as I don't know a "3D locator", I used mouse events to select and drag points. I learned the code from several posts. Here I share tow basic examples
First one you can see in here. Second one follow

The code is
Manipulate[Grid[{
(*Titulos*)
{Style["Puntos en 3D", Bold, 10,RGBColor[0.12, 0, 0.5]]},
{
(*------------------------------------------ 3D --------------------*)
DynamicModule[{pts={{2,0,2},{0,2,1}},index=0,pos0,pos1,mypr={{-2,4},{-2,4},{-2,4}},AV1Cap1Obj},
(*Objetos*)
AV1Cap1Obj[var_]:=If[var==1,{Thickness[0.0001],Arrowheads[0.00], Arrow[ {{0,0,0},{0,0,0}} ] },
If[var==2,{PointSize[0.03], Point[Dynamic@pts[[2]]],FaceForm[],EdgeForm[], Cuboid[Dynamic[pts[[2]]-{0.5,0.5,0.5}]] } ] ];
(* *)
EventHandler[
Graphics3D[{
AV0Cap1ejes,
(*---------- Parte dinámica --------------*)
Dynamic[{Text[,1.1pts[[2]],{0,-1}],
Dashed, Thick, RGBColor[0, 0.3, 0], Gray,
Line[{{pts[[2,1]],0,0},{pts[[2,1]],pts[[2,2]],0},{0,pts[[2,2]],0}}],Line[{{pts[[2,1]],pts[[2,2]],0},pts[[2]],{0,0,pts[[2,3]]}}],
Text[Style[NumberForm[Round[pts[[2,1]],0.1],2],Bold,10],{pts[[2,1]],-0.4,0}],
Text[Style[NumberForm[Round[pts[[2,2]],0.1],2],Bold,10],{-0.4,pts[[2,2]],0}],Text[Style[NumberForm[Round[pts[[2,3]],0.1],2],Bold,10],{0,-0.4,pts[[2,3]]}]
}],
MouseAppearance[EventHandler[ (*Función: Aplica # a {1,2,...}*)
Mouseover[
{ (*expr base, mouse fuera*)
Dynamic[If[index===#,Red,RGBColor[0, 0.34, 0]]],AV1Cap1Obj[#]
},
{(* mouse over*)
Dynamic[If[index===0||index===#,Red,RGBColor[0, 0.34, 0]]],AV1Cap1Obj[#]
}
](*MouseOver*),
{"MouseDown":>(index=#;pos0=pts[[index]]) (*Selecciona: pos0 = posición actual*)
},
PassEventsUp->True]&/@Range[Length[pts]](*EventHandler local, #=1,2,....*),"Arrow"]
} (*Opciones Graphics3D*)
,PlotRange->mypr,ImageSize->350, ViewPoint->{1,1, 0.6}, Boxed->False,ImagePadding->None,SphericalRegion->True](*Graphics3D*)
,{ (*Si arrastra...*)
"MouseDragged":>If[index>0,((pos1=#[[2]]+Projection[pos0-#[[2]],#[[1]]-#[[2]]])&@MousePosition["Graphics3DBoxIntercepts"]);
pts[[index]]=pos1
], (*Clip puntos*)
"MouseUp":>(pts[[All,3]]=Clip[pts[[All,3]],{-1.8,2.8}];pts[[All,2]]=Clip[pts[[All,2]],{-1.8,2.8}];pts[[All,1]]=Clip[pts[[All,1]],{-1.8,2.8}];
index=0)
},
(*Pass the events to LocatorPane by setting PassEventsDown\[Rule]True in the deepest event handlers*)
PassEventsDown->True](*EventHandler Global*)
](*DynamicModule*)
}}, Alignment->Top], (*Grid*)
(*-------Manipulate------*)
ContentSize ->Automatic,
ControlPlacement->Top,
AppearanceElements->None,
Alignment->{Top},
SaveDefinitions->True,
SynchronousInitialization->False,
Initialization:>{ violeta=RGBColor[0.12, 0, 0.5];
Ejes3DTxy[xmin_,xmax_,ymin_,ymax_,zmin_,zmax_]:={
Black,Arrowheads[Medium],
Arrow[Tube[{{xmin,0,0.01},{0,0,0.01},{xmax,0,0.01}},0.007]],
Arrow[Tube[{{0,ymin+0.01,0.01},{0,0,0.01},{0,ymax+0.01,0.01}},0.007]],
Arrow[Tube[{{0.01,0.01,zmin+0.01},{0.01,0.01,0.01},{0,0,zmax+0.01}},0.007]],
Gray,
Table[Line[{{IntegerPart[xmin],i,0},{IntegerPart[xmax],i,0}}],{i,IntegerPart[ymin],IntegerPart[ymax],1}],Table[Line[{{i,IntegerPart[ymin],0},{i,IntegerPart[ymax],0}}],{i,IntegerPart[xmin],IntegerPart[xmax],1}],
};
AV0Cap1ejes=Ejes3DTxy[-1,3,-1,3,0,3];
wNformat[var_]:=Style[NumberForm[Round[ var ,0.1],3],Bold,12,RGBColor[0.23, 0, 0.70]]}]
ResourceFunction["Locator3D"]
- it is intended to be a drop-in replacement forLocator
in 3D. (Apart from the fact that you can't use it as control type forManipilate
) - I'll add a more concrete answer once I'm back at my PC $\endgroup$