Gunakan objek sebagai variabel Driver

Dec 04 2020

Saya memiliki fungsi untuk driver yang mengharapkan 2 objek sebagai argumen, dan saya tidak dapat menemukan cara untuk mengatur variabel sebagai ID Objek, hanya satu properti dari objek itu. Apakah itu mungkin?

Jawaban

3 lemon Dec 05 2020 at 14:37

Anda dapat mengatur driver ke jalur data dan menggunakan "nama" sebagai jalur, dengan biaya mendapatkan objek dari namanya.

Dengan pengaturan ini, objek dapat diganti namanya oleh pengguna dan driver tidak akan rusak.

4 batFINGER Dec 05 2020 at 17:50

Menggunakan depsgraph tersebut

Sejak upgrade ke 2.8, depsgraph adalah anggota dari driver lokal, seperti juga variabelnya. Lihat jawaban untuk

Bagaimana cara menggunakan tipe blok data yang berbeda untuk variabel driver?

menyiapkan ulang test driver.

Sebagai contoh, driver ada di "Cube". Objek "Lamp" ada dalam adegan, dan diteruskan sebagai objek yang dievaluasi ke pengemudi melalui depsgraph. Depsgraph juga bisa digunakan.

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>

Contoh untuk mengembalikan z global minimum dari semua objek lain di depsgraph. Metode @lemon dapat digunakan untuk nama objek. Opsi lain dapat memberi tag mereka melalui properti khusus atau akhiran nama awalan.

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

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

    return z  

Properti penunjuk.

IMO cara terbaik untuk mengasosiasikan sebuah objek dengan yang lain adalah melalui properti pointer

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

yang dapat ditetapkan melalui skrip atau UI.

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