😸
⑥[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にログイン済
- ココから一式ダウンロード済
ざっくり手順
- Blender側で常駐のTCPサーバーを起動
- ChatGPTでPythonスクリプト生成
- VSCodeに上記スクリプトを貼る。
- 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