diff options
author | Bastien Montagne <montagne29@wanadoo.fr> | 2017-10-05 19:12:10 +0300 |
---|---|---|
committer | Bastien Montagne <montagne29@wanadoo.fr> | 2017-10-05 19:13:30 +0300 |
commit | 63482a5f2e2ad76989c2d2901c1f34f2f0cb59d4 (patch) | |
tree | 5efe4f037535dd5bbce7c2dacabadc3afe37dd82 /release | |
parent | 4537e8558468c71a03bf53f59c60f888b3412de2 (diff) |
Fix T53002: Batch-Generate Previews generate empty or none image for large objects.
Camera clipping was left to default values, which won't work well for
very large (or small) objects. Now recompute valid clipping start/end
based on boundingbox of rendered data, and final location of camera.
Diffstat (limited to 'release')
-rw-r--r-- | release/scripts/modules/bl_previews_utils/bl_previews_render.py | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/release/scripts/modules/bl_previews_utils/bl_previews_render.py b/release/scripts/modules/bl_previews_utils/bl_previews_render.py index b4f0b8dd3b8..71208ef3485 100644 --- a/release/scripts/modules/bl_previews_utils/bl_previews_render.py +++ b/release/scripts/modules/bl_previews_utils/bl_previews_render.py @@ -278,7 +278,7 @@ def do_previews(do_objects, do_groups, do_scenes, do_data_intern): bbox[1].z = v.z def objects_bbox_calc(camera, objects, offset_matrix): - bbox = (Vector((1e9, 1e9, 1e9)), Vector((-1e9, -1e9, -1e9))) + bbox = (Vector((1e24, 1e24, 1e24)), Vector((-1e24, -1e24, -1e24))) for obname, libpath in objects: ob = bpy.data.objects[obname, libpath] object_bbox_merge(bbox, ob, camera, offset_matrix) @@ -305,6 +305,17 @@ def do_previews(do_objects, do_groups, do_scenes, do_data_intern): cos = objects_bbox_calc(camera, objects, offset_matrix) loc, ortho_scale = camera.camera_fit_coords(scene, cos) camera.location = loc + # Set camera clipping accordingly to computed bbox. + min_dist = 1e24 + max_dist = -1e24 + for co in zip(*(iter(cos),) * 3): + dist = (Vector(co) - loc).length + if dist < min_dist: + min_dist = dist + if dist > max_dist: + max_dist = dist + camera.data.clip_start = min_dist / 2 + camera.data.clip_end = max_dist * 2 if lamp: loc, ortho_scale = lamp.camera_fit_coords(scene, cos) lamp.location = loc |