Gnuplot:尊重Gnuplot 3D多边形的深度顺序

7
我有一个完整城市的3D模型,想展示那些建筑物的等距视图。我使用gnuplot多边形来完成这个任务,因为我认为对于坐标不在一个明确定义网格上的多边形,我不能使用pm3d。这些多边形的颜色与它们获得的平均太阳辐射量相对应。我还将地面多边形显示为线框图,主要是为了自动设置xrange、yrange和zrange。

从远处看起来还好,但当你放大时,你会发现一些多边形的深度顺序是错误的。

这是导入到SketchUp中的CityGML模型: enter image description here

这是Gnuplot输出的结果: enter image description here

您有任何想法如何正确显示这些多边形吗?

这样的东西很棒,但似乎只适用于splot

这是一个Gnuplot文件,可以看到问题(2个建筑物和4个屋顶):

set style line 1 linecolor rgbcolor "#777777" linewidth 1
set style increment user
set palette file "-"
0.00000 0.23137 0.22353 0.64314
0.17990 0.47843 0.34510 0.71765
0.32010 0.34902 0.17647 0.55686
0.43990 0.40784 0.10980 0.36471
0.59010 0.46275 0.09020 0.16863
0.78000 0.86667 0.41569 0.24314
0.92990 0.92549 0.66667 0.33725
1.00000 0.97647 0.91765 0.82745
e
set cbrange [50:150]
set cbtics 25
set format cb "%.0f W/m²"
unset xtics
unset ytics
unset ztics
unset border
set colorbox

kzoom=1.0
phi=30.0
theta=60.0
set xyplane 0       # removes the offset of the xy plane
set view equal xyz  # force equal units to all three axes
set view theta,phi,kzoom

set object 1 polygon from \
2.0,0.0,3.0 to \
3.0,0.0,3.5 to \
3.0,2.0,3.5 to \
2.0,2.0,3.0 to \
2.0,0.0,3.0
set object 1 fill solid 0.9 border lw 2 fc palette cb 128.1315 front

set object 2 polygon from \
4.0,0.0,3.0 to \
4.0,2.0,3.0 to \
3.0,2.0,3.5 to \
3.0,0.0,3.5 to \
4.0,0.0,3.0
set object 2 fill solid 0.9 border lw 2 fc palette cb 128.62192 front

set object 3 polygon from \
2.0,0.0,0.0 to \
4.0,0.0,0.0 to \
4.0,0.0,3.0 to \
3.0,0.0,3.5 to \
2.0,0.0,3.0 to \
2.0,0.0,0.0
set object 3 fill solid 0.9 border lw 2 fc palette cb 100.545204

set object 4 polygon from \
4.0,0.0,0.0 to \
4.0,2.0,0.0 to \
4.0,2.0,3.0 to \
4.0,0.0,3.0 to \
4.0,0.0,0.0
set object 4 fill solid 0.9 border lw 2 fc palette cb 85.58082

set object 5 polygon from \
4.0,2.0,0.0 to \
2.0,2.0,0.0 to \
2.0,2.0,3.0 to \
3.0,2.0,3.5 to \
4.0,2.0,3.0 to \
4.0,2.0,0.0
set object 5 fill solid 0.9 border lw 2 fc palette cb 55.88219

set object 6 polygon from \
2.0,2.0,0.0 to \
2.0,0.0,0.0 to \
2.0,0.0,3.0 to \
2.0,2.0,0.0
set object 6 fill solid 0.9 border lw 2 fc palette cb 85.25754

set object 7 polygon from \
2.0,2.0,0.0 to \
2.0,0.0,3.0 to \
2.0,2.0,3.0 to \
2.0,2.0,0.0
set object 7 fill solid 0.9 border lw 2 fc palette cb 85.25754

set object 8 polygon from \
0.0,0.0,3.0 to \
1.0,0.0,3.5 to \
1.0,2.0,3.5 to \
0.0,2.0,3.0 to \
0.0,0.0,3.0
set object 8 fill solid 0.9 border lw 2 fc palette cb 128.1315 front

set object 9 polygon from \
2.0,0.0,3.0 to \
2.0,2.0,3.0 to \
1.0,2.0,3.5 to \
1.0,0.0,3.5 to \
2.0,0.0,3.0
set object 9 fill solid 0.9 border lw 2 fc palette cb 128.62192 front

set object 10 polygon from \
0.0,0.0,0.0 to \
2.0,0.0,0.0 to \
2.0,0.0,3.0 to \
1.0,0.0,3.5 to \
0.0,0.0,3.0 to \
0.0,0.0,0.0
set object 10 fill solid 0.9 border lw 2 fc palette cb 100.545204

set object 11 polygon from \
2.0,0.0,0.0 to \
2.0,2.0,0.0 to \
2.0,2.0,3.0 to \
2.0,0.0,3.0 to \
2.0,0.0,0.0
set object 11 fill solid 0.9 border lw 2 fc palette cb 85.58082

set object 12 polygon from \
2.0,2.0,0.0 to \
0.0,2.0,0.0 to \
0.0,2.0,3.0 to \
1.0,2.0,3.5 to \
2.0,2.0,3.0 to \
2.0,2.0,0.0
set object 12 fill solid 0.9 border lw 2 fc palette cb 55.88219

set object 13 polygon from \
0.0,2.0,0.0 to \
0.0,0.0,0.0 to \
0.0,0.0,3.0 to \
0.0,2.0,0.0
set object 13 fill solid 0.9 border lw 2 fc palette cb 85.25754

set object 14 polygon from \
0.0,2.0,0.0 to \
0.0,0.0,3.0 to \
0.0,2.0,3.0 to \
0.0,2.0,0.0
set object 14 fill solid 0.9 border lw 2 fc palette cb 85.25754

splot "-" with lines notitle ls 1, NaN notitle palette
2.0 0.0 0.0
2.0 2.0 0.0
4.0 2.0 0.0
4.0 0.0 0.0
2.0 0.0 0.0

0.0 0.0 0.0
0.0 2.0 0.0
2.0 2.0 0.0
2.0 0.0 0.0
0.0 0.0 0.0
e

pause mouse

感谢您的关注!

1
正确的三维物体分割/遮挡是一个难题,大多数图形软件没有实现它,除非它们有OpenGL(也许是Vulkan?)后端 :-( https://stackoverflow.com/questions/52923540/matplotlib-3d-workaround-for-plot-order - Ciro Santilli OurBigBook.com
1
首先想到的是将其转换为一个众所周知的3D格式,并使用某些现有的该格式渲染器(可能使用OpenGL/Vulkan)。例如,https://github.com/SaschaWillems/Vulkan/blob/846413cc4bbaec6250d0f73a73a6d217bbd7dc61/examples/offscreen/offscreen.cpp#L408通过一个小型的内部解析器函数将glTF渲染到屏幕上,以及 https://dev59.com/gnA75IYBdhLWcg3wo6le#14324292 vulkan session展示了如何保存到文件。STL是另一个要考虑的3D格式。 glTF基于JSON,这使得事情变得更容易。 - Ciro Santilli OurBigBook.com
1
今天遇到了一个可能不错的特定渲染:https://www.reddit.com/r/opensource/comments/kslren/f3d_110_released_with_animation_support/ - Ciro Santilli OurBigBook.com
3个回答

3
我找不到一个选项来让gnuplot自动设置多边形对象的深度顺序。我唯一找到的方法是预先以正确的顺序定义对象。然后gnuplot会在前一个对象的上方绘制每个对象,从而得到预期的结果。
在删除front说明符后,使用您的示例多边形,这种方法会改变原始图片,如下所示:

enter image description here

转化为这个(删除 front 后):

enter image description here

到了这一个(排序后):

enter image description here

我认为第三张图片是你想要的。

我使用了一个Python脚本来对多边形进行排序,基本上做了以下几点:

  • 从文件“poly_raw.dat”中读取所有多边形。该文件必须以set object x polygon from行开头。
  • 像gnuplot一样使用set view theta, phi,将多边形绕x和z轴旋转(暂时只用于排序)。
  • 根据新的y轴对多边形进行排序。这应该是垂直于屏幕的轴。
  • 更新gnuplot对象ID,即set object x polygon中的x
  • 打印排序后的多边形数据,包括set object行。

请注意,此方法仅适用于静态图片。如果您想要交互式旋转图片,则无法使用此方法。

还要注意,如果该方法对于您的完整数据文件不起作用,则可能是我搞乱了旋转矩阵或轴分配 :)

我附上了Python脚本、绘图文件和数据文件“plot_raw.dat”和“plot_sorted.dat”供参考。

# poly.py
from math import cos, sin, pi
from re import sub, match, findall

class Polygon:

   def __init__(self):

      self.firstLine = ""
      self.points = []
      self.lastLine = ""


   def __str__(self):

      pointStrings = [",".join(map(str,point)) for point in self.points]

      s = ""
      s += self.firstLine
      s += " to \\\n".join(pointStrings)
      s += "\n"
      s += self.lastLine

      return s


   def readObjectFromFile(self, f, firstObjectLine):
      self.firstLine = firstObjectLine
      line = f.readline()
      while not match("set",line):
         coordinates = findall("[\d.]+", line)
         coordinates = tuple(float(x) for x in coordinates)
         self.points.append(coordinates)
         line = f.readline()
      self.lastLine = line

      return self


   def meanAfterRotation(self, theta, phi):
      cx = 0.0
      cy = 0.0
      cz = 0.0

      theta = theta*pi/180.0
      phi = phi*pi/180.0

      for point in self.points:
         x,y,z = point
         x,y,z = (x, y*cos(theta) - z*sin(theta), y*sin(theta) + z*cos(theta))
         x,y,z = (x*cos(phi) - y*sin(phi), x*sin(phi) + y*cos(phi), z)
         cx, cy, cz = (cx + x, cy + y, cz + z)

      n = len(self.points)

      return (cx/n, cy/n, cz/n)


   def setPosition(self, posIndex):

      self.firstLine = sub("(\d+)", str(posIndex), self.firstLine, 1)
      self.lastLine = sub("(\d+)", str(posIndex), self.lastLine, 1)




polygons = []
with open("poly_raw.dat") as f:

    line = f.readline()
    while line:

       if line.strip() != "":
          polygons.append(Polygon().readObjectFromFile(f,line))

       line = f.readline()

polygons.sort(key = lambda x: x.meanAfterRotation(60,30)[1], reverse = True)
pos = 1
for p in polygons:
   p.setPosition(pos)
   pos += 1

for p in polygons:
   print(p)

gnuplot脚本:

# poly.plt, gnuplot 4.6
# Does not work when interactively rotating the picture.

set style line 1 linecolor rgbcolor "#777777" linewidth 1
set style increment user
set palette file "-"
0.00000 0.23137 0.22353 0.64314
0.17990 0.47843 0.34510 0.71765
0.32010 0.34902 0.17647 0.55686
0.43990 0.40784 0.10980 0.36471
0.59010 0.46275 0.09020 0.16863
0.78000 0.86667 0.41569 0.24314
0.92990 0.92549 0.66667 0.33725
1.00000 0.97647 0.91765 0.82745
e
set cbrange [50:150]
set cbtics 25
set format cb "%.0f W/m²"
unset xtics
unset ytics
unset ztics
unset border
set colorbox

kzoom=1.0
phi=30.0
theta=60.0
set xyplane 0       # removes the offset of the xy plane
set view equal xyz  # force equal units to all three axes
set view theta,phi,kzoom

#load "poly_raw.dat"
load "poly_sorted.dat"

set terminal png
#set output "raw.png"
set output "sorted.png"
splot "-" with lines notitle ls 1, NaN notitle palette
2.0 0.0 0.0
2.0 2.0 0.0
4.0 2.0 0.0
4.0 0.0 0.0
2.0 0.0 0.0

0.0 0.0 0.0
0.0 2.0 0.0
2.0 2.0 0.0
2.0 0.0 0.0
0.0 0.0 0.0
e

移除 front 标识后的未排序多边形数据:

set object 1 polygon from \
2.0,0.0,3.0 to \
3.0,0.0,3.5 to \
3.0,2.0,3.5 to \
2.0,2.0,3.0 to \
2.0,0.0,3.0
set object 1 fill solid 0.9 border lw 2 fc palette cb 128.1315

set object 2 polygon from \
4.0,0.0,3.0 to \
4.0,2.0,3.0 to \
3.0,2.0,3.5 to \
3.0,0.0,3.5 to \
4.0,0.0,3.0
set object 2 fill solid 0.9 border lw 2 fc palette cb 128.62192

set object 3 polygon from \
2.0,0.0,0.0 to \
4.0,0.0,0.0 to \
4.0,0.0,3.0 to \
3.0,0.0,3.5 to \
2.0,0.0,3.0 to \
2.0,0.0,0.0
set object 3 fill solid 0.9 border lw 2 fc palette cb 100.545204

set object 4 polygon from \
4.0,0.0,0.0 to \
4.0,2.0,0.0 to \
4.0,2.0,3.0 to \
4.0,0.0,3.0 to \
4.0,0.0,0.0
set object 4 fill solid 0.9 border lw 2 fc palette cb 85.58082

set object 5 polygon from \
4.0,2.0,0.0 to \
2.0,2.0,0.0 to \
2.0,2.0,3.0 to \
3.0,2.0,3.5 to \
4.0,2.0,3.0 to \
4.0,2.0,0.0
set object 5 fill solid 0.9 border lw 2 fc palette cb 55.88219

set object 6 polygon from \
2.0,2.0,0.0 to \
2.0,0.0,0.0 to \
2.0,0.0,3.0 to \
2.0,2.0,0.0
set object 6 fill solid 0.9 border lw 2 fc palette cb 85.25754

set object 7 polygon from \
2.0,2.0,0.0 to \
2.0,0.0,3.0 to \
2.0,2.0,3.0 to \
2.0,2.0,0.0
set object 7 fill solid 0.9 border lw 2 fc palette cb 85.25754

set object 8 polygon from \
0.0,0.0,3.0 to \
1.0,0.0,3.5 to \
1.0,2.0,3.5 to \
0.0,2.0,3.0 to \
0.0,0.0,3.0
set object 8 fill solid 0.9 border lw 2 fc palette cb 128.1315

set object 9 polygon from \
2.0,0.0,3.0 to \
2.0,2.0,3.0 to \
1.0,2.0,3.5 to \
1.0,0.0,3.5 to \
2.0,0.0,3.0
set object 9 fill solid 0.9 border lw 2 fc palette cb 128.62192

set object 10 polygon from \
0.0,0.0,0.0 to \
2.0,0.0,0.0 to \
2.0,0.0,3.0 to \
1.0,0.0,3.5 to \
0.0,0.0,3.0 to \
0.0,0.0,0.0
set object 10 fill solid 0.9 border lw 2 fc palette cb 100.545204

set object 11 polygon from \
2.0,0.0,0.0 to \
2.0,2.0,0.0 to \
2.0,2.0,3.0 to \
2.0,0.0,3.0 to \
2.0,0.0,0.0
set object 11 fill solid 0.9 border lw 2 fc palette cb 85.58082

set object 12 polygon from \
2.0,2.0,0.0 to \
0.0,2.0,0.0 to \
0.0,2.0,3.0 to \
1.0,2.0,3.5 to \
2.0,2.0,3.0 to \
2.0,2.0,0.0
set object 12 fill solid 0.9 border lw 2 fc palette cb 55.88219

set object 13 polygon from \
0.0,2.0,0.0 to \
0.0,0.0,0.0 to \
0.0,0.0,3.0 to \
0.0,2.0,0.0
set object 13 fill solid 0.9 border lw 2 fc palette cb 85.25754

set object 14 polygon from \
0.0,2.0,0.0 to \
0.0,0.0,3.0 to \
0.0,2.0,3.0 to \
0.0,2.0,0.0
set object 14 fill solid 0.9 border lw 2 fc palette cb 85.25754

在运行 python poly.py > poly_sorted.dat 之后,数据将被排序。
set object 1 polygon from \
4.0,0.0,0.0 to \
4.0,2.0,0.0 to \
4.0,2.0,3.0 to \
4.0,0.0,3.0 to \
4.0,0.0,0.0
set object 1 fill solid 0.9 border lw 2 fc palette cb 85.58082

set object 2 polygon from \
4.0,2.0,0.0 to \
2.0,2.0,0.0 to \
2.0,2.0,3.0 to \
3.0,2.0,3.5 to \
4.0,2.0,3.0 to \
4.0,2.0,0.0
set object 2 fill solid 0.9 border lw 2 fc palette cb 55.88219

set object 3 polygon from \
2.0,2.0,0.0 to \
2.0,0.0,0.0 to \
2.0,0.0,3.0 to \
2.0,2.0,0.0
set object 3 fill solid 0.9 border lw 2 fc palette cb 85.25754

set object 4 polygon from \
2.0,2.0,0.0 to \
2.0,0.0,3.0 to \
2.0,2.0,3.0 to \
2.0,2.0,0.0
set object 4 fill solid 0.9 border lw 2 fc palette cb 85.25754

set object 5 polygon from \
2.0,0.0,0.0 to \
2.0,2.0,0.0 to \
2.0,2.0,3.0 to \
2.0,0.0,3.0 to \
2.0,0.0,0.0
set object 5 fill solid 0.9 border lw 2 fc palette cb 85.58082

set object 6 polygon from \
2.0,2.0,0.0 to \
0.0,2.0,0.0 to \
0.0,2.0,3.0 to \
1.0,2.0,3.5 to \
2.0,2.0,3.0 to \
2.0,2.0,0.0
set object 6 fill solid 0.9 border lw 2 fc palette cb 55.88219

set object 7 polygon from \
2.0,0.0,0.0 to \
4.0,0.0,0.0 to \
4.0,0.0,3.0 to \
3.0,0.0,3.5 to \
2.0,0.0,3.0 to \
2.0,0.0,0.0
set object 7 fill solid 0.9 border lw 2 fc palette cb 100.545204

set object 8 polygon from \
0.0,2.0,0.0 to \
0.0,0.0,0.0 to \
0.0,0.0,3.0 to \
0.0,2.0,0.0
set object 8 fill solid 0.9 border lw 2 fc palette cb 85.25754

set object 9 polygon from \
4.0,0.0,3.0 to \
4.0,2.0,3.0 to \
3.0,2.0,3.5 to \
3.0,0.0,3.5 to \
4.0,0.0,3.0
set object 9 fill solid 0.9 border lw 2 fc palette cb 128.62192

set object 10 polygon from \
0.0,2.0,0.0 to \
0.0,0.0,3.0 to \
0.0,2.0,3.0 to \
0.0,2.0,0.0
set object 10 fill solid 0.9 border lw 2 fc palette cb 85.25754

set object 11 polygon from \
0.0,0.0,0.0 to \
2.0,0.0,0.0 to \
2.0,0.0,3.0 to \
1.0,0.0,3.5 to \
0.0,0.0,3.0 to \
0.0,0.0,0.0
set object 11 fill solid 0.9 border lw 2 fc palette cb 100.545204

set object 12 polygon from \
2.0,0.0,3.0 to \
3.0,0.0,3.5 to \
3.0,2.0,3.5 to \
2.0,2.0,3.0 to \
2.0,0.0,3.0
set object 12 fill solid 0.9 border lw 2 fc palette cb 128.1315

set object 13 polygon from \
2.0,0.0,3.0 to \
2.0,2.0,3.0 to \
1.0,2.0,3.5 to \
1.0,0.0,3.5 to \
2.0,0.0,3.0
set object 13 fill solid 0.9 border lw 2 fc palette cb 128.62192

set object 14 polygon from \
0.0,0.0,3.0 to \
1.0,0.0,3.5 to \
1.0,2.0,3.5 to \
0.0,2.0,3.0 to \
0.0,0.0,3.0
set object 14 fill solid 0.9 border lw 2 fc palette cb 128.1315

gnuplot 5.4 的变化

似乎脚本在 gnuplot 5.4.1 版本和 4.6 版本之间产生了不同的输出:

  • 黑色建筑物
  • 多边形的黑色边框
  • 绘图未居中

以下是一些解决方法:

  • 黑色的建筑似乎是由于set object ...命令中的border lw 2部分引起的。如果我移除所有的border lw 2,颜色就会回来。

  • 不幸的是,现在多边形的边框仍然是黑色的。可以通过不完全删除border lw 2部分,而是将其替换为border lc palette cb 128.62192来改变这种情况,其中128.62192fc palette cb 128.62192部分中的数字相同。

    现在,完整的set object ...行如下:

    set object 2 fill solid 0.9 border lc palette cb 128.62192 fc palette cb 128.62192

  • 最后,在我的测试中,图形没有居中显示。我通过在splot命令之前添加以下内容来解决此问题:

    set origin -0.2, -0.3

    set size 1.2, 1.2


非常出色的工作和有趣的结果,谢谢。我很想知道是否有任何仅使用gnuplot的解决方案,可以适用于任何角度。感谢您的回答! - Eric Duminil
Gnuplot 5.4 损坏了我的旧脚本,每个建筑物都变黑了。在试图找到错误源头时,我发现 Gnuplot 5.4 添加了 "splot with polygons"。截图看起来很有前途。 - Eric Duminil
1
@EricDuminil 我可以确认使用gnuplot 5.4.1的黑色建筑物,并且我已经添加了一些解决方法的想法。但是,如果可以跳过排序步骤(我还没有检查),splot with polygons可能会更容易。 - maij
非常感谢。谢谢!我尝试了一下“用多边形绘制散点图”,3D渲染场景看起来非常好,而且我认为渲染速度也更快了。但是我没有找到如何给场景分配颜色的方法。我会尝试你的解决方法。 - Eric Duminil
从“使用多边形”文档中得知:由于pm3d代码的限制,set pm3d border中的单个边框线样式将应用于所有多边形。这个限制可能会在以后的gnuplot版本中被移除。这意味着,目前我的目标是拥有干净的三维多边形,并显示颜色信息已经受到了影响。 - Eric Duminil

2
我知道这是一个老问题,但现在有一个gnuplot设置,我认为可以实现所需的功能:"最初的回答"。
set pm3d depthorder base

这个算法将pm3d多边形投影到基础平面(通常为z=0),然后按照与视点的距离排序,达到排序目的。该算法旨在处理简单的情况,例如3D盒子,但你的模型足够接近盒子组合的形式,所以我认为同样的方法也能适用于它。以下是“boxes3d”演示的例子: enter image description here 注:pm3d是一种绘图方式,用于生成颜色丰富的三维图像。

谢谢,看起来很有前途。我会尝试测试它。需要Gnuplot 5.3开发吗? - Eric Duminil
2
我不确定。即使生成3D框的代码不存在,但“depthorder base”选项本身在5.2.5和5.2.6(当前稳定版本)中都有。但这并不意味着它经过了很多测试。因此,我认为它应该适用于您的目的,但我无法证明它是否有效。 - Ethan
我编译了最新的开发版本,直接从git仓库获取。不幸的是,它似乎对于多边形没有任何改进。但正如你的示例中所示,对3D盒子有效。无论如何,感谢您的答复,值得一试! - Eric Duminil

1
即使这是一个旧问题,我相信在这方面已经取得了一些进展。我使用 x-y-z 数据而不是多边形。通过以特定的顺序创建面,可以实现正确的 z-order。我使用了名为 house.dat 的数据文件。
0.0000   0.0000   0.0000
2.0000   0.0000   0.0000
2.0000   0.0000   3.0000
1.0001   0.0000   4.0000
0.9999   0.0000   4.0000
0.0000   0.0000   3.0000
0.0000   0.0000   0.0000

2.0000   0.0000   0.0000
2.0000   2.0000   0.0000
2.0000   2.0000   3.0000
1.0001   2.0000   4.0000
1.0001   0.0000   4.0000
2.0000   0.0000   3.0000
2.0000   0.0000   0.0000

2.0000   2.0000   0.0000
0.0000   2.0000   0.0000
0.0000   2.0000   3.0000
0.9999   2.0000   4.0000
1.0001   2.0000   4.0000
2.0000   2.0000   3.0000
2.0000   2.0000   0.0000

2.0000   0.0000   0.0000
0.0000   0.0000   0.0000
0.0000   0.0000   3.0000
0.9999   0.0000   4.0000
0.9999   2.0000   4.0000
0.0000   2.0000   3.0000
0.0000   2.0000   0.0000
2.0000   0.0000   0.0000

这个 gnuplot 脚本。
set terminal pngcairo font ',10'
set output "house.png"
set view equal xyz
set view ,,1.5
unset tics
set xyplane at 0
set pm3d depthorder lighting border lw 0.5
set grid ls -1 lc "gray"
set xrange [-1:5]
set yrange [-1:3]
set zrange [0:4]
set cbrange [0:4]
unset colorbox
unset key
unset border

set object polygon from \
    graph 0, 0, 0 to \
    graph 1, 0, 0 to \
    graph 1, 1, 0 to \
    graph 0, 1, 0 to \
    graph 0, 0, 0 fc rgb "dark-plum" fs transparent solid 0.50 noborder

splot \
    "house.dat" u   ($1):2:3:3 w pm3d ,\
    "house.dat" u ($1+2):2:3:3 w pm3d 

实现以下结果:

3D house

正式地说,它适用于任何角度:

3D house rotation


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接