30 用luadraw画了两个高度一样的棱柱,但显示不一样

发布于 2026-09-26 08:29:11

我画了两个棱柱,代码设置高度一样,但是输出结果不一样,这是为什么?

\documentclass{standalone}
\usepackage[3d]{luadraw}
\usepackage[svgnames]{xcolor}
\begin{document}
\begin{luadraw}{name=prism}
    local ld = luadraw
    local pt3d = ld.pt3d
    local M,Mc=pt3d.M,pt3d.Mc
    local g = ld.graph3d:new{
        window={-2,5,-1,7},
        bbox=false,
        viewdir={"yz",0.5,45}
    }
    local A,B,C=Mc(1,-120*ld.deg,0),Mc(1,0*ld.deg,0), Mc(1,120*ld.deg,0)
    local base={A,B,C}
    local prism = ld.prism(base, M(2,0,3))
    g:Dpoly(prism,{mode=ld.mWireframe,hiddenstyle="dashed"})
    local A1,B1,C1=A+M(2,0,3),B+M(2,0,3),C+M(2,0,3)
    local base1={A1,B1,C1}
    local prism1 = ld.prism(base1, M(-2,0,3))
    g:Dpoly(prism1,{mode=ld.mWireframe,hiddenstyle="dashed"})
    local V = prism.vertices
    g:Dlabel3d("$A$",V[1],{pos="W", node_options="xshift=-0cm"})
    g:Dlabel3d("$B$",V[2],{pos="S", node_options="xshift=0cm"})
    g:Dlabel3d("$C$",V[3],{pos="E",  node_options="xshift=0cm"})
    g:Dlabel3d("$A_1$",V[4],{pos="W",node_options="xshift=0cm"})
    g:Dlabel3d("$B_1$", V[5],{pos="SE"})
    g:Dlabel3d("$C_1$", V[6],{pos="E"})
    g:Show()
\end{luadraw} 
\end{document}

image.png

查看更多

关注者
0
被浏览
153
2 个回答
豆豆の爸
豆豆の爸 2天前
这家伙很懒,什么也没写!

向量(2,0,3)与(-2,0,3)长度相等,但方向不同;在 yz 视角下,3D 投影到平面后的屏幕高度不一样,造成视觉错觉,不是棱柱真实高度不同。

Sagittarius Rover
这家伙很懒,什么也没写!

上面的答案是正确的,我们可以考虑调整角度来说明这一点,下面的代码使用与z轴成90度的「平行方向」来看这个几何体,我们可以看到他们是「对称等高」的:

\documentclass[border=5pt]{standalone}
\usepackage[3d]{luadraw}
\usepackage[svgnames]{xcolor}
\begin{document}
\begin{luadraw}{name=prism}
    local ld = luadraw
    local pt3d = ld.pt3d
    local Origin, vecK = pt3d.Origin, pt3d.vecK
    local M,Mc=pt3d.M,pt3d.Mc
    local g = ld.graph3d:new{
        window3d={-5,5,-5,5,-5,5},
        window={-5,5,-5,5},
        bbox=false,
        -- adjust2d = true,
        viewdir={"yz",0.5,45}
    }
    local A1,B1,C1=Mc(1,-120*ld.deg,0),Mc(1,0,0), Mc(1,120*ld.deg,0)
    local prism1 = ld.prism({A1,B1,C1}, M(-2,0,3))
    g:Dpoly(prism1,{mode=ld.mWireframe,hiddenstyle="dashed"})
    local prism = ld.sym3d(prism1, {Origin,vecK})
    g:Dpoly(prism,{mode=ld.mWireframe,hiddenstyle="dashed"})
    local V = prism.vertices
    g:Dlabel3d(
        "$A$",V[1],{pos="W"},
        "$B$",V[2],{pos="S"},
        "$C$",V[3],{pos="E"},
        "$A_1$",V[4],{pos="W"},
        "$B_1$", V[5],{pos="SE"},
        "$C_1$", V[6],{pos="E"}
    )
    g:Show()
\end{luadraw} 
\end{document}

image.png

另外,如果我是你,我可能不会考虑这样的构造,我会想办法让「两个棱柱相交的那个面」在「xoy平面」上:

\documentclass[border=5pt]{standalone}
\usepackage[3d]{luadraw}
\usepackage[svgnames]{xcolor}
\usepackage{fourier-otf}
\begin{document}
\begin{luadraw}{name=prism}
    local ld = luadraw
    local pt3d = ld.pt3d
    local Origin, vecK = pt3d.Origin, pt3d.vecK
    local M,Mc=pt3d.M,pt3d.Mc
    local g = ld.graph3d:new{
        window3d={-5,5,-5,5,-5,5},
        window={-5,5,-5,5},
        bbox=false,
        -- adjust2d = true,
        viewdir={"yz",0.5,45}
    }
    local A1,B1,C1=Mc(1,-120*ld.deg,0),Mc(1,0,0), Mc(1,120*ld.deg,0)
    local prism1 = ld.prism({A1,B1,C1}, M(-2,0,3))
    g:Dpoly(prism1,{mode=ld.mWireframe,hiddenstyle="dashed"})
    local prism = ld.sym3d(prism1, {Origin,vecK})
    g:Dpoly(prism,{mode=ld.mWireframe,hiddenstyle="dashed"})
    local V = prism.vertices
    g:Dlabel3d(
        "$A_1$",V[1],{pos="W"},
        "$B_1$", V[2],{pos="SE"},
        "$C_1$", V[3],{pos="E"},
        "$A$",V[4],{pos="W"},
        "$B$",V[5],{pos="S"},
        "$C$",V[6],{pos="E"}
    )
    g:Show()
\end{luadraw} 
\end{document}

image.png

我对你的代码做了一下简化:

  • 0*ld.deg 这里的0就没必要乘了
  • node_options="xshift=-0cm" 默认就不移动,不需要这么改,一般改距离可以直接用dist=0.1
  • g:Dlabel3d一个命令可以同时画六个点的坐标
  • 在这个例子里,完全可以构造一个对称的棱柱,使用ld.sym3d,这可以简化你的不少坐标...

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览