mirror of
https://github.com/facebookresearch/pytorch3d.git
synced 2025-08-02 20:02:49 +08:00
Fix save_ply with noncontiguous faces
Summary: As noted in #710, save_ply was failing with some values of the faces tensor. It was assuming the faces were contiguous in using view() to change them. Here we avoid doing that. Reviewed By: patricklabatut Differential Revision: D29159655 fbshipit-source-id: 47214a7ce915bab8d81f109c2b97cde464fd57d8
This commit is contained in:
parent
8006842f2a
commit
354a1808ff
@ -1154,9 +1154,14 @@ def _save_ply(
|
|||||||
if ascii:
|
if ascii:
|
||||||
np.savetxt(f, faces_array, "3 %d %d %d")
|
np.savetxt(f, faces_array, "3 %d %d %d")
|
||||||
else:
|
else:
|
||||||
# rows are 13 bytes: a one-byte 3 followed by three four-byte face indices.
|
faces_recs = np.zeros(
|
||||||
faces_uints = np.full((len(faces_array), 13), 3, dtype=np.uint8)
|
len(faces_array),
|
||||||
faces_uints[:, 1:] = faces_array.astype(np.uint32).view(np.uint8)
|
dtype=[("count", np.uint8), ("vertex_indices", np.uint32, 3)],
|
||||||
|
)
|
||||||
|
faces_recs["count"] = 3
|
||||||
|
faces_recs["vertex_indices"] = faces_array
|
||||||
|
faces_uints = faces_recs.view(np.uint8)
|
||||||
|
|
||||||
if isinstance(f, BytesIO):
|
if isinstance(f, BytesIO):
|
||||||
f.write(faces_uints.tobytes())
|
f.write(faces_uints.tobytes())
|
||||||
else:
|
else:
|
||||||
|
@ -353,6 +353,11 @@ class TestMeshPlyIO(TestCaseMixin, unittest.TestCase):
|
|||||||
save_ply(file, verts=verts, faces=faces, verts_normals=normals)
|
save_ply(file, verts=verts, faces=faces, verts_normals=normals)
|
||||||
file.close()
|
file.close()
|
||||||
|
|
||||||
|
def test_contiguity_unimportant(self):
|
||||||
|
verts = torch.rand(32, 3)
|
||||||
|
self._test_save_load(verts, torch.randint(30, size=(10, 3)))
|
||||||
|
self._test_save_load(verts, torch.randint(30, size=(3, 10)).T)
|
||||||
|
|
||||||
def test_empty_save_load(self):
|
def test_empty_save_load(self):
|
||||||
# Vertices + empty faces
|
# Vertices + empty faces
|
||||||
verts = torch.tensor([[0.1, 0.2, 0.3]])
|
verts = torch.tensor([[0.1, 0.2, 0.3]])
|
||||||
|
Loading…
x
Reference in New Issue
Block a user