挑一个玩玩...不妨假定目标是:

以下是基于 luadraw 的实现:
\documentclass{standalone}
\usepackage[3d]{luadraw}% lualatex needed
\usepackage[svgnames]{xcolor}
\usepackage{fourier-otf}
\begin{document}
\begin{luadraw}{name=circumsphere}
local ld = luadraw
local pt3d, cpx = ld.pt3d, ld.cpx
local M, Mc, Ms = pt3d.M, pt3d.Mc, pt3d.Ms
local Origin, vecI, vecJ, vecK = pt3d.Origin, pt3d.vecI, pt3d.vecJ, pt3d.vecK
local sqrt = math.sqrt
require 'luadraw_spherical'
local g = ld.graph3d:new{
window3d = {-5,5,-5,5,-5,5},
window = {-5,5,-5,5},
viewdir = {0,80}
}
ld.Hiddenlinestyle = "dashed"
local R, hBottom, hTop = 3, -1, 2.5
local O1, O2 = hBottom*vecK, hTop*vecK
local R1, R2 = sqrt(R^2-hBottom^2), sqrt(R^2-hTop^2)
local A1, A2 = Mc(R1,-30*ld.deg,hBottom), Mc(R2,-30*ld.deg,hTop)
g:Define_sphere{color = "",edgecolor = "black",edgewidth = 8,hiddenstyle = "dashed",mode = ld.mWireframe}
g:Dfrustum(O1,R1,R2,O2,{color="violet", edgecolor="black"})
g:Dpolyline3d({{O1,O2},{O1,A1},{O2,A2},{A1,A2}},"magenta,dashed,semithick")
g:Dpolyline3d({{Origin,A1},{Origin,A2}},"cyan,dashed,semithick")
g:Dballdots3d({Origin,O1,O2,A1,A2},"black",0.75)
g:Dlabel3d(
"$O$",Origin,{pos="E"},
"$O_1$",O1,{},
"$O_2$",O2,{},
"$A$",A1,{pos="S"},
"$A_1$",A2,{pos="SW"},
"$h$",(O1+O2)/2,{pos="E",node_options="text=magenta"},
"$r_1$",(O1+A1)/2,{pos="SE"},
"$r_2$",(O2+A2)/2,{pos="N"},
"$R$",A1/2,{pos="N",node_options="text=cyan"}
)
g:Dspherical()
g:Show()
\end{luadraw}
\end{document}
再画一个玩玩:

\documentclass{standalone}
\usepackage[3d]{luadraw}
\begin{document}
\begin{luadraw}{name=insphere}
local ld = luadraw
local pt3d = ld.pt3d
local M, Mc, Origin = pt3d.M, pt3d.Mc, pt3d.Origin
local sqrt = math.sqrt
require 'luadraw_spherical'
local g = ld.graph3d:new{
window3d = {-5,5,-5,5,-5,5},
windows = {-4,4,-4,4},
viewdir = {0,80}, size={10,10}
}
local R1, R2 = 2, 4
local R = sqrt(R1*R2) --
local O2, O1 = M(0,0,-R), M(0,0,R)
local A, A1 = Mc(R2,-45*ld.deg,-R), Mc(R2,135*ld.deg,-R)
local B, B1 = Mc(R1,-45*ld.deg,R), Mc(R1,135*ld.deg,R)
local vecn = Mc(R,45*ld.deg,0)
-- tangent point
local X = (R1 * A + R2 * B) / (R1 + R2)
local Y = (R1 * A1 + R2 * B1) / (R1 + R2)
ld.Hiddenlines = true; ld.Hiddenlinestyle = "dashed"
g:Define_sphere{
radius = R,
color = "magenta!25",
edgecolor = "black",
edgewidth = 6,
edgestyle = "dashed",
hiddencolor = "black",
hiddenstyle = "dashed",
mode = ld.mWireframe
}
g:DSpolyline({{A,A1},{B,B1},{A,B},{A1,B1}},{width=6})
g:DSpolyline({{B,B1},{A1,B1}},{width=6,style="dashed"})
g:DSpolyline({{O1,O2},{Origin,X},{Origin,Y}},{color="cyan",style="dashed",width=6})
g:DScircle({Origin,vecn},{color="blue",width=6,style="dashed"})
g:Dspherical()
g:Dfrustum(O2, R2, R1, O1, {edgewidth=6, hiddenstyle="dashed"})
---
g:Dcircle3d(Origin,R,vecn,"draw=none, fill=blue!30, fill opacity=0.4")
---
g:Dballdots3d({Origin,O1,O2,A,B,A1,B1,X,Y},"black",0.75)
g:Dangle3d(O1,O2,A,"semithick");g:Dangle3d(O2,O1,B,"semithick");g:Dangle3d(Origin,X,B,"semithick");
g:Dlabel3d(
"$O$",Origin,{pos="SE"},
"$O_2$",O1,{pos="N"},
"$B$",B,{},
"$O_1$",O2,{pos="S"},
"$A$",A,{},
"$H$",X,{pos="W"},
"$r_2$",(O1+B)/2,{pos="N",node_options="text=red"},
"$r_2$",(X+B)/2,{pos="W"},
"$r_1$",(X+A)/2,{},
"$r_1$",(O2+A)/2,{pos="S"},
"$R$",(O2+Origin)/2,{pos="W"}
)
g:Show()
\end{luadraw}
\end{document}