30 我理解了window, 但是无法理解luadraw的window3d

发布于 2026-09-21 20:58:49

无论我怎么改变window3d里面的6个参数值,都没有影响到输出的图形,不知道window3d的设置还有什么价值?

而window的设置可以截取部分图形。我将设置window的代码那行删除,结果右侧显示不完全,接着反复调整window3d的那6个数,都是无效的.

我希望是取消留白,只有图形区域,类似border=0pt.

%!LW recipe=lualatex
\documentclass{standalone}
\usepackage[3d]{luadraw}
\usepackage[svgnames]{xcolor}

\begin{document}
\begin{luadraw}{name=cube1} 
    local ld = luadraw
    local pt3d = ld.pt3d
    local M=pt3d.M
    local g = ld.graph3d:new{
        size={9,9},
        window3d = {0,1.5,0,5.5,0,0.6},
        window={-1.06,5.5,-1.06,1.5},
        bbox=false,
        viewdir={"yz",0.5,45}
    }
    local Origin, vecI, vecJ, vecK = pt3d.Origin, pt3d.vecI, pt3d.vecJ, pt3d.vecK

    local A=M(0,4,0)
    local C=ld.parallelep(Origin,1.5*vecI,2.5*vecJ,1.5*vecK)
    local C1=ld.parallelep(A,1.5*vecI,1.5*vecJ,1.5*vecK)
    g:Dpoly(C,{
        mode=ld.mWireframe,
    })
    g:Dpoly(C1,{
        mode=ld.mWireframe,
    })

    g:Show()
\end{luadraw}
\end{document}

查看更多

关注者
0
被浏览
285
Sagittarius Rover
Sagittarius Rover 2026-09-27
这家伙很懒,什么也没写!

简单地说:

  • window3d控制的是三维空间的边界盒
  • window控制的是三维空间边界盒里的内容按照viewdir投影到纸张平面后,2D平面的边界

luadraw在绘制的过程中,_大致_经历了下面的过程:

  • 根据3D盒子的边界确定3D空间盒子的边界,一些在盒子外的内容可能会被某些方法切去
  • 基于viewdir确定3D物体投影到屏幕投影面的方法和角度
  • 基于adjust2d,window和bbox以及size等参数调整屏幕投影面的最终显示效果

(AI总结,仅供参考)

image.png

在你的例子中,3D盒子大小是不影响的最终投影结果的,因此:

    local g = ld.graph3d:new{
        window3d = {0,1.5,0,5.5,0,0.6},
        -- window3d = {0,3,0,11,0,1.2},
        window={-1.1,5.5,-1.1,1.5},
        bbox=false,size={9,9},
        viewdir={"yz",0.5,45}
    }

和

    local g = ld.graph3d:new{
        -- window3d = {0,1.5,0,5.5,0,0.6},
        window3d = {0,3,0,11,0,1.2},
        window={-1.1,5.5,-1.1,1.5},
        bbox=false,size={9,9},
        viewdir={"yz",0.5,45}
    }

的表现都是相同的:

image.png

我们可以通过 Dboxaxes3d 方法来更好地可视化这种差距:

\documentclass[border=8pt]{standalone}
\usepackage[3d]{luadraw}
\usepackage[svgnames]{xcolor}
\usepackage{fourier-otf}
\begin{document}
\begin{tabular}{cc}
    \begin{luadraw}{name=cube_small} 
        local ld = luadraw
        local pt3d = ld.pt3d
        local M = pt3d.M
        local g = ld.graph3d:new{
            window3d = {0, 1, 0, 1, 0, 1},
            bbox = false, size = {10, 10},
            viewdir = {"yz", 0.5, 45}
        }
        local Origin, vecI, vecJ, vecK = pt3d.Origin, pt3d.vecI, pt3d.vecJ, pt3d.vecK
        local C = ld.parallelep(Origin, 1.5*vecI, 1.5*vecJ, 1.5*vecK)
        g:Dboxaxes3d({grid = true, gridcolor = "cyan!50", fillcolor = "cyan!20", drawbox = true})
        g:Dpoly(C, {mode = ld.mWireframe})
        g:Show()
    \end{luadraw}
    &
    \begin{luadraw}{name=cube_large} 
        local ld = luadraw
        local pt3d = ld.pt3d
        local M = pt3d.M
        local g = ld.graph3d:new{
            window3d = {0, 2, 0, 2, 0, 2},
            bbox = false, size = {10, 10},
            viewdir = {"yz", 0.5, 45}
        }
        local Origin, vecI, vecJ, vecK = pt3d.Origin, pt3d.vecI, pt3d.vecJ, pt3d.vecK
        local C = ld.parallelep(Origin, 1.5*vecI, 1.5*vecJ, 1.5*vecK)
        g:Dboxaxes3d({grid = true, gridcolor = "cyan!50", fillcolor = "cyan!20", drawbox = true})
        g:Dpoly(C, {mode = ld.mWireframe})
        g:Show()
    \end{luadraw}
    \\
    \texttt{window3d = \{0, 1, 0, 1, 0, 1\}} &
    \texttt{window3d = \{0, 2, 0, 2, 0, 2\}}
\end{tabular}
\end{document}

image.png

如果不左右对比,同时不画盒子,只能感受到缩放的差距,因为立方体和2D画布的相对关系是相同的。因为我不怎么会用到那种「盒子外的内容可能会被切去」的方法,所以其实保持默认的 window3d={-5,5,-5,5,-5,5,1,1,1},只调整window和size其实也是够的...


无论我怎么改变window3d里面的6个参数值,都没有影响到输出的图形,不知道window3d的设置还有什么价值?

是因为只改变「window3d里面的6个参数值」,只会影响3D盒子边界和真实物体的相对大小关系,但是绘制结果是经过上述流程2D投影后得到的,投影后的纸张和物体的投影相对大小关系还是相同

而window的设置可以截取部分图形。我将设置window的代码那行删除,结果右侧显示不完全。

这是因为不写window,就相当使用的是默认值window={-5,5,-5,5},如果3D投影到2D后还超出了window,那么就会「显示不完全」

我希望是取消留白,只有图形区域,类似border=0pt

那么也许应该使用类似bbox=false的方法....

1 个回答

撰写答案

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

发布
问题

分享
好友

手机
浏览

扫码手机浏览