Blender 2.8の物理シミュレーションをPythonから操作する

以前書いたPythonプログラムをBlender 2.8に対応させました。

シミュレーションパターンは3つあって、2つの剛体シミュレーションが動きます。柔体シミュレーションは設定がわからず動きませんでした。

環境

  • macOS Mojave 10.14.3
  • Blender 2.8 beta(2019年3月22日にダウンロードしたもの)

設定

エイリアスの設定

Terminalから簡単にBlenderが起動できるようエイリアスを設定します。

$ alias blender='/Applications/blender/blender.app/contents/MacOS/blender'
$ source .bash_profile

Pythonの起動方法

ソースコードがあるディレクトリに移動してblenderコマンドを叩きます。

$ cd python
$ blender --python hoge.py
$ blender --background --python hoge.py (バックグラウンドレンダリング)

オプションは短縮できて、以下のようにもできます。詳しくは「blender --help」で確認してください。
$ blender -b -P hogehoge.py

物理シミュレーション

ソースコード

"""
Blenderの物理シミュレーション 2.8対応版(2019.3.22 Build)
Eeveeによるレンダリングで、AVI RAW形式のファイルが生成される
"""
import bpy
import math
import os


def delete_all():
    """
    デフォルトで存在しているCube/Camera/Lightを削除
    """
    # すべてのシーン、オブジェクトを表示
    print(bpy.data.scenes.keys())
    for obj in bpy.data.objects:
        print(obj.name)

    # すべてのオブジェクトを削除
    bpy.data.meshes.remove(bpy.data.meshes["Cube"])
    bpy.data.cameras.remove(bpy.data.cameras["Camera"])
    bpy.data.lights.remove(bpy.data.lights["Light"])


def create_scene():
    """
    シーンを作成
    """
    # Cubeを1000個作成
    cubeCount = 10
    for axis_x in range(cubeCount):
        for axis_y in range(cubeCount):
            for axis_z in range(cubeCount):
                # 以下に3パターンの設定を用意
                # 別パターンを試すときはコメントアウト
                # その際、start_simulation内の "physical.avi" や "physical.blend" は任意で変更するとよし

                # パターン1
                bpy.ops.mesh.primitive_cube_add(
                    location=(axis_x*2, axis_y*2, axis_z*2))
                bpy.ops.rigidbody.object_add()

                # パターン2
                # bpy.ops.mesh.primitive_cube_add(
                #     location=(axis_x*2, axis_y*2, axis_z*2), rotation=(10, 10, 0))
                # bpy.ops.rigidbody.object_add()

                # パターン3
                # todo: 設定不備により正しく動作しない
                # bpy.ops.mesh.primitive_cube_add(
                #     location=(axis_x*2, axis_y*2, axis_z*2))
                # bpy.ops.rigidbody.object_add()
                # bpy.ops.object.modifier_add(type='SOFT_BODY')

    # 平面を2つ作成
    bpy.ops.mesh.primitive_plane_add(
        location=(cubeCount-2, cubeCount-2, -10))
    bpy.ops.rigidbody.object_add(type="PASSIVE")
    bpy.data.objects["Plane"].scale = (cubeCount+5, cubeCount+5, 1)

    bpy.ops.mesh.primitive_plane_add(
        location=(cubeCount-2, cubeCount-2, -30))
    bpy.ops.rigidbody.object_add(type="PASSIVE")
    bpy.data.objects["Plane.001"].scale = (cubeCount+10, cubeCount+10, 1)

    # カメラを作成
    bpy.ops.object.camera_add(view_align=True, location=(
        cubeCount+30, cubeCount+30, cubeCount+10), rotation=(math.pi/3, 0, math.pi*3/4))
    bpy.data.cameras["Camera"].lens = 24
    bpy.data.scenes["Scene"].camera = bpy.data.objects["Camera"]

    # 照明を作成
    bpy.ops.object.light_add(type="SUN", location=(0, 0, cubeCount+20))


def start_simulation():
    """
    物理シミュレーション(現状は250フレームまでBake可能)
    """
    bpy.data.scenes["Scene"].rigidbody_world.time_scale = 2
    bpy.ops.ptcache.bake_all()

    # 動画を作成
    bpy.context.scene.render.resolution_x = 800
    bpy.context.scene.render.resolution_y = 600
    bpy.context.scene.render.resolution_percentage = 100
    bpy.context.scene.render.image_settings.file_format = "AVI_RAW"
    bpy.data.scenes["Scene"].render.filepath = "physical1.avi"
    bpy.context.scene.frame_start = 0
    bpy.context.scene.frame_end = 250
    bpy.ops.render.render(animation=True)

    # blendファイルを保存
    save_path = os.path.abspath(os.path.dirname(__file__))
    bpy.path.relpath(save_path)
    bpy.ops.wm.save_as_mainfile(
        filepath="physical1.blend", relative_remap=True)


if __name__ == '__main__':
    delete_all()
    create_scene()
    start_simulation()

delete_all関数には以前、「bpy.ops.object.delete()」と書くだけで全オブジェクトが削除されたのですが、2.8ではうまく動かなくてひとつひとつ削除するようにしました。

アニメーションフレーム数を250(デフォルト) → 300に増やたかったのに、BakeのSimulation Endにはプログラムからアクセスできないっぽい。

sc_2019-03-23_20_02_32
「bpy.data.scenes[“Scene”] … frame_end」とあり、具体的なアクセス場所がわからない

このままだと50フレームほどシミュレーションできないので、デフォルトの250のままとしました。

動画

Eeveeでレンダリングしているので速いです。

剛体シミュレーション1
剛体シミュレーション2

おわりに

Blender 2.8に対応させようと思ったのは、過去記事が他のブログでシェアされていたから。

その方はおそらくv2.79をお使いだったと思いますが、エラーが出て動かなかったご様子。謎。

僕はもうv2.8を使っていて、v2.79で動くようコードを直すテンションはないので(笑)、この際だからv2.8で動かしちゃえ、というわけです。

たまたまとはいえ、僕の記事を参考にしてくれていてびっくりですよ。嬉しいですね〜。

【お知らせ】出張撮影のご依頼、承ってます

あなたの行きたい場所に出張してポートレイトやプロフィール写真を撮影します。出張エリアは関西エリア(神戸・大阪・京都など)、関東エリア(神奈川、東京など)です。

★詳細:ポートレイト撮影(Photo Session)
★詳細:イベント撮影(Photo Shooting)

撮影予約可能日

【関西エリア】
・当面の間は関西&土日祝日の撮影をお受けできます。ご依頼お待ちしています。

【関東エリア】
・未定

まずはお気軽にご相談ください

この記事を書いた人

花村貴史|Takashi Q. Hanamura

Software Engineer & Photographer/Web開発をしながら、撮られることになれてない方の笑顔を撮らせていただいてます。その人・その場の「空気感をそっとすくい撮る」写真が好評。横浜育ち38年、脱サラ信州移住2年半を経て、2018年春から関西在住。翌年秋から夫婦生活スタート。

人物写真|Photo Session

お話しながらのポートレイト撮影です。「今」そして「これから」のあなたにフォーカスして撮影します。SNSやサイト用のプロフィール写真に。

イベント写真|Photo Shooting

「友達と楽しんでいる」「セミナーで講演している」「パーティーを主催している」など、皆さんが大切な時間を過ごしている瞬間をスナップします。

写真術|Photo Lecture

カメラの使い方、撮影術、Lightroomの使い方などの「マンツーマンレクチャ」や「少人数制のワークショップ」について。写真に関する疑問の解決に。