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:

Description of the image

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:

Description of the image

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

Description of the image

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

Description of the image

Wybieramy Edit driver:

Description of the image

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:

Description of the image

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: rowerpython.zip