オブジェクトをドライバー変数として使用する

Dec 04 2020

引数として2つのオブジェクトを期待するドライバー用の関数がありますが、変数をオブジェクトIDとして設定する方法が見つかりません。そのオブジェクトのプロパティは、1つだけです。それは可能ですか?

回答

3 lemon Dec 05 2020 at 14:37

ドライバをデータパスに設定し、パスとして「name」を使用できますが、その名前からオブジェクトを取得する必要があります。

この設定により、ユーザーはオブジェクトの名前を変更でき、ドライバーが壊れることはありません。

4 batFINGER Dec 05 2020 at 17:50

デプスグラフの使用

2.8にアップグレードすると、変数と同様に、depsgraphはドライバーのローカルのメンバーになります。回答を見る

ドライバー変数にさまざまなタイプのデータブロックを使用するにはどうすればよいですか?

テストドライバーの再設定。

例として、ドライバーは「キューブ」上にあります。オブジェクト「ランプ」はシーン内にあり、評価されたオブジェクトとしてdepsgraphを介してドライバーに渡されます。デプスグラフも使用できます。

def test(*args, depsgraph=None, **kwargs):
    for arg in args:
        print(arg)
    print(depsgraph)   
    return -1 # a simple val to indicate working

<bpy_struct, Object("Cube") at 0x7f62fcbefa08, evaluated>
<bpy_struct, Object("Lamp") at 0x7f62fcbf0008, evaluated>
<bpy_struct, Depsgraph at 0x7f62faba6c08>

depsgraph内の他のすべてのオブジェクトの最小グローバルzを返す例。オブジェクト名には@lemonのメソッドを使用できます。他のオプションは、カスタムプロパティまたは名前プレフィックスサフィックスを介してそれらにタグを付けることです。

def test(self, *args, depsgraph=None, **kwargs):

    z = min(o.matrix_world.translation.z for o in depsgraph.objects
    if o != self)

    return z  

Pointerproperties。

IMOオブジェクトを別のオブジェクトに関連付ける最良の方法は、ポインタプロパティを使用することです。

bpy.types.Object.driver_obj1 = bpy.props.PointerProperty(type=bpy.types.Object)

スクリプトまたはUIを介して割り当てることができます。

context.object.driver_object1 = context.scene.objects.get("Lamp")