Każdy samolot ma wiele części, które mogą się obracać lub przedsuwać – np. jego powierzchnie sterowe. Na ziemi, czy w locie, często nie są w pozycji neutralnej. Podczas tworzenia modelu Ła-5 starałem się znaleźć najprostszą metodę do sterowania jego ruchomymi częściami. Ten poradnik pokaże rozwiązanie, które chciałbym zaproponować. Jeżeli chesz powtórzyć lub sprawdzić szczegóły przypadków opisanych poniżej, pobierz model Ła-5. Nie zapomnij przejrzeć także opisu jego struktury – ułatwi Ci to zrozumienie tego tekstu.

Dla aktualnej wersj Blendera (2.8) pobierz ten plik wtyczki Handle Panel.

Do szybkiego tworzenia obiektów bazowych uchwytów możesz użyć tego dodatkowego narzędzia (dla Blendera 2.8). Wstawia ono obiekt Empty jako "rodzica" (ang. parent) wskazanego obiektu (w tym przypadku: uchwytu). Resetuje ono także lokalny układ współrzędnych uchwytu, umożliwiając bardziej intuicyjne ustawienia ograicznika "Limit Location".

Dla Blendera 2.7 i 2.6 pobierz plik ten plik wtyczki Handle Panel opisanej w sekcji 4 tego poradnika.

Dla Blendera 2.4, pobierz plik skryptu HandlePanel.py opisany w sekcji 3 tego poradnika.

1. Najprostszy przypadek - owiewka kabiny

Owiewka kabiny Ła-5 otwierała się poprzez odsunięcie do tyłu, wzdłuż szyn (patrz Fig. 1.1).

Fig. 1.1. Owiewka kabiny, i jej szyny.

Możesz ją "ręcznie" przesunąć wzdłuż tych szyn. Będziesz jednak musiał zawsze uważać, by nie odsunąć jej za daleko - byłoby to nierealistyczne. Czy jest coś w Blenderze, co automatycznie ograniczy ruch tej części, by nie mogła "wypaść ze swoich torów"?

Tak, coś takiego istnieje. To ograniczniki (constraints) - jedne z wielu dostępnych w Blenderze modyfikatorów obiektu. Zdecydowałem nie zastosować ich bezpośrednio do osłony kabiny. Czasami to może być trudne, wybrać ją spośród innych elementów modelu. W istocie jest to zespół, zbudowany z czterech części: szkieletu ze stalowych rurek, zewnętrznej ramki z blachy duralowej, umieszczonego pomiędzy nimi szkła organicznego, i małej klamki. To wszystko jest odwzorowane w w modelu. Szkielet z rur stalowych jest "rodzicem" (parent) pozostałych elementów. Jeżeli nie "wcelujesz" w niego podczas selekcji, możesz niechcący zaznaczyć obiekt modelujący szkło. Przesuń go, a efekt będzie daleki od tego, co zamierzałeś. Lepszym pomysłem jest stworzenie sztucznego "uchwytu", który będzie umieszczony w łatwo dostępnym miejscu. Taki uchwyt byłby "rodzicem" całej owiewki. Fig. 1.2 i 1.3 pokazują rozwiązanie:

Fig. 1.2. Dodatkowe, pomocnicze obiekty: uchwyt i jego baza.

Dodałem do owiewki kabiny uchwyt – 019.Hood.Handle. Jest "rodzicem" (parent) całego zespołu, który będzie podążał za jej ruchami. Aby ułatwić zaznaczanie, Hood.Handle umieściłem daleko od "chmury" pozostałych obiektów modelu.

Fig. 1.3. Hierarchia tego fragmentu.

W zamyśle, użytkownik powinien używać obiekt Hood.Handle do przesuwania owiewki. Należy go umieścić na oddzielnej warstwie, która będzie ukryta podczas renderowania. Aby ograniczyć jego możliwość ruchu do przesunięcia wzdłuż szyn, dodałem drugi, pusty obiekt – 019.Handle.Pos. Jet to nieruchoma “baza” dla Hood.Handle. Obiekt Handle.Pos jest "przymocowany" do kadłuba samolotu. Obiekt Hood.Handle otrzymał ogranicznik, który pozwala mu na ruch po prostej wzdłuż odcinka odpowiadającego szynom. Ustawienia ogranicznika pokazuje Fig. 1.4.

Fig. 1.4. Ogranicznik, wymuszający ruch "uchwytu" owiewki do odcinka wzdłuż osi Y (tak wyglądał w Blenderze 2.45).

Przyjrzyjmy się ustawieniom z Fig. 1.4. (Fig. 1.4 pokazuje, jak to wyglądało w Blenderze 2.45. Zakres ruchu był wtedy wyrażany we współrzędnych względnych w stosunku do "rodzica" uchwytu. Uważam, że na takich współrzędnych najlepiej widać ideę działania tego modyfikatora. Jego nowszą wersję pokazuje Fig. 1.5). Jedyny dozwolony ruch dla obiektu Hood.Handle jest wzdłuż osi Y. Ponieważ przełącznik Local jest włączony, odległości minY .. maxY są mierzone od "rodzica" Hood.Handle – obiektu Handle.Pos. Jest to jedyna przyczyna istnienia Handle.Pos – wyznacza "neutralne" ("spoczynkowe"?"domyślne"?) położenie uchwytu. Czasami mogłoby byc trudnym lub niemożliwym użyć do tego jakiejkolwiek innej części modelu – mają swoje środki w innych miejscach, i nie zawsze można je przemieścić. Dlatego zdecydowałem się użyć do tego celu obiekt Empty.

W późniejszych wersjach Blendera uległa zmianie konwencja określania zakresów w ograniczniku Limit Location. Obecnie należy tam wpisywać położenie uchwytu odczytane z okna Transform Properties (Fig. 1.5):

Fig. 1.5. Obecna panel ograniczenia Limit Location (taka, jaka była w Blenderze 2.49)

Tak więc – oto pierwszy efekt. Możesz łatwo "złapać" uchwyt, w jakiejkolwiek projekcji, nie martwiąc się o kierunek i odległość przesunięcia. Uchwyt “zna” swą jedyną możliwą drogę, i nigdy nie przekroczy granic przypisanej ścieżki:

Fig. 1.5. Możesz teraz przesuwać uchwyt “byle jak” – on sam wie, gdzie ma się znaleźć, i nie pozowli na żaden błąd.
2. Przypadek złożony – system chłodzenia silnika

Sterowanie owiewką było prostym przypadkiem. Poznasz prawdziwą "moc" takich rozwiązań, analizując system, jaki opracowałem do odwzorowania systemu chłodzenia silnika. Jego elementy pokazuję na Fig. 2.1:

Fig. 2.1. Ruchome części systemu chłodzenia silnika w Ła-5.

W prawdziwym samolocie wszystkie części, pokazane na Fig. 2.1, były sterowane oddzielnie. Z zaskoczeniem stwierdzili to Niemcy, badając w Rechlinie zdobyczny Ła-5. Na pewno nie ułatwiało to pilotażu. Nie jest to jednak wyjątek: we wczesnych F4U Corsair każda z kilkunastu klapek wokół osłony silnika miała w kabinie swoją własną dźwignię! Mimo to położenie zasłon układu chłodzenia było zawsze mniej więcej zsynchronizowane: otwarte przy małej prędkości (lub na ziemi), i niemal zamknięte przy dużej prędkości. Byłoby najlepiej, gdyby wszystkie te części poruszały się, sterowane pojedynczym uchwytem. Lecz jak uzyskać taki efekt? Zasłony wylotu obracają się wokół ukośnych osi. Klapa chłodnicy oleju ma dwa popychacze, które powinny podążać za jej ruchem. I w dodatku z przodu znajdują się dwa pierścienie klapek zasłaniających wlot powietrza. Każda z klapek (zasłon) obraca się wokół własnej osi - jeden pierścień zgodnie z kierunkiem zegara, drugi - w przeciwnym. Jak powiązać te wszystkie ruchy z przesunięciem pojedynczego uchwytu?

No cóż, rozwiązanie to coś w rodzaju "wirtualnego mechanizmu", którego elementy pokazuje Fig. 2.2:

Fig. 2.2. “Wirtualna maszyna”, która porusza systemem chłodzenia.

Przesunięcie uchwytu jest ograniczone przez więzy Limit Location, względem swego "rodzica" – pustego obiektu Handle.Pos. To rozwiązanie już znasz z poprzedniej sekcji tego poradnika. Przesunięcie uchwytu porusza inne pomocnicze (puste) obiekty. (Są do niego "przymocowane" relacją "parent"). Obiekty te są śledzone, za pomocą ogranicznika Locked Track, przez “przekładnie”, umieszczone pomiędzy zasłonami wylotu. Cylinder, znajdujący się za nimi, symetrycznie przenosi ruch lewej zasłony wylotu na prawą (za pomocą ogranicznika Stretch To). Podwójne koła przekładni używają ogranicznika Locked Track do zamiany przesunięcia uchwytu w obrót - jedna przekładania na zgodny z kierunkiem zegara, druga - na przeciwny. Ich obrót jest powtórzony przez koła umieszczone wewnątrz pierścieni zasłon wlotu. Do tych kół są promieniście przymocowane puste obiekty - "cele" dla poszczególnych klapek zasłaniających wlot. Każda klapka obraca się wokół własnej osi, śledząc swój "cel" za pomocą ogranicznika Locked Track.

Ta "wirtualna maszyna" używa ograniczeń, które były dostępne w Blenderze 2.43 (w tej wersji wykonywałem ten model). W nowszych wydaniach Blendera Aligorth (programista odpowiedzialny za ten zakres funkcji) dodał więcej nowych typów. Jednym z nich jest ograniczenie Transformation, którego możesz używać jako "uniwersalnej przekładni". Gdyby go użyć, mechanizm okapotowania silnika Ła-5 byłby prostszy. (Przykład zastosowania ograniczeń Transformation możesz zobaczyć w moim kolejnym modelu P-40B)

Co więcej, w Blenderze 2.43 ograniczenie Limit Location działało tylko wzdłuż osi globalnego układu współrzędnych. (Nawet wtedy, gdy miało włączoną opcję Local!). Gdy próbowałem obrócić model, "rozjeżdżały" mi się z tego powodu ruchome części osłony silnika... To było pierwszym impulsem do napisania skryptu Pythona, który umożliwiłby pokonanie tych problemów. W efekcie, stworzyłem uniwersalną "panel sterowania" do pozowania modelu. Nazwałem ją Handle Panel. I choć ograniczenia Limit Location już dawno naprawiono, zdecydowanie łatwiej jest sterować wszystkimi ruchomymi częściami za pomocą jego paneli, zamiast wyszukiwać w modelu uchwytów, które mogą się czasami kryć w dość zaskakujących punktach przestrzeni.

3. Użycie skryptu Handle Panel (Blender 2.4)

Skrypt Pythona, którego można użyć do ustalania położenia wszystkich ruchomych części. nosi nazwę HandlePanel.py, i można go pobrać stąd. Zapisz go do folderu skryptów Blendera. Powinien się pojawić w oknie skryptów (Scripts Window), jako polecenie menu Scripts=>Misc=>Handle Panel. Ten skrypt jest także zawarty w modelu Ła-5, jako jeden z bloków danych edytora tekstów. Możesz go uruchomić także stamtąd, naciskając [Alt]-[P].

Dla modelu Ła-5 ekran Handle Panel w Blenderze 2.4 wygląda jak na Fig. 3.1:

Fig. 3.1. Panel uchwytów dla modelu Ła-5 (Blender 2.4).

Skrypt wyszukuje w modelu każdy istniejący uchwyt, i tworzy dla niego pojedynczy panel, który zawiera trzy zakładki: Pos, Cockpit, Label. Na Fig. 3.1 widać dziesięć takich paneli.

  • Zakładka Pos: użyj jej do do ustalenia aktualnej pozycji zespołu (w istocie: uchwytu). Przesuń suwak Position, lub po prostu wpisz wartość - pomiędzy 0% i 100%. Zwróć uwagę na model – będzie na bieżąco odwzorowywał Twoje zmiany. Nie musisz pamiętać, gdzie jest neutralne położenie uchwytu. Po prostu naciśnij przycisk Reset, aby ustawić ruchomy zespół w stan “spoczynku”. Zazwyczaj położenie neutralne to 0% lub 100%. Niektóre powierzchnie sterowe mają je w 50% (ponieważ mogą być obracane w dwie strony);
  • Zakładka Label: opcjonalna. Użyj jej, aby ustalić nową nazwę ruchomego zespołu. (zob np. 05. Flaps na Fig. 3.1). Początkowo, nazwy zespołów to nazwy ich uchwytów (obiektów uchwytu). Na przykład dla osłony kabiny mielibyśmy panel “019.Hood.Handle”. Możesz je zmienić na coś bardziej zrozumiałego. Sugerowałbym użycie numerycznych przedrostków, ponieważ panele na ekranie są wyświetlane w porządku alfabetycznym ich nazw. Taki przedrostek pozwoli Ci sterować ich pozycją w oknie skryptów;
  • Zakładka Cockpit: [*Przestarzałe, odkąd pojawił się Blender 2.48 - lepiej jest teraz używać do tego celu ograniczenia Transformation*] opcjonalna – może być pusta. Użyj jej do “synchronizacji” położenia lub obrotu dowolnego obiektu z pozycją uchwytu. (Zobacz np. element 02. Rudder na Fig. 3.1). Używam tej zakładki dla określenia, które kontrolki w kabinie mają podążać za ruchem sterów czy lotek samolotu. W pole OB należy wpisać nazwę synchronizowanego obiektu. (Kiedy klikniesz przycisk […] po jego prawej – w pole OB zostanie wlejona nazwa obiektu aktywnego). Przyciskiem menu, poniżej, możesz wybrać jedną z 6 możliwych transformacji, która ma być synchronizowana z ruchem uchwytu. Wreszcie pola Min i Max pozwalają wpisać zakres przesunięcia lub obrotu (Min odpowaida suwakowi w położeniu 0%, Max - to 100%). Ta zakładka może być także użyta dla synchronizacji obiektów spoza kabiny. Gdy przyjrzysz się panelowi 00. Propeller, odkryjesz, że w tym zespole jest obiekt bazowy (Handle.Pos) i uchwyt, które bezpośrednio nie zmieniają niczego. Oś śmigła obraca się, ponieważ jest zsynchronizowana z uchwytem poprzez zakładkę Cockpit. To była najprostsza metoda uzyskania obrotu większego niż 360 stopni.
  • 4. Użycie dodatku Handle Panel (Blender 2.5)

    Używam tego dodatku do wygodniejszego sterowania ruchomymi częściami modelu. Jego plik nosi nazwę scene_handle_panel.py, i jest udostępniony tutaj. Pobierz go, i dodaj do Twojego Blendera. (Tutaj znajdziesz opis, jak to zrobić).

    Gdy włączysz ten dodatek, w edytorze właściwości, zakładce Scene ujrzysz jego panel (Handle Panel - Fig. 4.1):

    Fig. 4.1. Panel główna wtyczki - stan początkowy (Blender 2.5).

    Gdy naciśniesz przycisk Show/Refresh na tym panelu, skrypt przeszuka Twój rysunek i wyświetli dla każdego znalezionego uchwytu odrębną panel sterowania (Fig. 4.2):

    Fig. 4.2. Panele sterowania modelem La-5 (Blender 2.5).

    Każda z paneli sterowania zawiera trzy kontrolki: Pos, Reset, Label. Pokazuje je Fig. 4.2.

  • suwak Pos: użyj jej do do ustalenia aktualnej pozycji zespołu (w istocie: uchwytu). Przesuń suwak Position, lub po prostu wpisz wartość - pomiędzy 0% i 100%. Zwróć uwagę na model – będzie na bieżąco odwzorowywał Twoje zmiany.
  • przycisk Reset: użyj go by ustawić ruchomy zespół w stan "spoczynku". Zazwyczaj położenie takie neutralne to 0% lub 100%. Niektóre powierzchnie sterowe mają je w 50%, ponieważ mogą być obracane w dwie strony. Pozycja neutralna znajduje się zawsze w środku (punkcie 0,0,0) lokalnego układu współrzędnych uchwytu. (Współrzędne obiektu Blendera wyświetlane w panelu Transform w oknie właściwości obiektu to właśnie współrzędne w jego układzie lokalnym);
  • przycisk Label: opcjonalna. Użyj jej, aby ustalić nową nazwę ruchomego zespołu. (zob np. 05. Flaps na Fig. 4.2). Początkowo, nazwy zespołów to nazwy ich uchwytów (obiektów uchwytu). Na przykład dla osłony kabiny mielibyśmy panel “019.Hood.Handle”. Możesz je zmienić na coś bardziej zrozumiałego. Sugerowałbym użycie numerycznych przedrostków, ponieważ panele na ekranie są wyświetlane w porządku alfabetycznym ich nazw. Taki przedrostek pozwoli Ci sterować ich pozycją w zakładce Scene;
  • 5. Przygotowanie panelu uchwytów dla Twojego modelu.

    Przy uruchomieniu, skrypt Handle Panel szuka w aktualnej scenie obiektów - uchwytów, które mogą być pokazane na panelu. Oznacza to, że możesz go użyć do dowolnego modelu. Na panelu powstanie zespół zakładek dla każdego obiektu, który:

  • ma nazwę, zakończoną przyrostkiem “.Handle” (stąd np. nazwa "019.Hood.Handle");
  • ma przypisany obiekt nadrzędny (chodzi tu o relację "parent"). Środek obiektu nadrzędnego jest traktowany przez skrypt jako neutralne położenie uchwytu;
  • ma ogranicznik Limit Location, z włączonym przełącznikiem [Local];
  • Obiekt 019.Canopy.Handle, którego zespół jest pokazany szczegółowo na Fig. 1.2 – 1.4, jest przykładem uchwytu. Stwórz podobne obiekty w swoim modelu. To zależy od Ciebie, jaki ruch będzie do nich “podpięty”. Stwórz odpowiednie "mechanizmy" i sprawdź je, przesuwając uchwyt wzdłuż predefiniowanego toru, z aktywnym ogranicznikiem Limit Location. Skrypt Handle Panel jest w stanie użyć informacji z tego więzu do poruszania uchwytem.

    6. Wykorzystanie w animacji samolotu.

    Obiekty “uchwytów” są także przydatne w animacji: wystarczy podłączyć je do zbioru krzywych IPO. Użyj Handle Panel.py aby ustawić uchwyt we właściwej pozycji dla każdej klatki kluczowej. Zauważ, że wiele uchwytów na Ła-5 (steru kierunku, ster wysokosci, śmigło, lotki i sloty) ma juz przypisane krzywe IPO. Ich klatki kluczowe zostały stworzone za pomocą skryptu Handle Panel.py, a o klatki przejściowe zadbały już IPO.

    Fig. 6.1. Krzywa IPO, przypisana do osi śmigła (004.Prop.Axis), w modelu Ła-5.

    Fig. 6.1 pokazuje krzywą IPO, która steruje obrotem śmigła. Klatki kluczowe dla tej krzywej zostały wstawione za pomocą Panelu Uchytów. Ten ruch jest używany także podczas renderowania pojedynczych obrazów w locie. Wywołuje wrażenie rozmycia łopat smigła. Wystąpi, gd włączysz w ustawieniach Renderera przełącznik MBLUR.