😸

⑥[VSCode][Blernder5.0][ChatGPT]ChatGPTでPythonスクリプト生成→アルファベットアニメ生成をやってみ

に公開

タイトルが切れちった。

第1回 Blender MCPのはじめかた。(Blender MCP x Claude Desktop)
第2回 Blender MCPのはじめかた。(Blender MCP x Github Copilot)
第3回 Blender MCPのはじめかた。(Blender MCP x Cursor)
第4回 Blernder MCPを使わずpythonスクリプトを生成する。
第5回 VSCodeでBlernder5.0のpythonスクリプトを実行する。
第6回 ChatGPTでPythonスクリプト生成→アルファベットアニメ生成をやってみた。

アルファベットアニメって勝手に命名したんだけど、要はアルファベット文字列を、起承転結のあるショートストーリー仕立てでアニメーションさせてみたい。大作3DCGアニメに向けた予行練習的な。というのがモチベーション。

Abstract

  • ChatGPTで、Blernder5.0のPythonスクリプト生成→アニメーション生成の手順説明

前提

  • Blenderインストール済
  • Python3.xインストール済
  • ChatGPTにログイン済
  • ココから一式ダウンロード済

ざっくり手順

  1. Blender側で常駐のTCPサーバーを起動
  2. ChatGPTでPythonスクリプト生成
  3. VSCodeに上記スクリプトを貼る。
  4. VSCodeで、Pythonスクリプト実行

1. Blender側で常駐のTCPサーバーを起動

ダウンロードした一式の中のblender_server_startup.blendをダブルクリックしてBlender起動する。
レイアウトタブ → キーボードN押下 → "VSCode_to_Blend"をクリックするとTCPサーバー起動を確認できる。

2. ChatGPTでPythonスクリプト生成 → VSCodeに張り付ける

ChatGPTに入力する呪文が大事よね。

こんな感じ.

生成AIへの呪文
アルファベット3文字TKSを使って起承転結の展開のわかる物語性のある15秒程度の3DCGアニメーションをBlenerで実行するpythonスクリプトを作ってほしいっす。
- Blender5.0
- Cameraオブジェクトは使わんとって。ARアプリに3DCGオブジェクトして表示する予定やけん
- Lightオブジェクトは使ってもOK。Google filamentで実装できるらしいから
- 「起」...2~3秒。上空から"T"が最初に落ちてくる。 "T" だけが落ちてきて地面にドンッと着地。KとSはいない。
- 「承」...4~5秒。KとSが登場してTの周りに集まる。3文字が合流し、物語が動き始める。
- 「転」...4~5秒。3文字が衝突してバラバラに吹き飛ぶ。もっとも分かりやすい「転」
- 「結」...3文字が元の位置に並び直る。シンプルで映える着地。
生き物が弾むような感じでお願いばい。

3. VSCodeに上記スクリプトを貼る。

ファイルを新規作成 → 生成コードを貼り付ける。

story001.py
import bpy
import math
from mathutils import Vector

# =========================
# 初期化
# =========================
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(use_global=False)

scene = bpy.context.scene
scene.frame_start = 0
scene.frame_end = 450
scene.render.fps = 30

# =========================
# Light(AR想定でシンプル)
# =========================
bpy.ops.object.light_add(type='AREA', location=(5, -5, 8))
light = bpy.context.object
light.data.energy = 800
light.data.size = 5

# =========================
# Text 作成関数
# =========================
def create_letter(char, location):
    bpy.ops.object.text_add(location=location)
    txt = bpy.context.object
    txt.data.body = char
    txt.data.extrude = 0.2
    txt.data.bevel_depth = 0.02
    txt.data.align_x = 'CENTER'
    txt.data.align_y = 'CENTER'

    bpy.ops.object.convert(target='MESH')
    txt.scale = (1.2, 1.2, 1.2)
    bpy.context.view_layer.update()
    return txt

# =========================
# 文字生成
# =========================
T = create_letter("T", (0, 0, 8))
K = create_letter("K", (-4, 0, 1))
S = create_letter("S", (4, 0, 1))

K.hide_viewport = True
S.hide_viewport = True
K.hide_render = True
S.hide_render = True

# =========================
# 「起」Tが落ちる
# =========================
T.location = (0, 0, 8)
T.keyframe_insert("location", frame=0)

T.location = (0, 0, 1)
T.keyframe_insert("location", frame=60)

# 着地バウンド
T.scale = (1.4, 1.4, 0.7)
T.keyframe_insert("scale", frame=65)

T.scale = (1.2, 1.2, 1.2)
T.keyframe_insert("scale", frame=75)

# =========================
# 「承」K・S 登場して集合
# =========================
for obj in [K, S]:
    obj.hide_viewport = False
    obj.hide_render = False
    obj.keyframe_insert("hide_viewport", frame=75)
    obj.keyframe_insert("hide_render", frame=75)

K.location = (-4, 0, 1)
S.location = (4, 0, 1)
K.keyframe_insert("location", frame=75)
S.keyframe_insert("location", frame=75)

K.location = (-1.5, 0, 1)
S.location = (1.5, 0, 1)
K.keyframe_insert("location", frame=180)
S.keyframe_insert("location", frame=180)

# 軽く弾む
for obj in [T, K, S]:
    obj.scale = (1.35, 1.35, 0.8)
    obj.keyframe_insert("scale", frame=190)
    obj.scale = (1.2, 1.2, 1.2)
    obj.keyframe_insert("scale", frame=210)

# =========================
# 「転」衝突 → 吹き飛ぶ
# =========================
explode_positions = {
    T: (0, -4, 3),
    K: (-5, 2, 2.5),
    S: (5, 2, 2.5)
}

for obj, pos in explode_positions.items():
    obj.keyframe_insert("location", frame=210)
    obj.location = pos
    obj.keyframe_insert("location", frame=300)

    obj.rotation_euler = (math.radians(360), 0, 0)
    obj.keyframe_insert("rotation_euler", frame=300)

# =========================
# 「結」整列して着地
# =========================
final_positions = {
    T: (-1.5, 0, 1),
    K: (0, 0, 1),
    S: (1.5, 0, 1)
}

for obj, pos in final_positions.items():
    obj.location = pos
    obj.keyframe_insert("location", frame=420)

    obj.scale = (1.4, 1.4, 0.85)
    obj.keyframe_insert("scale", frame=430)

    obj.scale = (1.2, 1.2, 1.2)
    obj.keyframe_insert("scale", frame=450)

4. VSCodeで、Pythonスクリプト実行

VSCode → 実行とデバッグ → Send to blenderを実行
で、出来たPythonスクリプトを実行する。

なんかあまりアニメがイケてない。のっぺりしてるというか。
もっと有機的に擬人化した動きになって欲しいのだけど。それが次の課題かな。

Discussion