如何避免 pm3d 表面遮挡它前面的其他物体?
How to avoid pm3d surface from occluding other objects which are infront of it?
我正在尝试绘制方程 x + y + 2z = 0 的简单线性曲面。这是我的文件:
set xrange [-4:4]
set yrange [-4:4]
set zrange [-4:4]
set xlabel 'x'
set ylabel 'y'
set zlabel 'z'
set xyplane at -4.0
unset xzeroaxis
unset yzeroaxis
unset zzeroaxis
set border 1023-128
set xtics out nomirror
set ytics out nomirror
set ztics out
set xtics add ('' -4)
set label 1 "{/:Italic x} + {/:Italic y} + 2{/:Italic z} = 0" at 4,4.2,-2 font 'Times New Roman, 11'
set arrow 1 from 0,0,-4 to 0,0,4 filled
set arrow 2 from 0,-4,0 to 0,4,0 filled
set arrow 3 from -4,0,0 to 4,0,0 filled
set arrow 4 from 3.9,4.1,-2.1 to 3.6,3.6,-2.5
unset key
set pm3d lighting primary 0.5 specular 0.6
set style fill transparent solid 1 noborder
set palette defined (0 "cyan", 1 "green")
unset colorbox
set pm3d depthorder
splot -x/2-y/2 with pm3d
The result
我使用箭头来显示轴,因为它们似乎粘在 xy 平面上,移动它会导致抽动和边界出现更多问题。但现在的问题是它们完全被表面遮挡了。是否有设置可以让他们“刺穿”表面时出现在前面?我想使表面半透明,但这些设置的问题更清楚。
gnuplot> help layer
A gnuplot plot is built up by drawing its various components in a fixed order.
This order can be modified by assigning some components to a specific layer
using the keywords `behind`, `back`, or `front`. For example, to replace the
background color of the plot area you could define a colored rectangle with the
attribute `behind`.
set object 1 rectangle from graph 0,0 to graph 1,1 fc rgb "gray" behind
The order of drawing is
behind
back
the plot itself
the plot legend (`key`)
front
Within each layer elements are drawn in the order
grid, axis, and border elements
pixmaps in numerical order
所以基本上你需要给你想要出现在剧情前面的对象添加“front”属性。
我猜你原来的想法,即用箭头或线“刺穿”3D 表面在 gnuplot 中不会立即起作用,因为 gnuplot 不会自动计算刺穿点。如果我错了,请纠正我,如果有一个简单的解决方案,请告诉我。
正如您在简单案例中所做的那样,您可以只在原点处拆分箭头,因为您已经知道穿刺点。但是,如果表面不规则或有多个穿孔点怎么办?
解决方案:努力创建一个分段的 3D 箭头,让 gnuplot 根据需要自动显示和隐藏表面。这可能接近您的想法。但是,当您想要更改箭头的颜色时,此解决方案会显示出意外。所以,还有改进的空间。
代码:(简单版本,箭头仅沿 x、y、z 轴)
### arrows "piercing" a 3D surface
reset session
set view equal xyz
set xyplane relative 0.0
set xrange [-4:4]
set yrange [-4:4]
set zrange [-4:4]
# create 3D arrow
r = 0.01 # radius of arrow
rHead = 0.1 # radius of arrrowhead
n = 6 # corners of arrow
set print $myArrow
do for [h=-100:90] {
do for [a=360/n:360:360/n] {
print sprintf("%g %g %g",r*cos(a),r*sin(a), h/100.)
}
print ""
}
do for [h=90:100] {
do for [a=360/n:360:360/n] {
print sprintf("%g %g %g",rHead*(100-h)/10.*cos(a), \
rHead*(100-h)/10.*sin(a), h/100.)
}
print ""
}
set print
unset key
unset colorbox
set pm3d depthorder
set samples 100
set isosamples 100
set view 65,46,1.3
# function to demonstrate "piercing"
f(x,y) = (sin(x*3)/x + sin(y*3)/y - 3)/2
splot \
f(x,y) w pm3d, \
$myArrow u 1:2:(*4):(0) w pm3d lc rgb var, \
$myArrow u 2:(*4):1:(0) w pm3d lc rgb var, \
$myArrow u (*4):1:2:(0) w pm3d lc rgb var
### end of code
结果:
我正在尝试绘制方程 x + y + 2z = 0 的简单线性曲面。这是我的文件:
set xrange [-4:4]
set yrange [-4:4]
set zrange [-4:4]
set xlabel 'x'
set ylabel 'y'
set zlabel 'z'
set xyplane at -4.0
unset xzeroaxis
unset yzeroaxis
unset zzeroaxis
set border 1023-128
set xtics out nomirror
set ytics out nomirror
set ztics out
set xtics add ('' -4)
set label 1 "{/:Italic x} + {/:Italic y} + 2{/:Italic z} = 0" at 4,4.2,-2 font 'Times New Roman, 11'
set arrow 1 from 0,0,-4 to 0,0,4 filled
set arrow 2 from 0,-4,0 to 0,4,0 filled
set arrow 3 from -4,0,0 to 4,0,0 filled
set arrow 4 from 3.9,4.1,-2.1 to 3.6,3.6,-2.5
unset key
set pm3d lighting primary 0.5 specular 0.6
set style fill transparent solid 1 noborder
set palette defined (0 "cyan", 1 "green")
unset colorbox
set pm3d depthorder
splot -x/2-y/2 with pm3d
The result
我使用箭头来显示轴,因为它们似乎粘在 xy 平面上,移动它会导致抽动和边界出现更多问题。但现在的问题是它们完全被表面遮挡了。是否有设置可以让他们“刺穿”表面时出现在前面?我想使表面半透明,但这些设置的问题更清楚。
gnuplot> help layer
A gnuplot plot is built up by drawing its various components in a fixed order.
This order can be modified by assigning some components to a specific layer
using the keywords `behind`, `back`, or `front`. For example, to replace the
background color of the plot area you could define a colored rectangle with the
attribute `behind`.
set object 1 rectangle from graph 0,0 to graph 1,1 fc rgb "gray" behind
The order of drawing is
behind
back
the plot itself
the plot legend (`key`)
front
Within each layer elements are drawn in the order
grid, axis, and border elements
pixmaps in numerical order
所以基本上你需要给你想要出现在剧情前面的对象添加“front”属性。
我猜你原来的想法,即用箭头或线“刺穿”3D 表面在 gnuplot 中不会立即起作用,因为 gnuplot 不会自动计算刺穿点。如果我错了,请纠正我,如果有一个简单的解决方案,请告诉我。
正如您在简单案例中所做的那样,您可以只在原点处拆分箭头,因为您已经知道穿刺点。但是,如果表面不规则或有多个穿孔点怎么办?
解决方案:努力创建一个分段的 3D 箭头,让 gnuplot 根据需要自动显示和隐藏表面。这可能接近您的想法。但是,当您想要更改箭头的颜色时,此解决方案会显示出意外。所以,还有改进的空间。
代码:(简单版本,箭头仅沿 x、y、z 轴)
### arrows "piercing" a 3D surface
reset session
set view equal xyz
set xyplane relative 0.0
set xrange [-4:4]
set yrange [-4:4]
set zrange [-4:4]
# create 3D arrow
r = 0.01 # radius of arrow
rHead = 0.1 # radius of arrrowhead
n = 6 # corners of arrow
set print $myArrow
do for [h=-100:90] {
do for [a=360/n:360:360/n] {
print sprintf("%g %g %g",r*cos(a),r*sin(a), h/100.)
}
print ""
}
do for [h=90:100] {
do for [a=360/n:360:360/n] {
print sprintf("%g %g %g",rHead*(100-h)/10.*cos(a), \
rHead*(100-h)/10.*sin(a), h/100.)
}
print ""
}
set print
unset key
unset colorbox
set pm3d depthorder
set samples 100
set isosamples 100
set view 65,46,1.3
# function to demonstrate "piercing"
f(x,y) = (sin(x*3)/x + sin(y*3)/y - 3)/2
splot \
f(x,y) w pm3d, \
$myArrow u 1:2:(*4):(0) w pm3d lc rgb var, \
$myArrow u 2:(*4):1:(0) w pm3d lc rgb var, \
$myArrow u (*4):1:2:(0) w pm3d lc rgb var
### end of code
结果: