mirror of
https://github.com/facebookresearch/pytorch3d.git
synced 2025-08-02 03:42:50 +08:00
Importing obj files without usemtl
Summary: When there is no "usemtl" statement in the .obj file use material from .mtl if there is one. https://github.com/facebookresearch/pytorch3d/issues/1068 Reviewed By: bottler Differential Revision: D34141152 fbshipit-source-id: 7a5b5cc3f0bb287dc617f68de2cd085db8f7ad94
This commit is contained in:
parent
12f20d799e
commit
ef21a6f6aa
@ -454,8 +454,18 @@ def _load_texture_images(
|
||||
final_material_properties = {}
|
||||
texture_images = {}
|
||||
|
||||
used_material_names = list(material_names)
|
||||
if not used_material_names and material_properties:
|
||||
if len(material_properties) > 1:
|
||||
raise ValueError(
|
||||
"Multiple materials but no usemtl declarations in the obj file"
|
||||
)
|
||||
# No materials were specified in obj file and only one is in the
|
||||
# specified .mtl file, so we use it.
|
||||
used_material_names.append(next(iter(material_properties.keys())))
|
||||
|
||||
# Only keep the materials referenced in the obj.
|
||||
for material_name in material_names:
|
||||
for material_name in used_material_names:
|
||||
if material_name in texture_files:
|
||||
# Load the texture image.
|
||||
path = os.path.join(data_dir, texture_files[material_name])
|
||||
|
@ -526,9 +526,8 @@ def _load_materials(
|
||||
if not load_textures:
|
||||
return None, None
|
||||
|
||||
if not material_names or f is None:
|
||||
if material_names:
|
||||
warnings.warn("No mtl file provided")
|
||||
if f is None:
|
||||
warnings.warn("No mtl file provided")
|
||||
return None, None
|
||||
|
||||
if not path_manager.exists(f):
|
||||
@ -620,6 +619,13 @@ def _load_obj(
|
||||
device=device,
|
||||
)
|
||||
|
||||
if material_colors and not material_names:
|
||||
# usemtl was not present but single material was present in the .mtl file
|
||||
material_names.append(next(iter(material_colors.keys())))
|
||||
# replace all -1 by 0 material idx
|
||||
if torch.is_tensor(faces_materials_idx):
|
||||
faces_materials_idx.clamp_(min=0)
|
||||
|
||||
if create_texture_atlas:
|
||||
# Using the images and properties from the
|
||||
# material file make a per face texture map.
|
||||
|
7
tests/data/missing_usemtl/README.md
Normal file
7
tests/data/missing_usemtl/README.md
Normal file
@ -0,0 +1,7 @@
|
||||
# Acknowledgements
|
||||
|
||||
This is copied version of docs/tutorials/data/cow_mesh with removed line 6159 (usemtl material_1) to test behavior without usemtl material_1 declaration.
|
||||
|
||||
Thank you to Keenen Crane for allowing the cow mesh model to be used freely in the public domain.
|
||||
|
||||
###### Source: http://www.cs.cmu.edu/~kmcrane/Projects/ModelRepository/
|
9
tests/data/missing_usemtl/cow.mtl
Executable file
9
tests/data/missing_usemtl/cow.mtl
Executable file
@ -0,0 +1,9 @@
|
||||
newmtl material_1
|
||||
map_Kd cow_texture.png
|
||||
|
||||
# Test colors
|
||||
|
||||
Ka 1.000 1.000 1.000 # white
|
||||
Kd 1.000 1.000 1.000 # white
|
||||
Ks 0.000 0.000 0.000 # black
|
||||
Ns 10.0
|
12014
tests/data/missing_usemtl/cow.obj
Executable file
12014
tests/data/missing_usemtl/cow.obj
Executable file
File diff suppressed because it is too large
Load Diff
BIN
tests/data/missing_usemtl/cow_texture.png
Executable file
BIN
tests/data/missing_usemtl/cow_texture.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 77 KiB |
@ -658,6 +658,18 @@ class TestMeshObjIO(TestCaseMixin, unittest.TestCase):
|
||||
self.assertTrue(aux.material_colors is None)
|
||||
self.assertTrue(aux.texture_images is None)
|
||||
|
||||
def test_load_no_usemtl(self):
|
||||
obj_filename = "missing_usemtl/cow.obj"
|
||||
# obj_filename has no "usemtl material_1" line
|
||||
filename = os.path.join(DATA_DIR, obj_filename)
|
||||
# TexturesUV type
|
||||
mesh = IO().load_mesh(filename)
|
||||
self.assertIsNotNone(mesh.textures)
|
||||
|
||||
verts, faces, aux = load_obj(filename)
|
||||
self.assertTrue("material_1" in aux.material_colors)
|
||||
self.assertTrue("material_1" in aux.texture_images)
|
||||
|
||||
def test_load_mtl_fail(self):
|
||||
# Faces have a material
|
||||
obj_file = "\n".join(
|
||||
|
Loading…
x
Reference in New Issue
Block a user