見出し画像

AIにBlenderのスクリプトを作ってもらった忘備録

BIngチャットにBlenderのスクリプトを作ってもらいました。

指とか髪の大量のボーンを一括リネームできるアドオンが手元になくて。(検索したらいくつか見つかったけど、動作しなかった)
それでちょうどBingチャットに登録してたので、AIに頼ってみるか…となりました。(ChatGPTでも同じ要領で使えるでしょう)。

Bingチャットへの聞き方


「Blenderでボーンを選択したらそのボーンと子のボーンを自動で取得してリストに入れ、名前に連番をつけるスクリプトを書いてください」みたいな感じでお願いしました。
※ぼんやりした聞き方からスタートしたので、何度か聞き直してます

pythonはさっぱりですが、コードには日本語で細かくコメントがつけてくれてて、なんとか分かる。
動作させて思ってたのと違う結果だったら、AIは直前の質問の内容と生成したコードを覚えているので、適切に指示すれば修正してくれます。

Blenderの参考記事のURlまで添えてくれるので、ほぼほぼできたらあとは自力でカスタムできました。
できたコードがこう↓

import bpy
# ポーズモードで一つのボーンを選択してから実行ボタンを押すと、そのボーンと子のボーンを[ボーン名]+[2桁の数字]でリネームします。

context = bpy.context
obj = context.object

selected_bone = context.active_pose_bone # 選択したボーンを取得
namelist = [] # リネーム用のリストを初期化
counter = 1 # 連番用のカウンタ変数を初期化

def get_children(bone): # 子の階層のボーンを再帰的に取得する関数
    global namelist, counter # グローバル変数を使う宣言
    for child in bone.children: # 子のボーンに対してループする
        newname = f"{selected_bone.name}{counter+1:02}" # 新しい名前をフォーマット文字列で生成する。選択したボーンの名前とカウンタ変数を使う。
        namelist.append((child.name, newname)) # リストに名前と新しい名前のペアを追加する。
        counter += 1 # カウンタ変数を増やす
        get_children(child) # 孫の階層も取得するために再帰呼び出しする

get_children(selected_bone) # 選択したボーンから子の階層を取得する

for name, newname in namelist: # リストから名前と新しい名前のペアを取り出す
    pb = obj.pose.bones.get(name) # ポーズボーンを取得
    if pb is None: # ポーズボーンが存在しない場合はスキップ
        continue
    pb.name = newname # 子のボーンに新しい名前を割り当てる

selected_bone.name = selected_bone.name+"01" # 最後に、選択したボーンに新しい名前を割り当てる

このスクリプトの使い方

アドオンは多用してもスクリプトはあまり使ったことないので忘備録

1.Blenderのテキストエディタを開き、メニュー-テキスト-新規作成して、コードをコピペします。
※一度作ったら削除しない限りそのBlenderファイルにずっとキープされます。

2.3Dエディタを開き、アーマチュアを選択し、ポーズモードにします

3.連続するボーンの根本のボーンを一つ選びます。必要ならボーンプロパティからリネームします。

4.テキストエディタの実行ボタンを押すと、選択したボーンとその子ボーンを取得し、選択したボーンの名前+2桁の連番でリネームします。

※複数選択したり、小ボーンが枝分かれしてると多分正常に動きません。
※コードを保存するには、txtで保存できます。スクリプトだからpy形式で保存するのが作法なのかもだけどテキストだし…

Blenderスクリプトは作りが簡単な代わりに見た目が不格好で、操作が感覚的でないのが難点です。
やろうと思えばUI付きのアドオンだってAIで作れるかもしれません。
しかし、それやると多分Blenderのバージョンによっては動作しないリスクが出て悩まされる気がします。揺れものボーンを作る・リネームする系のアドオンを検索していくつか探して試したけど、なんの説明もなく自分の環境ではエラー吐いて動作しなかったんで…
単純なスクリプトなら見た目は不格好でも動作する可能性は上がるし、エラーメッセージから手がかりを得て直せる(AIに直させることも)はず。

この記事が気に入ったらサポートをしてみませんか?