LoginSignup
0
1

More than 1 year has passed since last update.

Blenderで六面図の自動作成

Last updated at Posted at 2021-10-20

目的

Blender2.93で六面図を自動作成するコマンドを紹介します。
macOSの例ですが、適宜直せばWindowsでも動くはずです。

作成するコマンドの内容

Blenderファイルを入力として、六面図を追加した新たなBlenderファイルを作成します。

コード

下記をmake_image.pyとして作成してください。

make_image.py
import sys

import bpy
import fire
from mathutils import Euler


def make_image(save_path=None):
    """6方向からレンダリングして背景化"""
    import math

    CAMERA_NAME = "MyCam"
    LIGHT_NAME = "MyLight"
    IMG_NAMES = "top", "btm", "lft", "rgt", "frt", "bck"

    scene = bpy.context.scene
    scene.render.resolution_x = scene.render.resolution_y = 1000
    render = scene.render
    render.use_file_extension = True

    # すでに存在したときは、前のデータを削除する
    for name in IMG_NAMES:
        if obj := bpy.data.objects.get(f"img_{name}"):
            bpy.data.images.remove(obj.data)
            bpy.data.objects.remove(obj)
    if obj := bpy.data.collections.get("img"):
        bpy.data.collections.remove(obj)

    # Light
    light_data = bpy.data.lights.new(LIGHT_NAME, "SUN")
    light_data.energy = 2
    light_ob = bpy.data.objects.new(name=LIGHT_NAME, object_data=light_data)
    bpy.context.collection.objects.link(light_ob)

    # Camera
    cam_data = bpy.data.cameras.new(CAMERA_NAME)
    cam_data.type = "ORTHO"  # 平行投影
    cam_data.ortho_scale = 10  # 平行投影のスケール
    cam_ob = bpy.data.objects.new(name=CAMERA_NAME, object_data=cam_data)
    bpy.context.collection.objects.link(cam_ob)
    scene.camera = cam_ob

    new_col = bpy.data.collections.new("img")
    bpy.context.collection.children.link(new_col)
    r90 = math.pi / 2
    lst = [
        ((0, 0, 10), (0, 0, 0)),
        ((0, 0, -10), (2 * r90, 0, 0)),
        ((-10, 0, 0), (r90, 0, -r90)),
        ((10, 0, 0), (r90, 0, r90)),
        ((0, -10, 0), (r90, 0, 0)),
        ((0, 10, 0), (-r90, 2 * r90, 0)),
    ]
    for name, (loc, rot) in zip(IMG_NAMES, lst):
        fn = f"img_{name}"
        cam_ob.location = loc
        cam_ob.rotation_euler = light_ob.rotation_euler = Euler(rot, "XYZ")
        render.filepath = f"/tmp/{fn}"
        bpy.ops.render.render(write_still=True)
        bpy.ops.object.load_reference_image(filepath=f"/tmp/{fn}.png", view_align=False)
        img_ob = bpy.context.active_object
        img_ob.name = fn
        img_ob.location = [-i for i in loc]
        img_ob.rotation_euler = Euler(rot, "XYZ")
        img_ob.scale = 2, 2, 2
        img_ob.empty_image_side = img_ob.empty_image_depth = "FRONT"
        img_ob.use_empty_image_alpha = True
        img_ob.color[3] = 0.5
        img_ob.show_empty_image_perspective = False
        for col in img_ob.users_collection:
            col.objects.unlink(img_ob)
        new_col.objects.link(img_ob)
    # cameraとlightは消しておく
    bpy.data.cameras.remove(bpy.data.cameras[CAMERA_NAME])
    bpy.data.lights.remove(bpy.data.lights[LIGHT_NAME])
    bpy.context.view_layer.update()
    if save_path:
        bpy.ops.wm.save_as_mainfile(filepath=save_path)


if __name__ == "__main__":
    sys.argv = sys.argv[:1] + sys.argv[(sys.argv + ["--"]).index("--") + 1 :]
    fire.Fire(make_image)

参考:BlenderでPythonを実行する方法

準備

Blenderのコマンドサンプル」を参考にFireをインストールしてください。
またBlenderは、blenderコマンドで実行できるものとします。

実行

下記のようにしてシェルで実行します。

blender -b input.blend -P make_image.py -- out.blend

input.blendは、下記のような入力ファイルです。

input.jpg

実行すると、out.blendという出力ファイルが作成されます。
out.blendには、imgという新規のコレクションに、下記のように6枚の画像が追加されます。

out.jpg

下記の左側は正面から見た図です。右側はオリジナルのオブジェクトを非表示にしたものです。
六面図は不透明度を0.5にしているので右側が少し薄くなっていますが、同じ表示になっていることがわかります。

change.png

以上

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1