Tips

AIを使用してmodoのスクリプトを作成する方法

AIを使用して作成したスクリプトを公開しました。今回はどうやって作っているのか手順を解説したいと思います。

 

スクリプト概要

今回作成するスクリプトは、以下のような単純な物にしました。

  • 選択したアイテムにランダムな色のマテリアルを割り当てるスクリプト

3dsMaxのプリミティブオブジェクトのように、アイテムにランダムな色を設定するスクリプトを書いてもらう事にしました。modoの機能をテストしたい時に、オブジェクトに色が欲しい場合があります。

今回使用したAIはclaudeの無料版です。
https://claude.ai/

 

1.プロンプト作成

プロンプトは以下のような感じです。

modo16で選択した複数のアイテムに、それぞれ異なるマテリアルを割り当てるスクリプトを作成してください。Python2.7を使用しています。
処理は以下のような物を想定しています。
1. 選択中のアイテムを記録
2. アイテムに1つずつマテリアルを適用コマンドを実行してください"poly.setMaterial Random_1 {1.0 1.0 1.0} 0.8 0.04 true false false"
3. マテリアル名"Random_1"の連番は、選択アイテムに応じてカウントアップしてください。
4. マテリアル色はランダムに変更してください。明度は変更せず彩度だけランダムに変化するように色を変更してください {1.0 1.0 1.0}

基本は処理順に内容を箇条書きにします。
poly.setMaterial Random_1 {1.0 1.0 1.0} 0.8 0.04 true false falseはmodoのマテリアル適用コマンドと引数です。基本的にAIはmodoのコマンドや引数を知りません。ただ指示するだけだと存在しないコマンドや引数を使用してエラーを出すので、マクロのようにmodoのコマンドと引数を書いてあげると動作するスクリプトを作成してくれます。

AIは自然言語処理によって指示内容を理解するので「選択中のアイテムを記録」「 マテリアル名のカウントアップ」のような抽象的な指示で大丈夫です。「明度は変更せず彩度だけランダム」の部分は「明度は変更せず、彩度と色相をランダムに」と書きたかったのですが指示ミスってます。最終的にMaxっぽくなったのでヨシ。このあたりの処理はmodoと関係ないので、よくある処理なら勝手にそれっぽく作ってくれます。

 

2. スクリプトの実行

作成されたスクリプトを実行すると「イベントログ」に以下のようなエラーが発生しました。エラーを伝えます。

アイテム選択の取得中にエラーが発生しました: 'module' object has no attribute 'iSELTYP_ITEM'

 

3. エラーの修正

修正したスクリプトでもエラーが発生したので、「TD SDKを参照して修正してください」と指示します。
https://learn.foundry.com/modo/developers/latest/SDK/index.html

 

4. 完成

TD SDKを指定すると、ちゃんと動くスクリプトを作成してくれました。

@_kai_SetRandomColorMaterial.py

#!/usr/bin/env python
"""
modo16 Multiple Material Assignment Script
Python 2.7 compatible

選択された複数のアイテムにそれぞれ異なるマテリアルを割り当てるスクリプト
"""

import lx
import modo
import colorsys
import random

def get_random_color():
    """
    ランダムな色を生成する(明度固定、彩度ランダム)
    HSVカラーモデルを使用して、明度を1.0(最大)、彩度をランダムに変化させる
    
    Returns:
        tuple: RGB値のタプル (r, g, b) 各値は0.0-1.0の範囲
    """
    # 色相をランダムに選択(0.0-1.0)
    hue = random.random()
    
    # 彩度をランダムに選択(0.3-1.0の範囲で、あまり薄い色にならないように)
    saturation = random.uniform(0.3, 1.0)
    
    # 明度は固定(1.0 = 最大明度)
    value = 1.0
    
    # HSVからRGBに変換
    r, g, b = colorsys.hsv_to_rgb(hue, saturation, value)
    
    return (r, g, b)

def assign_materials_to_selected_items():
    """
    選択されたアイテムにそれぞれ異なるマテリアルを割り当てる
    """
    try:
        # 1. 現在のシーンと選択されたアイテムを取得
        scene = modo.Scene()
        selected_items = scene.selected
        
        if not selected_items:
            lx.out("エラー: アイテムが選択されていません。")
            return
            
        lx.out("選択されたアイテム数: %d" % len(selected_items))
        
        # 2. 各アイテムにマテリアルを適用
        for index, item in enumerate(selected_items):
            try:
                # マテリアル名の生成(1から開始)
                material_name = "Random_%d" % (index + 1)
                
                # ランダムな色を生成
                r, g, b = get_random_color()
                
                # マテリアル適用コマンドの構築
                # poly.setMaterial [name] {r g b} [roughness] [metallic] [subsurface] [emission] [clearcoat]
                color_string = "{%.3f %.3f %.3f}" % (r, g, b)
                
                # アイテムを選択してからマテリアルを適用
                scene.deselect()
                item.select()
                
                # マテリアル適用コマンドを実行
                command = "poly.setMaterial %s %s 0.8 0.04 true false false" % (material_name, color_string)
                lx.eval(command)
                
                lx.out("アイテム %s にマテリアル '%s' を適用しました。色: RGB(%.3f, %.3f, %.3f)" % 
                       (item.name, material_name, r, g, b))
                
            except Exception as e:
                lx.out("アイテム %s へのマテリアル適用中にエラーが発生しました: %s" % (item.name, str(e)))
                continue
        
        # 3. 元の選択状態を復元
        try:
            scene.deselect()
            for item in selected_items:
                item.select(True)  # Trueで追加選択
                
            lx.out("処理完了: %d個のアイテムにマテリアルを適用しました。" % len(selected_items))
            
        except Exception as e:
            lx.out("選択状態の復元中にエラーが発生しました: %s" % str(e))
            
    except Exception as e:
        lx.out("スクリプト実行中に予期しないエラーが発生しました: %s" % str(e))

# メイン処理の実行
if __name__ == "__main__":
    # シード値を設定(再現性のため、必要に応じてコメントアウト)
    # random.seed(42)
    
    # マテリアル割り当て処理を実行
    assign_materials_to_selected_items()

 

以上がAIを使用したmodo用スクリプト作成の手順です。エラーが出たらTD SDKを指示することで、エラーを適切に修正できることがわかると思います。

以下気づいた事です。

  • 一発でスクリプトを作成できるプロンプトを作れるか簡単に試しましたが駄目でした。何かしらエラーが出るので、エラーの内容を伝えてTD SDKで修正指示する必要がありそうです 。
  • エラーが出ない場合は「エラーは出ませんが、マテリアルが作成されません」のように具体的な情報を与えると改善する場合があります。「段階的にメッセージをprintしてください」のようにどの段階の処理で動かないのかデバッグメッセージを出力させることも効果的です。
  • ChatGPT、Geminiで同じスクリプトの作成を試みましたが、ChatGPTはスクリプトを作成できました。Geminiは外部のSDKを参照できないので駄目そうでした。
  • ChatGPTよりclaudeの方がコードが長くなる傾向がある気がします。
  • .pyファイルに保存して使用する場合は、最初に#!/usr/bin/env pythonが必要です。これが無いとスクリプト実行時に「不明なスクリプト」のようなエラーが出て動きません。
  • modo内のスクリプトエディタで動作するスクリプトと、.pyファイルに保存しないと動作しないスクリプトがあるようです。前に公開した2つのスクリプトはmodoのスクリプトエディタで動作しますが、今回のスクリプトはmodo内のスクリプトエディタで動作しません。
    AIに質問したところいくつか動作しない場合があるようで、今回のスクリプトの場合は__name__ == "__main__"のチェックがうまく動作してないんじゃね?と言われましたが、スクリプト何もわからないので正解なのか不明です。

このくらいの単純なスクリプトであれば10~15分程度で作れます。modoのマクロを少し拡張したようなスクリプトであれば、わりと簡単にスクリプトを書いてくれるので便利ですね。

コメントを残す