【问题标题】:How are x,y,z coordinates defined for Mayavi's mlab.mesh?如何为 Mayavi 的 mlab.mesh 定义 x,y,z 坐标?
【发布时间】:2016-06-16 02:46:12
【问题描述】:

我正在尝试创建一个将出现在 Mayavi mlab.points3d 图中的 3D 框。

我认为这应该可以使用 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 数据点示例。

【问题讨论】:

    标签: enthought mayavi


    【解决方案1】:

    您可以看到 3D 数组拆分为 x、y 和 z 轴的 3 个矩阵。每个矩阵索引将描述一个坐标,并且该坐标的每个点都将与该邻居相连。所以你可以先定义 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()
    

    否则,您还可以通过一个呼叫让在移动中显示更多面孔的网格。 两次调用 ma​​yavi.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()
    

    只需调用一次 ma​​yavi.mlab.mesh

    # 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()
    

    【讨论】:

    • 非常感谢您的示例 Geodor,但我仍然不太了解 mlab.mesh 用于定义立方体中六个平面中的每一个的约定,例如mayavi.mlab.mesh([[0, 1], [0, 1]], [[0, 0], [1, 1]], [[1, 1], [1, 1]])。例如,第一个列表 [[0, 1], [0, 1]] 表示什么?
    • 嘿 Geodor,感谢您详细说明您的答案。我真的很感激你投入的细节,我想我现在明白了。从上面的示例中,我看到您可以通过使 x3 = x4 创建一个三角形,例如mayavi.mlab.mesh([[0, 1], [0.5, 0.5]], [[0, 0], [1, 1]], [[1, 1], [1, 1]])跨度>
    • 嗨,谢谢,很高兴我能帮上忙。你是对的,你也可以制作一个三角形,因为你为两个点定义了相同的坐标。 mayavi.mlab.mesh([[0, 1], [0.5, 0.5], [0, 1]], [[0, 0], [1, 1], [2, 2]], [[1, 1], [1, 1], [1, 1]])
    • 再次感谢Geodor,很好的回应。将这些材料合并到关于这个主题的非常薄的 mayavi 文档中会非常好
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    • 2022-12-10
    • 2019-04-10
    • 1970-01-01
    • 2019-05-15
    • 1970-01-01
    相关资源
    最近更新 更多