CG 日記

modoの「GL色」をランダムに設定するスクリプト

modoのマテリアルにある「GL色」をランダムに設定するスクリプトをAIに作ってもらいました。

 

「GL色」をランダムにするスクリプト

「GL色」をランダムに設定するスクリプトです。
これはマテリアルの確認や、透明なマテリアルのモデルを調整する場合に使えそうなスクリプトです。使用してる車のモデルはmodo17用として公開されていた「WarJeep_Yann-Goument.lxo」です。

 

テキストエディターにコードをペーストして、適当なファイル名を付けて保存して使ってください。拡張子は.py、Python 2.7用です。

@_kai_SetRandomGLColor.py

#!/usr/bin/env python
"""
modo16 Material GL Color Randomizer Script
Python 2.7 compatible with TDSDK

シーン内の全てのマテリアルのGL色をランダムに変更するスクリプト
"""

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 randomize_all_material_gl_colors():
    """
    シーン内の全てのマテリアルのGL色をランダムに変更する
    """
    try:
        # 1. 現在のシーンを取得
        scene = modo.Scene()
        
        # 2. シーン内の全てのマテリアルを取得
        materials = []
        for item in scene.items():
            if item.type == lx.symbol.sITYPE_ADVANCEDMATERIAL:
                materials.append(item)
        
        if not materials:
            lx.out("エラー: シーン内にマテリアルが見つかりません。")
            return
            
        lx.out("見つかったマテリアル数: %d" % len(materials))
        
        # 3. 元の選択状態を保存
        original_selection = scene.selected
        
        # 4. 各マテリアルを処理
        for material in materials:
            try:
                # マテリアル名を取得
                material_name = material.name
                
                # ランダムな色を生成
                r, g, b = get_random_color()
                
                # マテリアルを選択(名前を波括弧で囲む)
                scene.deselect()
                lx.eval("select.subItem {%s}" % material_name)
                
                # GL優先をONに設定
                lx.eval("item.channel advancedMaterial$glOverride true")
                
                # GL色を設定
                color_string = "{%.7f %.7f %.7f}" % (r, g, b)
                lx.eval("item.channel advancedMaterial$glColor %s" % color_string)
                
                lx.out("マテリアル '%s' のGL色を変更しました。RGB(%.3f, %.3f, %.3f)" % 
                       (material_name, r, g, b))
                
            except Exception as e:
                lx.out("マテリアル '%s' の処理中にエラーが発生しました: %s" % (material_name, str(e)))
                continue
        
        # 5. 選択解除
        scene.deselect()
        
        # 6. 元の選択状態を復元
        try:
            for item in original_selection:
                item.select(True)
                
            lx.out("処理完了: %d個のマテリアルのGL色を変更しました。" % len(materials))
            
        except Exception as e:
            lx.out("選択状態の復元中にエラーが発生しました: %s" % str(e))
            
    except Exception as e:
        lx.out("スクリプト実行中に予期しないエラーが発生しました: %s" % str(e))

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

 

「GL優先」トグルスクリプト

「GL優先」をON/OFFトグルで切り替えスクリプトです。
「GL優先」がON/OFFのマテリアルが混在している場合があるので、「GL優先」ONとOFFのマテリアルを数えて、多数派のトグルとして動作します。

 

テキストエディターにコードをペーストして、適当なファイル名を付けて保存して使ってください。拡張子は.py、Python 2.7用です。

@_kai_ToggleGLOverride.py

#!/usr/bin/env python
"""
modo16 Material GL Override Toggle Script
Python 2.7 compatible with TDSDK

シーン内の全てのマテリアルのGL優先をトグルするスクリプト
GL優先がONのマテリアルが多い場合はOFFに、OFFのマテリアルが多い場合はONにする
"""

import lx
import modo

def toggle_all_material_gl_override():
    """
    シーン内の全てのマテリアルのGL優先をトグルする
    多数派の状態を判定して、逆の状態に切り替える
    """
    try:
        # 1. 現在のシーンを取得
        scene = modo.Scene()
        
        # 2. シーン内の全てのマテリアルを取得
        materials = []
        for item in scene.items():
            if item.type == lx.symbol.sITYPE_ADVANCEDMATERIAL:
                materials.append(item)
        
        if not materials:
            lx.out("エラー: シーン内にマテリアルが見つかりません。")
            return
            
        lx.out("見つかったマテリアル数: %d" % len(materials))
        
        # 3. 元の選択状態を保存
        original_selection = scene.selected
        
        # 4. 各マテリアルの現在のGL優先状態を取得
        gl_override_states = []
        for material in materials:
            try:
                # マテリアルを選択
                scene.deselect()
                lx.eval("select.subItem {%s}" % material.name)
                
                # GL優先の現在の状態を取得
                try:
                    # チャンネル値を取得
                    gl_override = lx.eval("item.channel advancedMaterial$glOverride ?")
                    gl_override_states.append(gl_override)
                    lx.out("マテリアル '%s' のGL優先状態: %s" % (material.name, str(gl_override)))
                except:
                    # デフォルト値を仮定(通常はfalse)
                    gl_override_states.append(False)
                    lx.out("マテリアル '%s' のGL優先状態を取得できませんでした。デフォルト値(False)を使用。" % material.name)
                
            except Exception as e:
                lx.out("マテリアル '%s' の状態取得中にエラーが発生しました: %s" % (material.name, str(e)))
                gl_override_states.append(False)  # デフォルト値
                continue
        
        # 5. 多数派の状態を判定
        on_count = sum(1 for state in gl_override_states if state)
        off_count = len(gl_override_states) - on_count
        
        lx.out("GL優先 ON のマテリアル数: %d" % on_count)
        lx.out("GL優先 OFF のマテリアル数: %d" % off_count)
        
        # 多数派と逆の状態を決定
        if on_count > off_count:
            target_state = False
            target_state_str = "false"
            action_description = "OFF"
        else:
            target_state = True
            target_state_str = "true"
            action_description = "ON"
        
        lx.out("全マテリアルのGL優先を %s にします。" % action_description)
        
        # 6. 全てのマテリアルのGL優先を目標状態に設定
        success_count = 0
        for material in materials:
            try:
                # マテリアルを選択
                scene.deselect()
                lx.eval("select.subItem {%s}" % material.name)
                
                # GL優先を設定
                lx.eval("item.channel advancedMaterial$glOverride %s" % target_state_str)
                
                lx.out("マテリアル '%s' のGL優先を %s にしました。" % (material.name, action_description))
                success_count += 1
                
            except Exception as e:
                lx.out("マテリアル '%s' の設定中にエラーが発生しました: %s" % (material.name, str(e)))
                continue
        
        # 7. 選択解除
        scene.deselect()
        
        # 8. 元の選択状態を復元
        try:
            for item in original_selection:
                item.select(True)
                
            lx.out("処理完了: %d個のマテリアルのGL優先を %s にしました。" % (success_count, action_description))
            
        except Exception as e:
            lx.out("選択状態の復元中にエラーが発生しました: %s" % str(e))
            
    except Exception as e:
        lx.out("スクリプト実行中に予期しないエラーが発生しました: %s" % str(e))

# メイン処理の実行
if __name__ == "__main__":
    # GL優先トグル処理を実行
    toggle_all_material_gl_override()

 

 

「ゼロショット」、「ワンショット」、「フューショット」

AIに指示を出す場合、具体的な例を出すとスクリプト作成の成功率が上がります。これを「ゼロショット」、「ワンショット」、「フューショット」のように言うようです。

  • ゼロショット : 何も追加情報を与えずに指示する。AIが自力で考える。
  • ワンショット: 1つだけ例を与えて指示する。例に沿った結果を出す。
  • フューショット: 複数の例を与えて指示する。より正確な結果を出す。

前回オブジェクト毎にランダムな色のマテリアルを割り当てるスクリプトを作りましたが、今回は前回作成したPythonファイルを添付してスクリプトの作成を指示しました。

具体例を与えたからか、今回は最初に一度エラーが出ただけでスクリプトが完成しました。前回も具体的に使用するコマンドを書いた方がいいよと書きましたが、似た処理のスクリプトがある場合は、スクリプトを添付して指示すると成功率が上がるのでお勧めです。

今回は「GL色」をランダムにしていますが、例えば「スペキュラ色」など他のチャンネルを編集したい場合、このページで公開しているスクリプトを添付してあげれば成功率が上がると思うので試してみてください。

 

参考

Modo Tips



 

記事のまとめページ

コメント

  1. GON より:

    いつも拝見しています。
    AI面白いですね、常に「かしこまりました、できますよ」的に言ってくるに全然できていないことが多くて、自分がAI向きの文章の書き方を覚えないといけないです。

    ところで、今MODOでShock Diamondsという現象のような表現ができないかとトライしていますが、なかなか難しいです。色々なアプローチの方法があるとは思いますが、何かグッドアイデアないでしょうか?

    1. kai より:

      サイト見てくださってありがとうございます。AIはすぐ嘘情報言い出しますねw

      > Shock Diamonds
      こういうエフェクトはAfterEffectsで仕上げるのが良い気がします。

      1. modoで円柱と、円柱の中に潰した球を並べてモデルを作成、最後に円錐状に潰す
      2. グラディエントマップを使って質感調整する。またはモデル形状を使用したボリュームを使用してレンダリング。このとき円柱と球は別々にレンダリングする(modoのレンダリングで円柱と球を加算したりエッジをぼかす表現は難しいので)
      3. AfterEffectsで円柱と球を加算し、ブラーとグローで調整

      https://www.youtube.com/watch?v=b9ctURcZyLc
      https://www.youtube.com/watch?v=FzxZoVFK5Z4
      https://www.youtube.com/watch?v=59AgvfrMdGI

  2. 匿名 より:

    ありがとうございます。
    Youtube見ました。確かにAfterEffectsが一番見栄えが自然ですね。
    勉強します。

コメントを残す