4 edycja
warsztatów zakończona

Modo - modelowanie 3D oraz Python

Published: Wed 24 June 2015

Modo to jedna z wielu aplikacji do tworzenia oraz obróbki grafiki 3D, początkowo rozwijana przez firmę Luxology, a następnie, po połączeniu dwóch firm, przez markę The Foundry. Modo, obok Blendera czy LightWave, które wspierają skryptowania w Pythonie, wprowadza również skryptowania w Lua czy Perlu. The Foundy wydaje równolegle kilka innych aplikacji poza Modo, które wspomagają pracę przy grafice komputerowej.

Trochę o Modo - historia, koszty, możliwości.

Grupa developerów, która stworzyła tę aplikację, początkowo pracowała przy rozwijaniu LightWave’a. Podczas pracy w NewTek, w 2001, nie pozwolono im przepisać workflow, co spowodowało rozpoczęcie prac nad Modo. Po raz pierwszy Modo zostało pokazane w 2004 roku podczas konferencji Siggraph, a przez kolejne lata wprowadzono wiele usprawnień. W wersji 701 wprowadzono możliwość skryptowania w Pythonie. Na chwilę obecną ostatnia stabilna wersja to 801. Początkowo Modo wspierało tylko jedną platformę, czyli Windowsa, natomiast w tej chwili jest dostępne również na Linuxa, a także OS X - wszystkie systemy obsługiwane są tylko w architekturze 64-bit.

The Foundry umożliwia sprawdzenie Modo przez 30 dni, po tym czasie mamy kilka możliwości zakupu lincencji. Do wyboru jest:

  1. licencja indywidualna (na jeden komputer), która kosztuje 999 GBP lub odpowiednio przeliczona na euro lub dolary amerykańskie.
  2. licencja indywidualna z możliwością przenoszenia na różne komputery - cena tutaj wzrasta o 200 GBP.
  3. można też kupić lub wynająć aplikację w dwóch zestawach:
    • Production Collective - zestaw aplikacji Modo, Mari oraz Nuke Studio
      • koszt zakupu takiego pakietu to 6000 GBP
      • koszt wynajęcia to 1800 GBP za kwartał - maksymalnie na 3 kwartały
    • Creation Collective - zestaw aplikacji Modo, Mari, Hiero Player
      • zakup takiego pakietu to koszt 1550 GBP
      • wynajęcie to koszt 465 GBP za kwartał - maksymalnie 3 kwartały.

W trakcie tych 30 dni mamy dostęp do pełnej funkcjonalności aplikacji, która dysponuje bardzo dużą liczbą narzędzi. Nie da nam to jednak szans na poznanie wszystkich możliwości programu. Po okresie testowym zostaje wrażenie spotkania z kombajnem do grafiki 3D i tak też właśnie jest.

interfejs modo Rysunek 1. Modo - interfejs użytkownika zaraz po uruchomieniu

Modo GUI czyli interfejs użytkownika

Foundry w interfejsie użytkownika zastosowało bardzo ciekawe rozwiązane. Jeżeli wcześniej korzystaliśmy z innych programów do obróbki grafiki 3D i przyzwyczailiśmy się do zastosowanego tam sposobu obsługi kamery czy przestrzeni roboczej, możemy w łatwy sposób dostosować ustawienia do wcześniej używanej aplikacji. Dzięki temu ułatwi nam to pierwsze kroki w Modo. Kolejną ciekawą rzeczą jest możliwość ustawienia własnego interfejsu z najbardziej potrzebnymi funkcjami. Mamy możliwość wyczyszczenia całego widoku i dodawania kolejnych elementów, aby dopasować sposób pracy do własnych potrzeb. Każde z dodanych okienek wewnątrz aplikacji może zostać zmodyfikowane, czy też przesunięte w odpowiednie dla nas miejsce. Zastosowanie pływających okienek daje nam możliwość wykorzystywania najróżniejszych narzędzi w bardzo szybkim tempie. Modo posiada również dziennik zdarzeń, który pozwala śledzić zadane polecenia oraz zawiera funkcję przeszukiwania dostępnych poleceń. Okienko to znajduje się po prawej stronie na samym dole, jest zminimalizowane do linii komend. Dzięki zastosowanemu GUI w Modo, mamy możliwość rozciągnięcia lub wyciągnięcia tego okienka.

historia poleceń modo Rysunek 2. Zakładka historii poleceń

Na rysunku powyżej widać okienko z zakładkami, które umożliwiają przeglądanie historii poleceń i z informacjami na temat modyfikacji danego obiektu. Dysponujemy tutaj zakładką “Commands”, która zawiera dostępne polecenia pogrupowane tematycznie, informację, w jaki sposób wywołać dane polecenie, jakie parametry są wymagane, a jakie opcjonalne oraz jakiego one są typu. Okienko to bardzo przydaje się podczas pisania własnego zestawu narzędzi i wtedy dopiero w pełni pokazuje swoją użyteczność.

Kit lub plugin - jak zacząć?

Oczywiście w przypadku, gdy powtarzamy przy różnych projektach czynności z obiektami, czy też brakuje nam jakiejś funkcjonalności, mamy możliwość zakupu dodatkowych pluginów i kitów. Ceny pluginów wahają się od 199 do 329 funtów, natomiast cena kitów to od 45 do 129 funtów. Jeżeli jednak nie znajdziemy niczego, co nas interesuje, Modo daje nam pole do popisu i stworzenie własnego zestawu narzędzi. Tak jak wcześniej pisałem, mamy możliwość wybrania spośród trzech języków - Lua, Perl i Python. Od wersji 701 Modo można użyć Pythona w wersji 2.6, natomiast w wersji 801 jest już dostępny Python 2.7. Niestety na chwilę obecną nie ma możliwości pisania w wersji Python 3.

Pierwszym krokiem, aby rozpocząć pracę na kitem jest stworzenie katalogu, gdzie będziemy trzymać nasze skrypty oraz plik konfiguracyjny. Plik konfiguracyjny to dokument XML zapisany z roszerzeniem *.cfg.

<?xml version="1.0" encoding="UTF-8"?>
<configuration kit="Kit_Name" version="1.0.2a">
  <import>utils</import>
  <atom type="ScriptSystem">
    <hash type="ScriptAlias" key="applymesh">pyscripts/applyMesh.py</hash>
    <atom type="Attributes">
    <hash type="Sheet" key="KitForm:sheet">
      <atom type="Label">Kit Name</atom>
      <atom type="Export">1</atom>
      <atom type="Layout">vtoolbar</atom>
      <hash type="InCategory" key="TopoView_ToolsForm:sheet#tail">
        <atom type="Ordinal">52.53</atom>
      </hash>
      <list type="Control" val="cmd @applymesh">
        <atom type="Label">Apply Mesh</atom>
        <atom type="StartCollapsed">0</atom>
        <atom type="Hash">ApplyMesh:control</atom>
      </list>
      <list type="Control" val="div ">
        <atom type="Alignment">full</atom>
        <atom type="StartCollapsed">0</atom>
        <atom type="Hash">BreakDiv1:control</atom>
      </list>
      <list type="Control" val="cmd @selectfreeverts">
        <atom type="Label">Select Free Verts</atom>
        <atom type="StartCollapsed">0</atom>
        <atom type="Hash">SelectFreeVerts:control</atom>
      </list>
    </hash>
  </atom>
</configuration>

Listing 1. Przykładowy plik konfiguracyjny

Jak można łatwo zauważyć, Modo narzuca pewną strukturę kodu. Głównym tagiem w pliku konfiguracyjnym jest configuration, który przyjmuje jako atrybuty nazwę kitu oraz jego wersję. Następnie mamy jeden z ciekawszych tagów w tym pliku, mianowicie import. Pozwala on na dodanie ścieżki, dzięki, której będziemy można użyć polecenie import w skrypcie - bez tego nie będziemy wstanie wczytać innego skryptu czy metod, które znajdują się w zewnętrznym pliku. Kolejno mamy zapisany alias dla danego skryptu oraz kolejno wyświetlaną nazwę formularza, który znajdzie się w Modo. Również w tym tagu zapisana jest pozycja, w której znajdzie się formularz oraz jego ułożenie. Okienka z przyciskami funkcji to właśnie formularze w Modo. Następnie jako listy podajemy przyciski oraz ich atrybuty, czyli nazwę oraz opis, co mają robić, a także nazwę danego przycisku. Tak przygotowany plik konfiguracyjny utworzy nam formularz, dzięki któremu będziemy mogli posługiwać się napisanymi przez nas skryptami.

Jak napisać własny skrypt?

Modo do naszej dyspozycji przygotował dwa moduły, które pozawalają na używanie nazw oraz funkcji znajdujących się w Modo. Pierwszy moduł to lx, natomiast drugi to lxu. Pakiet lx pozwala na ewoluowanie poleceń znajdujących się w Modo, natomiast pakiet lxu pozwala na wybieranie, zaznaczanie oraz obsługę zdarzeń, które występują podczas korzystania z aplikacji. Dzięki tym dwóm modułom, będziemy w stanie wykonać praktycznie wszystko.

#python
import re
import os

import lx
import lxu.select

s = lx.Service("sceneservice")

def item_exists(item_name):
    try:
        lx.eval("query sceneservice item.ID ? {%s}" % item_name)
        return True
    except:
        return False

def open_dialog(message, title='Information', dialog_type='info'):
    lx.eval("dialog.setup %s" % dialog_type)
    lx.eval("dialog.title {%s}" % title)
    lx.eval("dialog.msg {%s}" % message)
    lx.eval("dialog.open")

Listing 2. Przykładowy kod skryptu

Jak widać powyżej, przede wszystkim musimy zdefiniować w jakim języku został stworzony nasz skrypt, oczywiście oprócz rozszerzenia typowego dla danego języka. Następnie importujemy potrzebne moduły. Moduł lx może być wczytany w całości, natomiast jeżeli chodzi o niektóre metody z modułu lxu musimy je wczytać expilcit. Jeżeli spróbujemy wykonać import w następujący sposób from lxu import select, wtedy zostanie rzucony wyjątek i nie będzie możliwości zaimportowania tego modułu, dlatego też musimy importować w sposób jaki pokazano powyżej. Następnie już możemy śmiało korzystać z języka, który wybraliśmy do kodowania. Z modułu lx najczęściej wykorzystujemy polecenia lx.Service, lx.out, lx.eval. Pierwsze polecenie pozwala nam na wybieranie odpowiedniej warstwy, na której będziemy pracować. Kolejne polecenie pozwala na wypisywanie informacji do dziennika zdarzeń, który może być użyty do debugowania. Natomiast ostatnie polecenie pozwala po prostu na wykonywanie poleceń znajdujących się w Modo.

Debugowanie

W przypadku debugowania kodu, mamy możliwość skonfigurowania IDE, używania dziennika zdarzeń i komendy lx.out, bądź ustawienia śledzenia kodu poprzez lx.trace, który pozwala na zapisanie tracebacka wykonanego kodu. W pierwszym przypadku nie zawsze nam się to uda, gdyż nie wszystkie IDE da się podłączyć do debugowania, lub też po prostu nie zadziałają poprawnie. Dlatego też najczęściej używa się dziennika zdarzeń.

dziennik modo Rysunek 3. Okno dziennika zdarzeń

Na rysunku 3. widzimy okno dziennika zdarzeń, w którym znajdziemy wszystkie informacje dotyczącego tego, co się wydarzyło, ewentualne błędy występujące w trakcie wykonywania skryptu, bądź informacje, które wypisujemy poprzez użycie modułu lx.out. Jeżeli korzystamy z lx.trace() traceback wykonanego kodu znajdzie się właśnie w tym oknie. Aby skorzystać z lx.trace() musimy wywołać to polecenie z argumentem True i w tym momencie w danej linii kodu zostanie wywołana instrukcja śledzenia dotychczasowego kodu. Niestety w przypadku debugowania kodu czasem może zdarzyć się sytuacja, w której wyświetlony błąd w oknie zdarzeń nie będzie nam za wiele mówił, przez co jesteśmy zmuszeni do wypisywania zmiennych lub wyniku operacji na danym obiekcie. W przypadku gdy testujemy dany skrypt, nie musimy przeładowywać całej aplikacji, wystarczy, że zastąpimy odpowiedni skrypt i uruchomimy go ponownie.

Skąd pomoc?

Gdy potrzebujemy porady w trakcie tworzenia skryptu, oczywiście przychodzi nam z pomocą dokumentacja, która jest rozwijana i udostępniona pod adresem http://sdk.luxology.com/. Poza tym, oprócz wiki, mamy możliwość zajrzenia na forum i wysłania pytania do innych użytkowników. Znajduje się ono na stronie community na stronie Foundry. Wybieramy tam zakładkę forum a następnie tematy ogólne, bądź podzielone ze względu na wybrany produkt. Jeżeli nie znajdziemy odpowiedzi na nurtujące nas pytanie i założymy własny temat, odpowiedź przychodzi najczęściej w ciągu 2 dni. Natomiast najszybszym i najbardziej skutecznym kanałem komunikacji z innymi developerami jest chat poprzez Skype. Tam odpowiedź jest praktycznie natychmiastowa, a ludzie, którzy przebywają na tym kanale zawsze chętnie udzielą pomocy.

Podsumowanie

Mam nadzieję, że chociaż w małym stopniu przybliżyłem sposób, w jaki można napisać własny plugin lub kit do Modo. Z ciekawostek: 25% osób, która zaczyna coś takiego tworzyć, faktycznie doprowadza dzieło do końca. Prawdopodobnie dzieje się tak z powodu kosztów oraz stopnia zaawansowania w pracy nad grafiką 3D. Aplikacja nie należy do tanich, ale jeżeli ktoś pracuje sporo przy grafice 3D, produkt ten jest na pewno ciekawą propozycją na rynku. Modo dysponuje bardzo dużą liczbą narzędzi, co przekłada się na czas, jaki trzeba poświęcić na zapoznanie się z nimi oraz sprawdzenie użyteczności. Aplikacja ta została wykorzystana podczas produkcji takich filmów, jak Stealth, Ant Bully, Iron Man oraz WALL-E, a także podczas tworzenia gry Borderlands 2.

Łukasz Jagodziński Łukasz Jagodziński

Na co dzień zajmuje się tworzeniem aplikacji webowych w Pythonie. Od kilku lat współpracuje z STX Next w Poznaniu. Po godzinach interesuję się tworzeniem gier od A do Z czyli od etapu projektowania, poprzez kodowanie, aż do gotowego produktu na sprzedaż.

comments powered by Disqus
Współpraca: programista