Blenderでモデルを作る際に、Blender Python API のコードを ChatGPT で生成する方法をご存知でしょうか?
最近では ChatGPT にアクセスするだけで、アカウント不要ですぐに使えるようになっています。
例えば「屋台を作りたい」と思ったとき、骨組みの作成を自動化できるコードを ChatGPT に書かせることができます。
さらに、ChatGPT のアプリ版を使っていて、現実世界にあるものを作る場合は
写真を撮って「この画像のようなモデルを作りたいです」と伝える
といった質問でも、ある程度は期待通りの結果を得られるはずです。
でも、こんな悩みはありませんか?
ただし、Blenderユーザーの中には
「ChatGPT でうまく質問する方法が分からない…」
と感じる方も多いのではないでしょうか。
そこで今回、生成したい内容をテキストボックスに入力するだけで、私が考える“適切な質問文”に変換するサイトを作成しました。
👉 サイトはこちら
📝 使い方はとても簡単
例えば、次のような内容を入力します。
和風縁日セット
・屋台(たこ焼き、金魚すくい、射的など)
・提灯・のれん・看板
・ミニゲーム小物(金魚桶、ビニール風船人形)
すると、以下のような質問文が生成され、自動的にクリップボードにコピーされます。
# Blender Python API 生成コード
# 以下の要件を満たすよう可能な限りクオリティを上げて記述します
import bpy
# 入力された指示:
# 和風縁日セット
・屋台(たこ焼き、金魚すくい、射的など)
・提灯・のれん・看板
・ミニゲーム小物(金魚桶、ビニール風船人形)
# TODO: 以下に高品質な処理を実装してください
# 例: オブジェクト作成、設定適用、アニメーション処理など
この質問文を ChatGPT に投げると、
普通に聞くよりも精度の高い返答が得られるはずです。
なお、実際に質問してみると下記の内容が返ってきました。
ここをクリックで開閉(有料版 ChatGPT で生成)
import bpy
import math
from mathutils import Vector, Euler
# --- 初期設定 ---
bpy.ops.wm.read_factory_settings(use_empty=True)
# 環境ライト設定(夜の雰囲気)
world = bpy.data.worlds["World"]
world.use_nodes = True
bg = world.node_tree.nodes["Background"]
bg.inputs[0].default_value = (0.02, 0.02, 0.05, 1) # 暗めの青
bg.inputs[1].default_value = 0.5
# --- ユーティリティ関数 ---
def create_material(name, color, emission_strength=0):
mat = bpy.data.materials.new(name)
mat.use_nodes = True
nodes = mat.node_tree.nodes
bsdf = nodes.get("Principled BSDF")
bsdf.inputs["Base Color"].default_value = (*color, 1)
if emission_strength > 0:
emission = nodes.new(type="ShaderNodeEmission")
emission.inputs["Color"].default_value = (*color, 1)
emission.inputs["Strength"].default_value = emission_strength
mix_shader = nodes.new(type="ShaderNodeMixShader")
output = nodes["Material Output"]
mat.node_tree.links.new(mix_shader.inputs[1], bsdf.outputs[0])
mat.node_tree.links.new(mix_shader.inputs[2], emission.outputs[0])
mat.node_tree.links.new(output.inputs[0], mix_shader.outputs[0])
mix_shader.inputs["Fac"].default_value = 0.5
return mat
def add_point_light(name, location, energy, color):
light_data = bpy.data.lights.new(name=name, type='POINT')
light_data.energy = energy
light_data.color = color
light_object = bpy.data.objects.new(name=name, object_data=light_data)
bpy.context.collection.objects.link(light_object)
light_object.location = location
return light_object
# --- 提灯 ---
def create_lantern(location, scale=(0.2, 0.2, 0.3)):
bpy.ops.mesh.primitive_uv_sphere_add(location=location, scale=scale)
lantern = bpy.context.active_object
lantern.name = "Lantern"
lantern_mat = create_material("LanternMat", (1.0, 0.3, 0.2), emission_strength=5)
lantern.data.materials.append(lantern_mat)
# ライト
add_point_light("LanternLight", location, energy=100, color=(1.0, 0.5, 0.4))
# --- 屋台 ---
def create_yatai(location, name="Yatai"):
# 屋台の土台
bpy.ops.mesh.primitive_cube_add(location=location, scale=(1.5, 1, 1))
yatai = bpy.context.active_object
yatai.name = name
yatai_mat = create_material(f"{name}Mat", (0.4, 0.2, 0.1))
yatai.data.materials.append(yatai_mat)
# のれん
bpy.ops.mesh.primitive_plane_add(location=(location[0], location[1]+1.05, location[2]+1.2), scale=(1.5, 0.01, 0.5))
noren = bpy.context.active_object
noren.name = f"{name}_Noren"
noren_mat = create_material(f"{name}_NorenMat", (0.8, 0.1, 0.1))
noren.data.materials.append(noren_mat)
return yatai
# --- 金魚桶 ---
def create_goldfish_bowl(location, scale=(0.3, 0.3, 0.2)):
bpy.ops.mesh.primitive_cylinder_add(location=location, scale=scale)
bowl = bpy.context.active_object
bowl.name = "GoldfishBowl"
bowl_mat = create_material("BowlMat", (0.2, 0.5, 1.0))
bowl.data.materials.append(bowl_mat)
# --- ビニール風船人形 ---
def create_balloon(location, scale=(0.1, 0.1, 0.15)):
bpy.ops.mesh.primitive_uv_sphere_add(location=location, scale=scale)
balloon = bpy.context.active_object
balloon.name = "Balloon"
balloon_mat = create_material("BalloonMat", (1.0, 0.7, 0.2), emission_strength=1)
balloon.data.materials.append(balloon_mat)
# --- 射的の的(シンプル)---
def create_target(location, scale=(0.1, 0.1, 0.1)):
bpy.ops.mesh.primitive_cone_add(location=location, scale=scale)
target = bpy.context.active_object
target.name = "Target"
target_mat = create_material("TargetMat", (1.0, 1.0, 1.0))
target.data.materials.append(target_mat)
# --- 配置 ---
# 屋台配置
create_yatai((-3, 0, 1), "Takoyaki_Yatai")
create_yatai((0, 0, 1), "KingyoSukui_Yatai")
create_yatai((3, 0, 1), "Shateki_Yatai")
# 提灯配置
for x in range(-4, 5, 2):
create_lantern((x, -2, 2))
# 金魚桶とビニール風船人形
create_goldfish_bowl((0, 1.5, 0.3))
create_balloon((0.2, 1.7, 1.0))
create_balloon((-0.2, 1.7, 1.0))
# 射的の的配置
for i in range(3):
create_target((3, -1 + i * 0.4, 1.5))
# --- カメラ設定 ---
camera_data = bpy.data.cameras.new(name="Camera")
camera_obj = bpy.data.objects.new("Camera", camera_data)
bpy.context.scene.collection.objects.link(camera_obj)
camera_obj.location = (0, -10, 5)
camera_obj.rotation_euler = Euler((math.radians(60), 0, 0), 'XYZ')
bpy.context.scene.camera = camera_obj
# --- レンダリング設定 ---
bpy.context.scene.render.engine = 'CYCLES'
bpy.context.scene.cycles.samples = 128
bpy.context.scene.render.image_settings.file_format = 'PNG'
bpy.context.scene.render.filepath = "//en-nichi_scene.png"
# --- アニメーション(提灯揺れ)---
for obj in bpy.data.objects:
if "Lantern" in obj.name:
obj.keyframe_insert(data_path="rotation_euler", frame=1)
obj.rotation_euler.z += math.radians(5)
obj.keyframe_insert(data_path="rotation_euler", frame=30)
obj.rotation_euler.z -= math.radians(10)
obj.keyframe_insert(data_path="rotation_euler", frame=60)
obj.rotation_euler.z += math.radians(5)
obj.keyframe_insert(data_path="rotation_euler", frame=90)
fcurves = obj.animation_data.action.fcurves
for fc in fcurves:
for kp in fc.keyframe_points:
kp.interpolation = 'SINE'
obj.animation_data.action.fcurves.update()
print("✅ 和風縁日セットの生成が完了しました。レンダリングを実行してください。")
ここをクリックで開閉(無料Web版 ChatGPT で生成)
import bpy
import math
from mathutils import Vector, Euler
# --------- ヘルパー関数群 ---------
def create_material(name, color):
mat = bpy.data.materials.new(name)
mat.use_nodes = True
bsdf = mat.node_tree.nodes.get("Principled BSDF")
if bsdf:
bsdf.inputs["Base Color"].default_value = (*color, 1)
return mat
def create_cylinder(name, radius, depth, location, color):
bpy.ops.mesh.primitive_cylinder_add(radius=radius, depth=depth, location=location)
obj = bpy.context.object
obj.name = name
obj.data.materials.append(create_material(name + "_Mat", color))
return obj
def create_cube(name, size, location, color, scale=(1,1,1)):
bpy.ops.mesh.primitive_cube_add(size=size, location=location)
obj = bpy.context.object
obj.name = name
obj.scale = scale
obj.data.materials.append(create_material(name + "_Mat", color))
return obj
def create_uv_sphere(name, radius, location, color):
bpy.ops.mesh.primitive_uv_sphere_add(radius=radius, location=location)
obj = bpy.context.object
obj.name = name
obj.data.materials.append(create_material(name + "_Mat", color))
return obj
# --------- 屋台ベース ---------
def create_yatai(name, location):
frame_color = (0.2, 0.1, 0.05)
cloth_color = (0.8, 0.1, 0.1)
base = create_cube(name + "_Base", 2, location, frame_color, scale=(2, 1, 0.3))
roof = create_cube(name + "_Roof", 2, location + Vector((0, 0, 1.5)), cloth_color, scale=(2.2, 1.2, 0.2))
return [base, roof]
# --------- 提灯 ---------
def create_lantern(name, location):
red = (0.9, 0.1, 0.1)
body = create_uv_sphere(name, 0.2, location, red)
handle = create_cylinder(name + "_Handle", 0.02, 0.1, location + Vector((0, 0, -0.2)), (0.1, 0.1, 0.1))
return [body, handle]
# --------- のれん ---------
def create_noren(name, location):
noren = create_cube(name, 1, location, (0.2, 0.2, 0.8), scale=(1.5, 0.1, 0.5))
return [noren]
# --------- 看板 ---------
def create_sign(name, location, text="縁日"):
sign = create_cube(name + "_Board", 1, location, (0.6, 0.4, 0.2), scale=(1.5, 0.1, 0.5))
bpy.ops.object.text_add(location=location + Vector((0, 0.1, 0.1)))
text_obj = bpy.context.object
text_obj.data.body = text
text_obj.data.align_x = 'CENTER'
text_obj.data.size = 0.3
text_obj.name = name + "_Text"
text_obj.rotation_euler = Euler((0, 0, 0), 'XYZ')
return [sign, text_obj]
# --------- 金魚桶 ---------
def create_fish_bucket(name, location):
bucket = create_cylinder(name, 0.3, 0.2, location, (0.2, 0.6, 0.9))
water = create_cylinder(name + "_Water", 0.28, 0.1, location + Vector((0,0,0.05)), (0.1, 0.5, 0.8))
return [bucket, water]
# --------- ビニール風船 ---------
def create_balloon(name, location):
balloon = create_uv_sphere(name, 0.15, location, (1, 0.2, 0.6))
string = create_cylinder(name + "_String", 0.01, 0.3, location - Vector((0, 0, 0.2)), (0.1, 0.1, 0.1))
return [balloon, string]
# --------- 射的屋オブジェクト ---------
def create_target_stall(name, location):
yatai_parts = create_yatai(name, location)
for i in range(3):
target = create_cube(f"{name}_Target_{i}", 0.1, location + Vector((-0.5 + i*0.5, 0.5, 0.5)), (1,1,0))
return yatai_parts
# --------- メインシーン配置 ---------
def build_scene():
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(use_global=False)
# 屋台
create_yatai("Takoyaki_Yatai", Vector((-4, 0, 1)))
create_yatai("Kingyo_Yatai", Vector((0, 0, 1)))
create_target_stall("Shateki_Yatai", Vector((4, 0, 1)))
# 提灯配置
for i in range(-5, 6, 2):
create_lantern(f"Lantern_{i}", Vector((i, -2, 3)))
# のれん
create_noren("Noren_Takoyaki", Vector((-4, 0, 2)))
create_noren("Noren_Kingyo", Vector((0, 0, 2)))
create_noren("Noren_Shateki", Vector((4, 0, 2)))
# 看板
create_sign("Sign_Main", Vector((0, -3, 2.5)), text="和風縁日")
# 小物
create_fish_bucket("Fish_Bucket", Vector((0.5, 0.5, 0.1)))
create_balloon("Balloon_1", Vector((-1, 1, 1)))
create_balloon("Balloon_2", Vector((1, 1.2, 1)))
# 実行
build_scene()
内容は分からないかもしれませんが、とりあえずはこれだけの作業量が短縮できると捉えて頂ければと思います。
一時チャットなどで文字数の多いコードが出るまで生成を繰り返して、エラーが出た場合は更にエラーを消してもらう作業をする必要があります。
💡 まとめ
Blenderの作業効率をもっと上げたい方は、ぜひこのツールを試してみてください。
「質問の仕方ひとつで、AIの回答精度はこんなにも変わるんだ!」と実感できると思います。
ご覧いただき、ありがとうございました!
再掲:
👉 サイトはこちら