dynamic-full-loop について
dynamic-full-loop は、Blender で製品の各面を見せるカメラアニメーションスキルです。ゆっくりした各面の表示と速い切り替えを組み合わせた動画を作成できます。
主な機能
- 01複数軸での製品周回
- 02速度変化を付けたカメラ移動
- 03前面、側面、背面、上面、底面の表示
- 04長さ、フレームレート、カメラ位置の設定
- 05フレームのレンダリングと動画エンコード
活用シーン
- 01製品の全角度を見せる動画の作成
- 02マーケティングやSNS向けの動的な回転動画の作成
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ kevinbadi/ blender-skills --skill dynamic-full-loopインストール後、Claude Code で/dynamic-full-loopを入力して読み込まれたか確認します。
詳細
ダイナミックな全周カメラアニメーション
複数の軸を中心に、速度を変化させながら製品をカメラで周回します。製品の各面を見せるときはスローモーションにし、面から面へ切り替わるときは高速でカメラを振ります。正面、側面、背面、上面、底面を映します。
使用する場面
- ダイナミックな動きで「すべての角度を見せたい」とき
- 「全周ループ」「速度ランプ」「すべての面を見せる」「ダイナミックな回転」といった要望があるとき
- ソーシャルメディアやマーケティング用のヒーロー動画
パラメーター
| パラメーター | デフォルト | 説明 |
|---|---|---|
duration | 10 | 動画の長さ(秒)。速度ランプを使うため、長めです |
fps | 24 | フレームレート |
camera_distance | 4.0 | 中心からカメラまでの距離 |
camera_height | 1.8 | カメラの高さ |
手順
ステップ 1:カメラリグをセットアップする
import bpy, math
bpy.ops.object.empty_add(type='PLAIN_AXES', location=(0, 0, 0))
tgt = bpy.context.active_object
tgt.name = 'DynamicTarget'
bpy.ops.object.camera_add(location=(0, -CAMERA_DISTANCE, CAMERA_HEIGHT))
cam = bpy.context.active_object
cam.name = 'DynamicCam'
cam.data.lens = 45
trk = cam.constraints.new(type='TRACK_TO')
trk.target = tgt
trk.track_axis = 'TRACK_NEGATIVE_Z'
trk.up_axis = 'UP_Y'
# Parent camera to target
bpy.ops.object.select_all(action='DESELECT')
cam.select_set(True)
tgt.select_set(True)
bpy.context.view_layer.objects.active = tgt
bpy.ops.object.parent_set(type='OBJECT', keep_transform=True)
bpy.context.scene.camera = cam
ステップ 2:速度ランプを付けてアニメーションさせる
重要なのは、キーフレームを密集させて速度を遅くしたり速くしたりするベジェ補間です。
- 回転量が小さいキーフレームを近くに配置すると、速度が遅くなります(ある面をじっくり見せる)
- 回転量が大きいキーフレームを広く配置すると、速度が速くなります(素早く切り替える)
TOTAL_FRAMES = DURATION * FPS # 240 at 10s/24fps
scene = bpy.context.scene
scene.frame_start = 1
scene.frame_end = TOTAL_FRAMES
scene.render.fps = FPS
# Z rotation (horizontal orbit) - speed ramp pattern
# SLOW on each face, FAST whip between
kf_z = [
(1, 0), # front start
(30, 10), # slow drift on front
(45, 90), # FAST whip to right
(75, 100), # slow on right
(90, 180), # FAST whip to back
(120, 190), # slow on back
(135, 270), # FAST whip to left
(165, 280), # slow on left
(180, 330), # FAST whip toward front
(210, 340), # slow near bottom
(225, 355), # FAST settle
(240, 360), # back to front
]
# X rotation (vertical tilt - over/under)
kf_x = [
(1, 0),
(30, 0),
(75, 15), # slight tilt on right
(120, 0), # level on back
(135, -20), # tilt down on left
(165, -45), # going under
(180, -60), # under/bottom view
(210, -30), # coming back up
(240, 0), # level again
]
for f, d in kf_z:
tgt.rotation_euler[2] = math.radians(d)
tgt.keyframe_insert(data_path='rotation_euler', index=2, frame=f)
for f, d in kf_x:
tgt.rotation_euler[0] = math.radians(d)
tgt.keyframe_insert(data_path='rotation_euler', index=0, frame=f)
# BEZIER interpolation for speed ramp easing
action = tgt.animation_data.action
strip = action.layers[0].strips[0]
for cb in strip.channelbags:
for fc in cb.fcurves:
for kp in fc.keyframe_points:
kp.interpolation = 'BEZIER'
kp.easing = 'AUTO'
ステップ 3:レンダリングしてエンコードする
ffmpeg -y -framerate 24 \
-i "~/Desktop/Blender Videos/dynamic_loop_frames/%04d.png" \
-c:v prores_ks -profile:v 4444 -pix_fmt yuva444p10le \
"~/Desktop/Blender Videos/dynamic_full_loop.mov"
注意事項
- 速度ランプに余裕を持たせる必要があるため、このアニメーションは長め(10 秒)です
- 大きなメッシュで Blender がフリーズした場合は、完了したフレームをエンコードしてください。部分レンダリングでも使用できます
- 速度ランプ効果は、キーフレーム間隔が不均等なベジェ曲線によって生まれます
コメント
Markdown 対応