Użyj obiektu jako zmiennej sterownika

Dec 04 2020

Mam funkcję dla sterownika, która oczekuje 2 obiektów jako argumentów i nie mogę znaleźć sposobu, aby ustawić zmienną jako identyfikator obiektu, tylko jedną właściwość tego obiektu. Czy to jest możliwe?

Odpowiedzi

3 lemon Dec 05 2020 at 14:37

Możesz ustawić sterownik na ścieżkę danych i użyć „nazwy” jako ścieżki, kosztem uzyskania obiektu z jego nazwy.

Dzięki temu ustawieniu użytkownik może zmienić nazwę obiektu, a sterownik nie zostanie uszkodzony.

4 batFINGER Dec 05 2020 at 17:50

Korzystanie z depsgraph

Od aktualizacji do wersji 2.8 depsgraph jest składnikiem lokalnych sterowników, podobnie jak zmienne. Zobacz odpowiedź do

Jak używać różnych typów bloków danych dla zmiennych sterownika?

ponowne ustawienie kierowcy testowego.

Na przykład sterownik znajduje się w „Cube”. Obiekt „Lampa” znajduje się w scenie i jest przekazywany kierowcy jako obiekt oceniany za pośrednictwem depsgraph. Można również użyć 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>

Przykład zwracania minimalnego globalnego z wszystkich innych obiektów w depsgraph. Do nazw obiektów można użyć metody @lemon. Innymi opcjami może być oznaczanie ich za pomocą właściwości niestandardowej lub sufiksu przedrostka nazwy.

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 Najlepszym sposobem na powiązanie obiektu (ów) z innym jest użycie właściwości wskaźnika

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

które można przypisać za pomocą skryptu lub interfejsu użytkownika.

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