1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Blender Python API のコードを生成する ChatGPT 質問文を簡単に作れるサイトを作ってみた

Last updated at Posted at 2025-07-15

Blenderでモデルを作る際に、Blender Python API のコードを ChatGPT で生成する方法をご存知でしょうか?

最近では ChatGPT にアクセスするだけで、アカウント不要ですぐに使えるようになっています。

例えば「屋台を作りたい」と思ったとき、骨組みの作成を自動化できるコードを ChatGPT に書かせることができます。

さらに、ChatGPT のアプリ版を使っていて、現実世界にあるものを作る場合は
写真を撮って「この画像のようなモデルを作りたいです」と伝える
といった質問でも、ある程度は期待通りの結果を得られるはずです。


でも、こんな悩みはありませんか?

ただし、Blenderユーザーの中には
「ChatGPT でうまく質問する方法が分からない…」
と感じる方も多いのではないでしょうか。

そこで今回、生成したい内容をテキストボックスに入力するだけで、私が考える“適切な質問文”に変換するサイトを作成しました。

👉 サイトはこちら


📝 使い方はとても簡単

例えば、次のような内容を入力します。

和風縁日セット
 ・屋台(たこ焼き、金魚すくい、射的など)
 ・提灯・のれん・看板
 ・ミニゲーム小物(金魚桶、ビニール風船人形)

すると、以下のような質問文が生成され、自動的にクリップボードにコピーされます。

# Blender Python API 生成コード
# 以下の要件を満たすよう可能な限りクオリティを上げて記述します

import bpy

# 入力された指示:
# 和風縁日セット
 ・屋台(たこ焼き、金魚すくい、射的など)
 ・提灯・のれん・看板
 ・ミニゲーム小物(金魚桶、ビニール風船人形)

# TODO: 以下に高品質な処理を実装してください
# 例: オブジェクト作成、設定適用、アニメーション処理など

この質問文を ChatGPT に投げると、
普通に聞くよりも精度の高い返答が得られるはずです。

なお、実際に質問してみると下記の内容が返ってきました。

ここをクリックで開閉(有料版 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 で生成)
無料版 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の回答精度はこんなにも変わるんだ!」と実感できると思います。

ご覧いただき、ありがとうございました!

再掲:
👉 サイトはこちら

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?