From 0f84063c580811e14241bda234508a2622f0fcae Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Tue, 16 Oct 2018 16:34:37 +0200 Subject: OBJ IO: Change specular IO conversion. Conversion from phong exponent to Principled BSDF is expected to be quadratic afaik, not linear. --- io_scene_obj/__init__.py | 2 +- io_scene_obj/export_obj.py | 8 +++++--- io_scene_obj/import_obj.py | 7 +++++-- 3 files changed, 11 insertions(+), 6 deletions(-) (limited to 'io_scene_obj') diff --git a/io_scene_obj/__init__.py b/io_scene_obj/__init__.py index ac396b7e..ab977ca9 100644 --- a/io_scene_obj/__init__.py +++ b/io_scene_obj/__init__.py @@ -21,7 +21,7 @@ bl_info = { "name": "Wavefront OBJ format", "author": "Campbell Barton, Bastien Montagne", - "version": (3, 4, 1), + "version": (3, 4, 2), "blender": (2, 80, 0), "location": "File > Import-Export", "description": "Import-Export OBJ, Import OBJ mesh, UV's, materials and textures", diff --git a/io_scene_obj/export_obj.py b/io_scene_obj/export_obj.py index f3b92afd..a147a493 100644 --- a/io_scene_obj/export_obj.py +++ b/io_scene_obj/export_obj.py @@ -73,9 +73,11 @@ def write_mtl(scene, filepath, path_mode, copy_set, mtl_dict): use_mirror = mat_wrap.metallic != 0.0 use_transparency = mat_wrap.transmission != 0.0 - # Convert from principled roughness to 0 - 1000 specular range. - # XXX Basic linear conversion, what would be best-matching formula here? - fw('Ns %.6f\n' % ((1.0 - mat_wrap.roughness) * 1000)) + # XXX Totally empirical conversion, trying to adapt it + # (from 1.0 - 0.0 Principled BSDF range to 0.0 - 900.0 OBJ specular exponent range)... + spec = (1.0 - mat_wrap.roughness) * 30 + spec *= spec + fw('Ns %.6f\n' % spec) # Ambient if use_mirror: diff --git a/io_scene_obj/import_obj.py b/io_scene_obj/import_obj.py index 916ff313..cb18f911 100644 --- a/io_scene_obj/import_obj.py +++ b/io_scene_obj/import_obj.py @@ -93,6 +93,8 @@ def create_materials(filepath, relpath, Create all the used materials in this obj, assign colors and images to the materials from all referenced material libs """ + from math import sqrt + DIR = os.path.dirname(filepath) context_material_vars = set() @@ -303,8 +305,9 @@ def create_materials(filepath, relpath, emit_colors[:] = [ float_func(line_split[1]), float_func(line_split[2]), float_func(line_split[3])] elif line_id == b'ns': - # XXX Basic linear conversion, what would be best-matching formula here? - context_mat_wrap.roughness = 1.0 - (float_func(line_split[1]) / 1000) + # XXX Totally empirical conversion, trying to adapt it + # (from 0.0 - 900.0 OBJ specular exponent range to 1.0 - 0.0 Principled BSDF range)... + context_mat_wrap.roughness = 1.0 - (sqrt(float_func(line_split[1])) / 30) context_material_vars.add("roughness") elif line_id == b'ni': # Refraction index (between 0.001 and 10). context_mat_wrap.ior = float_func(line_split[1]) -- cgit v1.2.3