Bootstrap

写ply文件

官网参考文档:plyfile — plyfile documentation

第一步是将数据转换为 numpy 结构数组

请注意有一些限制:一般来说,如果你知道 PLY 文件元素可以包含的属性类型,你就可以很容易地推断出这些限制。例如,PLY 文件不包含 64 位整数或复杂数据,因此不允许使用这些数据。

为方便起见,允许使用非标量字段,并将其序列化为列表属性。例如,在构建 "面 "元素时,如果所有的面都是三角形(这种情况很常见),那么 "vertex_indices "字段的类型可以是 "i4 "和形状(3,),而不是对象类型和形状()。不过,如果使用 plyfile 回读序列化的 PLY 文件,"vertex_indices "属性将被表示为对象类型的字段,其每个值都是类型为 "i4"、长度为 3 的数组。 原因很简单,PLY 格式无法在不实际读取所有数据的情况下找出每个 "vertex_indices "字段的长度都是 3,因此 plyfile 必须假定这是一个长度可变的属性。不过,从列表属性中恢复二维数组的简便方法请参见常见问题,也请参见上文关于 known_list_len 参数的说明,以加快读取具有固定已知长度列表的文件。

例如,如果我们想将 tet.ply 数据中的 "顶点 "和 "面 "PLY 元素直接创建为 numpy 数组,以便进行序列化,我们可以这样做:

>>> vertex = numpy.array([(0, 0, 0),
...                       (0, 1, 1),
...                       (1, 0, 1),
...                       (1, 1, 0)],
...                      dtype=[('x', 'f4'), ('y', 'f4'),
...                             ('z', 'f4')])
>>> face = numpy.array([([0, 1, 2], 255, 255, 255),
...                     ([0, 2, 3], 255,   0,   0),
...                     ([0, 1, 3],   0, 255,   0),
...                     ([1, 2, 3],   0,   0, 255)],
...                    dtype=[('vertex_indices', 'i4', (3,)),
...                           ('red', 'u1'), ('green', 'u1'),
...                           ('blue', 'u1')])
>>>

创建PlyElement 实例

有了适当结构的数组后,使用静态方法 PlyElement.describe 来创建必要的 PlyElement 实例:

>>> el = PlyElement.describe(vertex, 'vertex')
>>>

或者

>>> el = PlyElement.describe(vertex, 'vertex',
...                          comments=['comment1',
...                                    'comment2'])
>>>

请注意,无需明确创建 PlyProperty 实例。这一切都是通过检查 some_array.dtype.descr 在幕后完成的。这里的一个小插曲是,numpy 数组(即我们对 PLY 列表属性的表示)中的可变长度字段必须具有对象类型,因此序列化 PLY 文件中列表长度和值的类型不能仅从数组的 dtype 属性中获取。为简化和可预测性起见,长度默认为 8 位无符号整数,值默认为 32 位有符号整数,这涵盖了大多数使用情况。例外情况必须明确说明:

>>> el = PlyElement.describe(face, 'face',
...                          val_types={'vertex_indices': 'u2'},
...                          len_types={'vertex_indices': 'u4'})
>>>

实例化 PlyData 并进行序列化

现在,您可以实例化 PlyData 并进行序列化:

>>> PlyData([el]).write('some_binary.ply')
>>> PlyData([el], text=True).write('some_ascii.ply')
>>>
>>> # Force the byte order of the output to big-endian, independently of
>>> # the machine's native byte order
>>> PlyData([el],
...         byte_order='>').write('some_big_endian_binary.ply')
>>>
>>> # Use a file object. Binary mode is used here, which will cause
>>> # Unix-style line endings to be written on all systems.
>>> with open('some_ascii.ply', mode='wb') as f:
...     PlyData([el], text=True).write(f)
>>>

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;