この記事の概要
Blenderの練習をしていて、こちらの動画を見つけました。
ピタゴラスイッチの「きょうのスレスレ」みたいで見ていて楽しく、難しい計算をせずとも作れるので面白かったです。
ただ、動画の5分頃から8分頃までで説明しているように、ひたすら人力でコピペを繰り返していたのでミスってしまいそうだなあと思いました。
というわけで、Pythonを使って自動化します。
この記事の内容で問題なく動作はするのですが、スピードが非常に遅いです。
高速化まで至れなかったのですが一旦記事にしました。
Scriptingの説明
Pythonを使う、といっても特別な準備が必要なわけではありません。
BlenderにはScriptingという機能があるので簡単に始められます。
普段よく使うのはLayoutタブなどだと思いますが、Scriptingタブを選ぶとText EditorやConsoleが表示されます。
ウインドウ右側の、緑で囲ったエリアにコードを書いて実行します。
Layoutタブの表示 | Scriptingタブの表示 |
---|---|
環境
Blender | 3.3.1 |
Python (Blender内のもの) | 3.10 |
完成形
最初に完成形を示します。
import bpy
pole = bpy.data.objects['Pole']
wall = bpy.data.objects['Wall']
start_frame = 129
end_frame = 233
def apply_boolean(object1, object2):
boolean = object1.modifiers.new(type="BOOLEAN", name="Boolean")
boolean.operation = 'DIFFERENCE'
boolean.object = object2
bpy.ops.object.modifier_apply(modifier="Boolean")
bpy.context.scene.frame_set(start_frame)
for i in range(start_frame, end_frame + 1):
bpy.context.scene.frame_set(bpy.context.scene.frame_current + 1)
apply_boolean(wall, pole)
bpy
というモジュールが用意されていて、この中に色々なメソッドが用意されています。
import bpy
今回でいうと、スレスレで通る棒をPole
と名付けて、壁をWall
と名付けています。
自分の名付けた通りに指定します。
pole = bpy.data.objects['Pole']
wall = bpy.data.objects['Wall']
壁に棒が触れるタイミングが129フレーム目で、完全に通り終わるのが233フレーム目だったのでここで定義しています。
アニメーションの長さや回転スピード、メッシュの配置で変わってきます。
start_frame = 129
end_frame = 233
今回のキモです。
-
object1
とobject2
を引数にとる関数-
object1
にBooleanモディファイアを追加 - 棒で壁をくり抜きたいので、
Intersect
,Union
,Difference
のうち、Difference
を指定 -
object2
をBoolean対象に指定 -
object1
のモディファイアを適用
-
def apply_boolean(object1, object2):
boolean = object1.modifiers.new(type="BOOLEAN", name="Boolean")
boolean.object = object2
boolean.operation = 'DIFFERENCE'
bpy.ops.object.modifier_apply(modifier="Boolean")
フレームをstart_frame
にあわせます。
手動で合わせても大して手間は変わりませんが、念の為。
bpy.context.scene.frame_set(start_frame)
start_frame
から1フレームずつ進めて、その度にモディファイアを作成→適用を繰り返します。
for i in range(start_frame, end_frame + 1):
bpy.context.scene.frame_set(bpy.context.scene.frame_current + 1)
apply_boolean(wall, pole)
最後に
これにて無事にアニメーションが作成できました。
記事冒頭にも書きましたが、処理スピードが速くなるともっと気楽に使えるのですが……。
とりあえず、コードによりミスがなくなったという意味で良しとします。
最後まで読んでくださってありがとうございます!
Twitterでも情報を発信しているので、良かったらフォローお願いします!
Devトークでのお話してくださる方も募集中です!