gnuplot:如何避免观看依赖角度的半透明3D曲面?

gnuplot:如何避免观看依赖角度的半透明3D曲面?,3d,gnuplot,transparency,3d,Gnuplot,Transparency,我绊倒在下面。 如果我使用pm3d绘制一个立方体,并将侧面定义为半透明,则如果我将立方体旋转90度,我希望立方体看起来是一样的。 但是,显然,根据观察角度的不同,某个特定表面会比其他表面更亮或更暗。在下面的示例中,30度和120度的视图有3种不同的红色阴影,而210度和300度的视图只有2种红色阴影。不涉及pm3d照明 问题: 这怎么解释呢?如何避免这种情况?我对立方体的定义有问题吗? 我是否遗漏了帮助pm3d或帮助pm3d算法或帮助pm3d颜色分配下文档中的任何内容?我使用的是太旧的gnupl

我绊倒在下面。 如果我使用
pm3d
绘制一个立方体,并将侧面定义为半透明,则如果我将立方体旋转90度,我希望立方体看起来是一样的。 但是,显然,根据观察角度的不同,某个特定表面会比其他表面更亮或更暗。在下面的示例中,30度和120度的视图有3种不同的红色阴影,而210度和300度的视图只有2种红色阴影。不涉及
pm3d照明

问题: 这怎么解释呢?如何避免这种情况?我对立方体的定义有问题吗? 我是否遗漏了
帮助pm3d
帮助pm3d算法
帮助pm3d颜色分配
下文档中的任何内容?我使用的是太旧的gnuplot版本(5.2.8)还是“错误”的终端(wxt)

代码:

### semitransparent 3D surfaces
reset session

$Cube <<EOD
0 0 0
0 0 1
0 1 1
0 1 0
0 0 0

1 0 0
1 0 1
1 1 1
1 1 0
1 0 0

0 0 0
1 0 0
1 1 0
0 1 0
0 0 0

0 0 1
1 0 1
1 1 1
0 1 1
0 0 1
EOD

set view equal xyz
set cbrange [0.9:1]
set palette defined (1 'red')
set pm3d depthorder hidden3d
set pm3d implicit
unset hidden3d
unset label
unset tics
unset border
unset key
unset colorbox

set multiplot layout 2,3
    a=75
    b=30
    r=1.3
    set title sprintf("opaque view: %d, %d",a,b)
    set view a,b,r
    set style fill transparent solid 1
    splot $Cube u 1:2:3:(1) w l lw 0.5 lc "black"
    
    set style fill transparent solid 0.3
    do for [i=30:300:90] {
        set title sprintf("transparent view: %d, %d",a,i)
        set view a,i
        replot
    }
unset multiplot
### end of code
半透明3D曲面 重置会话
$Cube这里发生了很多事情

  • 起初,我认为您看到的部分证据表明,无论您使用哪个终端,图形渲染的合成操作都是不可传递的。然而,我认为,没有这一点,大部分或所有的影响都可以解释

      (background ∘ 0.3red) ∘ 0.3red  ?=?  background ∘ (0.3red ∘ 0.3red)
    
  • 一个关键是你的“立方体”不是一个真正的立方体;它缺少两个面。如果将它们绘制为多边形,则视图角度的差异效果更为明显:

    unset pm3d
    splot $Cube u 1:2:3 w polygons
    
  • 因为您正在使用pm3d的
    ,程序试图将顶点解释为定义曲面的一组扫描线。这真的不管用。我不完全确定最终结果是什么,但我怀疑有些区域被画了两次。你可以通过用画笔再画一次来感觉这里出了什么问题

     set pm3d interpolate 2,2
    
  • 如果添加立方体缺少的两个面,并使用多边形绘制面,效果将完全消失

    set view equal xyz
    unset hidden3d
    unset tics
    unset border
    unset key
    
    set multiplot layout 2,3
        a=75
        b=30
        r=1.3
        set title sprintf("opaque view: %d, %d",a,b)
        set view a,b,r
        set style fill transparent solid 1
        set pm3d border lw 0.5 lc "black"
        splot $Cube u 1:2:3 w polygons fc "red"
        
        set style fill transparent solid 0.3
        do for [i=30:300:90] {
            set title sprintf("transparent view: %d, %d",a,i)
            set view a,i
            replot
        }
    unset multiplot
    

    非常感谢您的解释。应该提到的是,使用多边形的
    需要gnuplot 5.4。我想我还是不完全理解
    pm3d
    。当绘制不透明立方体(如您所说,缺少两个面)并手动旋转它时,我无法“查看内部”,因为“内部”线是隐藏的,所以我假设立方体由6个曲面闭合。但显然,事实并非如此。那是另一个问题。原来的问题得到了回答,再次感谢。