
下面是我的效果:
color=none,color=white,nocolor,opacity=0等都无法实现无填充颜色的效果,总是灰色,不好看.

%!LW recipe=lualatex
\documentclass{standalone}
\usepackage[3d]{luadraw}
\usepackage[svgnames]{xcolor}
\begin{document}
\begin{luadraw}{name=intersection_planes}
local ld = luadraw
local pt3d = ld.pt3d
local Origin, vecI, vecJ, vecK, M = pt3d.Origin, pt3d.vecI, pt3d.vecJ, pt3d.vecK, pt3d.M
local g = ld.graph3d:new{
viewdir={"central",0,60},
window={-5,6.9,-3.3,6},
size={10,10},
bbox=false
}
local P1 = ld.planeEq(0,0,1,0)
local P2 = {Origin,M(0,1,1)}
local l=ld.interPP(P1,P2)
ld.Hiddenlines = true
ld.Hiddenlinestyle = "dashed"
g:Dscene3d(
--g:addAxes(Origin,{arrows=1, color="blue"}),
g:addPlane(P1, {
color=none,
edge=true,
edgecolor="violet",
rectangle={vecJ,6,4}
}),
g:addPlane(P2,{
color=none,
edge=true,
edgecolor="blue",
rectangle={M(0,-1,1),6,4}
}),
g:addLine(l,{color="black"}),
g:addLabel(
"$\\alpha$",M(1.6,-2.7,0),{dir={vecJ, -vecI}},
"$\\beta$",M(-0.8,-1.7,2), {dir={M(0,1,-1),-vecI}}
)
)
local P=l[1]+1*l[2]
g:Ddots3d(P,"black")
local A=l[1]+-4*l[2]
g:Dlabel3d({
"$P$",P,{pos="E",node_options="xshift=0cm"},-
"$l$",A,{pos="E",node_options="xshift=0cm"}
})
g:Show()
\end{luadraw}
\end{document}
由于这里遮挡关系并不算太复杂,可以通过画两次(先遮挡再画虚线)的方法来手动维护遮挡关系:
\documentclass{standalone}
\usepackage[3d]{luadraw}
\usepackage[svgnames]{xcolor}
\usepackage{fourier-otf}
\begin{document}
\begin{luadraw}{name=intersected_surface}
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 g = ld.graph3d:new{
window3d = {-5,5,-5,5,-5,5},
window = {-3,3,-2,2},
-- adjust2d = true,
-- viewdir = {30,75}
viewdir = {"yz",0.75,40}
}
-- g:Dpolyline3d({{Origin,3*vecI},{Origin,3*vecJ},{Origin,3*vecK}}, "thick,-Stealth")
g:Dplane({Origin, vecK}, vecI, 2, 4 , ld.all, "DarkBlue,fill=white")
local vecN = ld.rotate3d(vecK, -70, {Origin,vecI}) -- rotate vecK 30 degree around vecI
g:Dplane({Origin, vecN}, vecI, 2, 2.5, ld.all, "Orange,fill=white")
g:Dplane({Origin, vecK}, vecI, 2, 4 , ld.all, "DarkBlue,dashed")
g:Dplane({vecJ, vecK}, vecI, 2, 2 , ld.all, "DarkBlue,fill=white") -- trick, fill half plane... not elegant actually...
g:Dplane({Origin, vecN}, vecI, 2, 2.5, ld.all, "Orange,dashed")
g:Dpolyline3d({-2.5*vecI,2.5*vecI}, "thick")
g:Ddots3d({Origin})
g:Dlabel3d(
"$\\ell$",2.5*vecI,{pos="SW"},
"$P$",Origin,{pos="E",dist=0.1},
"$\\alpha$",vecI-2*vecJ,{pos="NE",dir={vecJ,-vecI},node_options="text=DarkBlue",dist=0},
"$\\beta$",ld.rotate3d(vecI-vecJ, -70, {Origin,vecI}),{pos="E",dir={-vecI,pt3d.prod(vecN,-vecI)},node_options="text=Orange"}
)
g:Show()
\end{luadraw}
\end{document}
g:Dscene3d)的方法:\documentclass{standalone}
\usepackage[3d]{luadraw}
\usepackage[svgnames]{xcolor}
\usepackage{fourier-otf}
\begin{document}
\begin{luadraw}{name=intersected_surface_Dscene}
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 g = ld.graph3d:new{
window3d = {-5,5,-5,5,-5,5},
window = {-3,3,-2,2},
viewdir = {"yz",0.75,40}
}
local vecN = ld.rotate3d(vecK,-70,{Origin,vecI})
ld.Hiddenlines = true; ld.Hiddenlinestyle="dashed"
g:Dscene3d(
g:addPlane({Origin,vecK},{contrast=0,rectangle={vecI,2,4},edge=true,edgecolor="DarkBlue",hidden=true}),
g:addPlane({Origin,vecN},{contrast=0,rectangle={vecI,2,2.5},edge=true,edgecolor="Orange",hidden=true}),
g:addDots({Origin}),
g:addLabel(
"$\\ell$",2.5*vecI,{pos="SW"},
"$P$",Origin,{pos="E",dist=0.1},
"$\\alpha$",vecI-2*vecJ,{pos="NE",dir={vecJ,-vecI},color="DarkBlue",dist=0},
"$\\beta$",ld.rotate3d(vecI-vecJ,-70,{Origin,vecI}),{pos="E",dir={-vecI,pt3d.prod(vecN,-vecI)},color="Orange"}
)
)
g:Dpolyline3d({-2.5*vecI,2.5*vecI}, "thick")
g:Show()
\end{luadraw}
\end{document}
这里的「灰色」的关键在于 contrast 选项(color的默认值就是white,我是能省就省的,所以我不写):

vecIld.rotate3d来处理这里的旋转,这样用到的点比较少viewdir = {"yz",0.75,40}(类似斜二测画法)ld.Hiddenlines = true; ld.Hiddenlinestyle="dashed"控制。如果一个面是半透明的,那么不会(也不应该)出现虚线可以对比一下思路 :-)