Mayavi的mlab.mesh中的x、y、z坐标如何定义?

3
我正在尝试创建一个3D盒子,它将出现在Mayavi mlab.points3d图中。
我想这应该可以使用mlab.mesh函数实现,类似于以下内容:
points = mlab.points3d(xp,yp,zp,sp)
3Dbox = mlab.mesh(xbox,ybox,zbox)
mlab.show()

我查看了mesh的mlab手册条目,但是我无论如何都不理解网格的x、y、z数据点是如何定义的。
请问有人能为我解惑吗?特别感谢提供一个3D盒子的x、y、z数据点示例。
1个回答

9
您可以将其看作是三维数组在x、y和z轴上的拆分。每个矩阵索引都将描述一个坐标,该坐标的每个点都将与其相邻点连接。因此,您可以通过定义6个平面来制作您的框:
import numpy
import mayavi.mlab


#             pt1_ _ _ _ _ _ _ _ _pt2
#              /|                 /|
#             / |                / |
#         pt3/_ | _ _ _ _ _ _pt4/  |
#           |   |              |   |
#           |   |              |   |
#           |  pt5_ _ _ _ _ _ _|_ _|pt6
#           |  /               |  /
#           | /                | /
#        pt7|/_ _ _ _ _ _ _ _ _|/pt8

# Where :
x1, y1, z1 = (0, 1, 1)  # | => pt1
x2, y2, z2 = (1, 1, 1)  # | => pt2
x3, y3, z3 = (0, 0, 1)  # | => pt3
x4, y4, z4 = (1, 0, 1)  # | => pt4
x5, y5, z5 = (0, 1, 0)  # | => pt5
x6, y6, z6 = (1, 1, 0)  # | => pt6
x7, y7, z7 = (0, 0, 0)  # | => pt7
x8, y8, z8 = (1, 0, 0)  # | => pt8


box_points = numpy.array([[x1, y1, z1], [x2, y2, z2], [x3, y3, z3],
                          [x4, y4, z4], [x5, y5, z5], [x6, y6, z6],
                          [x7, y7, z7], [x8, y8, z8]])

mayavi.mlab.points3d(box_points[:, 0], box_points[:, 1], box_points[:, 2],
                     mode="axes", color=(1, 0, 0))


mayavi.mlab.mesh([[x1, x2],
                  [x3, x4]],  # | => x coordinate

                 [[y1, y2],
                  [y3, y4]],  # | => y coordinate

                 [[z1, z2],
                  [z3, z4]],  # | => z coordinate

                 color=(0, 0, 0))  # black

# Where each point will be connected with this neighbors :
# (link = -)
#
# x1 - x2     y1 - y2     z1 - z2 | =>  pt1 - pt2
# -    -  and  -   -  and -    -  | =>   -     -
# x3 - x4     y3 - y4     z3 - z4 | =>  pt3 - pt4


mayavi.mlab.mesh([[x5, x6], [x7, x8]],
                 [[y5, y6], [y7, y8]],
                 [[z5, z6], [z7, z8]],
                 color=(1, 0, 0))  # red

mayavi.mlab.mesh([[x1, x3], [x5, x7]],
                 [[y1, y3], [y5, y7]],
                 [[z1, z3], [z5, z7]],
                 color=(0, 0, 1))  # blue

mayavi.mlab.mesh([[x1, x2], [x5, x6]],
                 [[y1, y2], [y5, y6]],
                 [[z1, z2], [z5, z6]],
                 color=(1, 1, 0))  # yellow

mayavi.mlab.mesh([[x2, x4], [x6, x8]],
                 [[y2, y4], [y6, y8]],
                 [[z2, z4], [z6, z8]],
                 color=(1, 1, 1))  # white

mayavi.mlab.mesh([[x3, x4], [x7, x8]],
                 [[y3, y4], [y7, y8]],
                 [[z3, z4], [z7, z8]],
                 color=(1, 0, 1))  # pink

mayavi.mlab.show()

在这里输入图片描述

另外,您还可以使用两个 mayavi.mlab.mesh 调用来显示更多的面。

# Define 2 mesh objects with 3 planes connected among themselves :
#
# pt1 - pt2 - pt6        pt8 - pt6 - pt2
#  -     -     -          -     -     -
# pt3 - pt4 - pt8   AND  pt7   pt5 - pt1
#  -     -     -          -     -     -
# pt7 - pt8 - pt8        pt3 - pt1 - pt1

mayavi.mlab.figure()
mayavi.mlab.mesh([[x1, x2, x6], [x3, x4, x8], [x7, x8, x8]],
                 [[y1, y2, y6], [y3, y4, y8], [y7, y8, y8]],
                 [[z1, z2, z6], [z3, z4, z8], [z7, z8, z8]],
                 color=(1, 0, 0))  # red

mayavi.mlab.mesh([[x8, x6, x2], [x7, x5, x1], [x3, x1, x1]],
                 [[y8, y6, y2], [y7, y5, y1], [y3, y1, y1]],
                 [[z8, z6, z2], [z7, z5, z1], [z3, z1, z1]],
                 color=(0, 0, 1))  # blue

mayavi.mlab.show()

通过调用 mayavi.mlab.mesh 函数:

enter image description here

# Merge previous mesh objects in single one:
#
# pt1 - pt2 - pt6             | => pt1 - pt2 - pt6 - pt6 - pt6
#  -     -     -              | =>  -     -     -     -     -
# pt3 - pt4 - pt8             | => pt3 - pt4 - pt8 - pt6 - pt2
#  -     -     -              | =>  -     -     -     -     -
# pt7 - pt8 - pt8 - pt6 - pt2 | => pt7 - pt8 - pt8 - pt6 - pt2
#              -     -    -   | =>  -     -      -     -    -
#             pt7   pt5 - pt1 | => pt7 - pt7 - pt7   pt5 - pt1
#              -     -     -  | =>  -     -     -     -     -
#             pt3 - pt1 - pt1 | => pt7 - pt3 - pt3 - pt1 - pt1


mayavi.mlab.figure()
mayavi.mlab.mesh([[x1, x2, x6, x6, x6],
                  [x3, x4, x8, x6, x2],
                  [x7, x8, x8, x6, x2],
                  [x7, x7, x7, x5, x1],
                  [x7, x3, x3, x1, x1]],

                 [[y1, y2, y6, y6, y6],
                  [y3, y4, y8, y6, y2],
                  [y7, y8, y8, y6, y2],
                  [y7, y7, y7, y5, y1],
                  [y7, y3, y3, y1, y1]],

                 [[z1, z2, z6, z6, z6],
                  [z3, z4, z8, z6, z2],
                  [z7, z8, z8, z6, z2],
                  [z7, z7, z7, z5, z1],
                  [z7, z3, z3, z1, z1]])

mayavi.mlab.show()

enter image description here


非常感谢您的示例Geodor,但我仍然不太理解mlab.mesh用于定义立方体中每个平面的约定,例如mayavi.mlab.mesh([[0,1],[0,1]],[[0,0],[1,1]],[[1,1],[1,1]])。例如,第一个列表[[0,1],[0,1]]代表什么? - dreme
嘿,Geodor,感谢你详细解答我的问题。我非常感激你所付出的努力,并且现在我认为我已经理解了。从你上面的例子中,我看到你可以通过使x3 = x4来创建一个三角形,例如:mayavi.mlab.mesh([[0, 1], [0.5, 0.5]], [[0, 0], [1, 1]], [[1, 1], [1, 1]]) - dreme
嗨,谢谢,很高兴能帮助到你。你是对的,你也可以制作一个三角形,因为你为两个点定义了相同的坐标。mayavi.mlab.mesh([[0, 1], [0.5, 0.5], [0, 1]], [[0, 0], [1, 1], [2, 2]], [[1, 1], [1, 1], [1, 1]]) - Geodor
再次感谢Geodor,非常好的回答。将这些材料纳入mayavi文档中将非常有益,因为该主题的文档相对较少。 - dreme

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