Blender. Kopiowanie rotacji w jedną stronę.

Szybka wieczorna wprawka z Pythona w Blenderze.

Zadanie:

Zrobić tak, żeby obiekt kopiował rotację drugiego, ale tylko w jedną stronę – na przykład tak jak działa napęd w rowerze – kręcąc pedałami do przodu obracamy kołem, a kręcenie do tyłu nie ma wpływu na rotację koła.

Wygląda to tak:

Działamy.

Uruchamiamy Blendera, tworzymy kostkę udającą pedały i dysk udający koło.

Obu obiektom nadajemy Constraint Limit Rotation i blokujemy rotację po osiach Y i Z:

Przechodzimy do Scripting i tworzymy skrypt o treści:

import bpy

last_x = 0
disc_x = 0

def limit_value(x):
    global last_x
    global disc_x

    if x > last_x:
        disc_x = disc_x + (x - last_x)

    last_x = x
    return disc_x

bpy.app.driver_namespace["limit_value"] = limit_value

Uruchamiamy ten skrypt wybierając z menu Text->Run script lub klikając Alt-P.

Wracamy do okienka zakładki Modeling, wybieramy nasz dysk i w menu Transform (wciskamy N jeśli go nie widać) klikamy prawym klawiszem myszki na polu Rotation: X

Wybieramy Edit driver:

W okienku które się pojawi wybieramy Type: Scripted expression, w Expression wpisujemy: limit_value(var).

Jako Input value wybieramy (x) var i jako Object: wybieramy naszego Cube udającego pedały.

Tak jak na zrzucie poniżej:

I tyle – teraz obracanie kostki w lewo obraca dysk w lewo a obracanie kostki w prawo nie wpływa na obrót dysku.

Dla leniwych .blend: