import bpy from mathutils import Vector, Euler from math import pi import json import os import pathlib GROUP_NAME = "Test" GROUP_KIND = "objects" path_info = pathlib.Path(bpy.data.filepath).parent.joinpath("macrovision-directory.txt") config_path = pathlib.Path(open(path_info).read()) json_path = config_path.joinpath("config.json") config = json.load(open(json_path.resolve(), encoding="utf-8")) parent_workdir = config["work-directory"] workdir = pathlib.Path(parent_workdir).joinpath(GROUP_NAME) c = bpy.data.objects["cam"] c.data.type = "ORTHO" bpy.data.scenes["Scene"].render.resolution_x = 1000 bpy.data.scenes["Scene"].render.resolution_y = 1000 bpy.data.scenes["Scene"].render.film_transparent = True bpy.data.scenes["Scene"].view_settings.view_transform = "Raw" bpy.data.worlds["World"].node_tree.nodes["Background"].inputs[1].default_value = 0 a objects = [] for object in bpy.data.collections["Macrovision"].objects: if object.type == "MESH": objects.append(object) all_data = {} all_data["name"] = GROUP_NAME all_data["kind"] = GROUP_KIND all_data["forms"] = [] os.makedirs(workdir, exist_ok=True) for selected in objects: for object in bpy.data.collections["Macrovision"].objects: object.hide_render = True selected.hide_render = False bpy.ops.object.transform_apply( rotation = True ) data = {} data["name"] = selected.name data["views"] = [] b = selected for angles in [[0, 1, 2, "Front"], [1, 1, 2, "Side"], [0, 0, 1, "Top"]]: local_bbox_center = 0.125 * sum((Vector(box) for box in b.bound_box), Vector()) global_bbox_center = b.matrix_world @ local_bbox_center c.location = global_bbox_center c.data.ortho_scale = max(b.dimensions) * 1.1 c.rotation_euler = Euler([angles[1] * pi / 2, 0, angles[0] * pi / 2]) rot = c.rotation_euler.to_matrix() rot.invert() c.location = c.location + Vector([0, 0, 3]) @ rot data["views"].append({ "name": angles[3], "height": b.dimensions[angles[2]] }) #s.rotation_euler = c.rotation_euler filename = f"{b.name}-{angles[3]}.png" bpy.context.scene.render.filepath = workdir.joinpath(filename).resolve().__str__() bpy.ops.render.render(write_still = True) all_data["forms"].append(data) with open(workdir.joinpath("data.json"), "w") as file: json.dump(all_data, file)