如何在Gnuplot中隐藏3D对象后方的标签?
如何在Gnuplot动画中隐藏球体后方的顶点标签?
你的Gnuplot代码当前存在一个关键问题:顶点标签使用了graph坐标系(屏幕相对坐标),这意味着无论3D视角如何旋转,标签都会固定在屏幕的某个位置,不会随顶点移动。要实现“顶点转到球体后方时隐藏标签”的效果,需要做以下两步修改:
1. 将标签绑定到实际3D顶点坐标
首先把标签的at graph ...替换为对应顶点的真实3D坐标(从数据文件r1.dat中提取四个顶点),让标签跟随顶点移动:
# 替换原标签设置代码 set label 1 "1" at .2911,.6589,-.6936 center front set label 2 "2" at -.5808,-.6952,-.4236 center front set label 3 "3" at -.5144,.4738,.7147 center front set label 4 "4" at .8041,-.4375,.4025 center front
2. 在动画循环中动态判断并控制标签显示
在每次视角旋转时,计算顶点2经过当前视角旋转后的深度坐标,判断其是否处于球体后方(相对于观察者),动态设置或隐藏标签2:
修改后的完整代码
set terminal aqua size 500 500 font "Helvetica,20" set style circle; set style fill solid set xrange [-1:1]; set yrange [-1:1]; set zrange [-1:1] set size ratio -1 set parametric; set isosamples 31,61; set hidden3d set urange [-pi/2:pi/2]; set vrange [0:2*pi] unset border; unset xtics; unset ytics; unset ztics rot_x=90; rot_z=90; scale=1.5; scale_z=1 set view rot_x, rot_z, scale, scale_z # 绑定标签到真实3D顶点坐标 set label 1 "1" at .2911,.6589,-.6936 center front set label 3 "3" at -.5144,.4738,.7147 center front set label 4 "4" at .8041,-.4375,.4025 center front # 动画循环:动态控制标签2的显示 do for [i=90:180] { set view 75, i phi = 75*pi/180 # 视角的仰角 theta = i*pi/180 # 视角的方位角 # 顶点2的原始坐标 x0 = -.5808; y0 = -.6952; z0 = -.4236 # 计算经过视角旋转后的深度坐标z2 y1 = y0*cos(phi) - z0*sin(phi) z1 = y0*sin(phi) + z0*cos(phi) # 绕z轴旋转不改变z坐标,最终深度为z1 z2 = z1 # 判断:若顶点在观察者后方(z2<0)则隐藏标签,否则显示 if (z2 < 0) { unset label 2 } else { set label 2 "2" at x0,y0,z0 center front } r=0.577 splot r*cos(u)*cos(v),r*cos(u)*sin(v),r*sin(u) t "" w l lw 0.5 lc rgb "blue", "r1.dat" u 1:2:3:(0.01) t "" with circles, "" u 1:2:3 t "" w l lc rgb "red" }
原理说明
- 标签绑定到3D坐标后,会随顶点一起在视角旋转时改变屏幕位置。
- 通过旋转矩阵计算顶点经过视角变换后的深度值
z2:当z2<0时,说明顶点处于观察者的视野后方(相对于球体中心),此时取消标签2;当z2≥0时,重新显示标签2。
内容的提问来源于stack exchange,提问作者Ronpac
相关产品推荐
相关产品推荐

