Reputation: 25704
I stumbled accross the following.
If I plot, e.g. a cube using pm3d
and define the sides to be semitransparent, I would expect that the cube looks the same if I rotate it by multiple of 90 degrees.
However, apparently depending on the viewing angle a particular surface appears brighter or darker than the others. In the example below the views at 30 and 120 degrees have 3 different shades of red whereas the view at 210 and 300 degrees have only 2 shades of red. There is no pm3d lighting
involved.
Questions:
How can this be explained? How can this be avoided? Is something wrong with my definition of the cube?
Did I miss anything in the documentation under help pm3d
or help pm3d algorithm
or help pm3d color_assignment
? Am I using a too old gnuplot version (5.2.8) or "wrong" terminal (wxt)?
Code:
### 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
Result:
Upvotes: 1
Views: 120
Reputation: 15093
Multiple things are happening here
Initially I thought that part of what you are seeing is evidence that the compositing operation of the graphics rendering in whichever terminal you are using is non-transitive. However I think that most or all of the effect can be explained without this.
(background ∘ 0.3red) ∘ 0.3red ?=? background ∘ (0.3red ∘ 0.3red)
One key is that your "cube" is not really a cube; it is missing 2 faces. Differential effect of the view angle is much more obvious if you draw them as polygons:
unset pm3d
splot $Cube u 1:2:3 w polygons
Because you are using with pm3d
, the program is trying to interpret the vertices as a set of scan lines defining a surface. This doesn't really work. I am not entirely sure what it ends up with but I suspect some of the areas are drawn twice. You can get a feel for what is going wrong here by drawing it again with
set pm3d interpolate 2,2
If you add the missing two faces of the cube and draw the faces with polygons
the effect disappears entirely.
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
Upvotes: 2