Skocz do zawartości

mathix

Members
  • Rejestracja

  • Ostatnia wizyta

Zawartość dodana przez mathix

  1. mathix odpowiedział szlogoon → na odpowiedź w temacie → Teksturowanie / Texturing
    Idea renderingu realtime jest trochę inna niż to co masz w mentalu czy scanline. Jak sam zauważyłeś gry muszą dawać chociaż te 30fps, dlatego wykorzystuje się w nich inne techniki, które są wspierane sprzętowo przez GPU. Kiedy robisz animację w maxie, czas renderingu może być większy, bo i tak później wszystkie klatki składasz do kupy i niezależnie, czy animacja renderowała się 10 minut czy dwa dni dostajesz założony wcześniej współczynnik fps, nie ma żadnych przeskoków.
  2. mathix odpowiedział comands → na odpowiedź w temacie → Maya
    Można z mental milla eksportować shadery do mental raya. Chociaż to nie jest jeszcze dopracowane rozwiązanie. streaker: i jak to wygląda? Można w wygodny sposób przeładować sobie świeżo skompilowany shader i przetestować od razu bez restartu programu?
  3. mathix odpowiedział comands → na odpowiedź w temacie → Maya
    Niestety nie miałem okazji. Matematyka mnie nie przeraża, ale realtime preview to by się przydało. Obserwowałem mental milla, już od jakiegoś czasu i wygląda na to, że przestałem zaraz przed tym jak udostępnili betę. Dzięki za info :)
  4. mathix odpowiedział comands → na odpowiedź w temacie → Rendering / Lighting / Shading
    Stronki, nie ma ale jest SYmek, zaraz pewnie nam wyłoży jak to wygląda. ;) Ja bym się w produkcjach filmowych nie spodziewał niczego poza mentalem, rendermanami i mantrą (+ ofkors wewnętrzne, firmowe, specjalistyczne silniki renderujące, do volumetryków i takich tam).
  5. mathix odpowiedział comands → na odpowiedź w temacie → Maya
    o super! :) Czy ktoś z userów XSI, pisał tam shadery pod mentala? Wciąż się zastanawiam, czy bez posiadania wersji standalone, to będzie tak udręka jak mi się wydaje.
  6. mathix odpowiedział ciacho191 → na odpowiedź w temacie → Teksturowanie / Texturing
    Tak z grubsza wystarczy. Resztę sobie doczytam. Dzięki :)
  7. mathix odpowiedział ciacho191 → na odpowiedź w temacie → Teksturowanie / Texturing
    SYmek: hehe ustaliliśmy wspólną wersję. A jak temat schodzi na displace, to wiesz może coś więcej dlaczego rendermanowski (i nie chodzi mi tu tylko o implementację PRMan) displace jest taki szybki?
  8. mathix odpowiedział ciacho191 → na odpowiedź w temacie → Teksturowanie / Texturing
    SYmek: oczywiście, że nie przesuwają, bo to nie displacement :) Źle się trochę wyraziłem. Chodziło mi o to, że normal mapa, ma możliwość bezpośredniego wpływania na normalne, a bump mapa, tylko w określony sposób. Łatwo sobie wyobrazić perturbacje normalnych, których nie da się uzyskać za pomocą bumpa. W związku z tym, każdy bump może zostać normal mapą, ale na odwrót niestety już nie. Przynajmniej nie bez utraty informacji.
  9. mathix odpowiedział ciacho191 → na odpowiedź w temacie → Teksturowanie / Texturing
    http://www.spinquad.com/forums/showthread.php?t=4478 http://wiki.blender.org/index.php/Manual/Bump_and_Normal_Maps Chyba jednak chodzi o transformację w trzech wymiarach.
  10. mathix odpowiedział ciacho191 → na odpowiedź w temacie → Teksturowanie / Texturing
    GRiPi dość dobrze to wyjaśnił. Ogólnie bump mapping to taki szczególny przypadek normal mappingu, gdzie normalmapa powstaje na podstawie mapy wypukłości. Zresztą tutaj masz to ładnie wyjaśnione: http://en.wikipedia.org/wiki/Bump_mapping http://en.wikipedia.org/wiki/Normal_mapping
  11. W Sunshine AFAIK to było popsute słońce, więc nie koniecznie się powinieneś na tym wzorować :]. Takiego efektu jak tam jest, nie uzyskasz za pomocą perlin noise'a 3d. Zauważ, że tam jest jakby takie kłębowisko płonących chmur, bez fluidów ciężko to zanimować (zresztą z nimi też).
  12. mathix odpowiedział Ebor → na odpowiedź w temacie → Animacje
    No ciekawy pomysł, prosta animka ale ładnie wykonana. :) Mogę zapytać jaki był materiał wejściowy i z jakiej kamery?
  13. mathix odpowiedział mathix → na odpowiedź w temacie → 3D
    No faktycznie tak to wygląda. Z jednej strony rozumiem twórców Mayi - chcieli dać programistom MEL-a ten sam zestaw narzędzi w Pythonie co ułatwiłoby im przesiadkę na nowy język. Z drugiej strony, do zestawu paskudnych, strukturalnych funkcji mogliby dorzucić elegancki, profesjonalny, obiektowy wrapper. Doskonale udało się to ludziom z Microsoftu, kiedy osadzili DirectX-a w zarządzanym kodzie, w pełni wykorzystując specyfikę C# i zarazem nie pomniejszając sporego wachlarza możliwości jakie oferuje niezarządzana, nieobiektowa wersja API. Faktycznie python jest zdecydowanie bardziej elegancki, niż MEL. W końcu to język programowania z prawdziwego zdarzenia i choć przyznam, że jako zwolennik całkowitego uporządkowania kodu, dostrzegam w nim wady, to jednak w porównaniu do natywnego języka Mayi, pozwala tworzyć zdecydowanie bardziej czytelne aplikacje.
  14. mathix dodał odpowiedź w temacie → w 3D
    W wersji 8.5 programu Autodesk Maya pojawiło się wiele nowych, ciekawych możliwości. Nowy mental ray, nowe niezwykle wygodne shadery z rodziny architectural, nowy system symulacji tkanin oraz wsparcie dla wiodącego (nie tylko w świecie oprogramowania graficznego) języka skryptowego – Pythona. Większość skryptów pisanych dla Mayi, to niewielkie narzędzia, często tworzone przez jedną osobę. Natywny język skryptowy tej aplikacji graficznej – MEL, w zupełności wystarcza do pisania krótkich, zgrabnych kodów. Dlaczego, więc warto używać Pythona, skoro MEL oferuje wszystko czego potrzeba? Uważam, że są głównie dwa argumenty przemawiające na korzyść tego pierwszego, a są nimi: obiektowość i popularność. O obiektowości za chwilę, najpierw wyjaśnię dlaczego to, co powszechne jest dobre. Oczywistym faktem, jest to, że im bardziej znany język, tym łatwiej znaleźć programistów posługujących się nim. W wypadku Pythona dla Mayi, fakt ten jednak nie gra dużej roli, bo implementacja jest dziwna i wymaga znajomości wewnętrznej filozofii działania programu. O wiele bardziej interesujące jest to, że inne wiodące aplikacje graficzne, takie jak na przykład: Houdini, Vue, Realflow czy Nuke, zapewniają wsparcie dla Pythona, co znacznie upraszcza przenoszenie danych między nimi. Obiektowość nie jest oczywiście cechą niezbędną, do pisania skryptów dla Mayi, jednak znacznie ułatwia pracę w grupie, oraz pozwala na wygodne testowanie poszczególnych elementów kodu. Podejście obiektowe (informatycy niech mi wybaczą pobieżne wyjaśnienie tej kwestii) polega na napisaniu klasy, która będzie realizowała pewien zestaw funkcjonalności za pomocą wewnętrznych komend Mayi. Ułatwia to testowanie i ponowne wykorzystanie kodu. W tym tekście pokażę jak wygodnie pisać i testować własne skrypty, wykorzystując obiektowe możliwości języka Python. Zakładam, że znasz podstawy Pythona, gdyż w tym tutorialu nie będę przedstawiał jego składni. Jeśli nie miałeś wcześniej do czynienia z tym językiem, to najpierw przejrzyj tutorial dołączony do oficjalnej dokumentacji: http://docs.python.org/tut/ . Następnie warto by było przeczytać rozdział Python z dokumentacji Mayi, jednak nie będzie to niezbędne do zrozumienia tekstu. Konfiguracja Mayi Na początku musisz wyedytować plik Maya.env, który znajduje się w folderze \Moje dokumenty\maya\ tak, żeby zmienna PYTHONPATH wskazywała na główny folder ze skryptami pythona. Np.: PYTHONPATH =C:\Documents and Settings\mtx\Moje dokumenty\maya\python tam właśnie Maya będzie szukać skryptów. Żeby sprawdzić czy wszystko ładnie działa załaduj Mayę i utwórz w swoim folderze Python, plik test.py: def main(): print "test1" Następnie ustaw w command line, język na Python (wystarczy kliknąć na nazwę, aby przełączać się między MEL-em i pythonem) i wpisz poniższe instrukcje (poprzedzone znakami >>>, których nie wpisuj): >>>import test >>>test.main() test1 Konsola zgodnie z oczekiwaniami wypisze string "test1". Co jednak jeśli chcemy zmienić zawartość skryptu? Wyedytuj plik test.py tak aby wypisywał słowo "test2" zamiast "test1". Po wywołaniu funkcji test.main() maya znów wypisze wyraz "test1". Dzieje się tak, gdyż moduł test jest ładowany do pamięci i program nie wie, że zawartość pliku się zmieniła. Nic nie pomoże też ponowne napisanie: import test, gdyż już załadowany moduł nie zostanie załadowany powtórnie. Na szczęście po każdej zmianie nie trzeba wcale restartować Mayi. Wystarczy napisać reload(test), a moduł zostanie przeładowany. Najlepiej wpisz w script edytorze: import test reload(test) test.main() następnie zaznacz kod i przeciągnij na shelfa, to pozwoli na testowanie skryptu za pomocą jednego kliknięcia. Podstawowe założenia skryptu Teraz zabierzemy się za pisanie modułu implementującego obsługę czterech podstawowych kontrolek, bez których ciężko sobie wyobrazić interfejs: forma (Window), przycisk (Button), pole edycji (TextEdit) i etykiata (TextLabel). Każdy z tych obiektów ma pewne cechy wspólne, każdy ma rozmiar, widzialność i co najważniejsze unikatową nazwę stosowaną wewnątrz Mayi, coś jak uchwyt dla okien w WinAPI. Klasa Window Utwórz nowy plik w folderze Python np. o nazwie mxwindow.py (mam dziwne zamiłowanie do długich nazw, ale prawdziwie się mi to objawia, gdy programuję w C# :P). Na początku pliku dodaj linię: import maya.cmds as cmds aby skrypt zimportował moduł maya.cmds, dzięki czemu będą dostępne standardowe komendy Mayi. Słowo kluczowe as tworzy alias nazwy modułu, więc nie będzie trzeba pisać maya.cmds.columnLayout(adjustableColumn = True), a jedynie cmds.columnLayout(adjustableColumn = True). Oto schemat zależności klas, które będziemy pisać: Założenie jest takie, że klasy Window, Button, TextLabel i TextEdit, są potomkami klasy Control. Kod klasy Control wygląda tak: class Control(object): """Represents basic maya control. Shoud be used as abstract class.""" __melName = "" __visible = True __size = (0,0) def getMelName(self): """Gets name representing control inside of Maya""" return self.__melName def setMelName(self, name): """Sets name representing control inside of Maya""" self.__melName = name def isVisible(self): """Checks whether control is visible""" return self.__visible def setVisibility(self, visibility): """Sets visibility of control""" self.__visible = visibility def getSize(self): """Gets size of control as (width,height)""" return self.__size """Sets size of control (width,height)""" def setSize(self, size): self.__size = size Klasa ta jest dość prosta, gdyż zawiera trzy prywatne atrybuty i akcesory do nich. W Pythonie istnieje ładniejszy system akcesorów, ale postanowiłem w tym tekście go pominąć i zrobić dostęp do atrybutów w stylu C++. Jeszcze słówko na temat prywatnych atrybutów. Python nie zawiera żadnego mechanizmu ukrywania prywatnych atrybutów czy metod. Tutaj coś takiego nie istnieje i w gruncie rzeczy wszystko jest widoczne dla użytkownika klasy. Powołujemy się po prostu na rozsądek programisty, który naszego obiektu będzie używał, licząc na to, że nie zacznie babrać tam gdzie nie powinien. Zauważ jednak, że wszystkie prywatne atrybuty zaczynam od znaków __. W Pythonie istnieje mechanizm, zwany name mangling, który powoduje zmianę tak nazywanych zmiennych na postać: _NazwaKlasy__NazwaAtrybutu, co utrudnia (lecz nie uniemożliwia), dostęp do prywatnych danych. Dodaj do tworzonego modułu funkcję: def main2(): ctrl = Control() ctrl.setMelName("real mel name") ctrl.__melName = "fake mel name" print ctrl.getMelName() wypisze ona string "real mel name". Linia: ctrl.__melName = "fake mel name", nie jest błędem, gdyż po prostu stworzy nowy atrybut o podanej nazwie. Pomiędzy znakami """ i """ znajdują się opisy działania metod. IDE interpretują je i wyświetlają jako podpowiedź przy pisaniu kodu. Zgodnie ze schematem klasa Window dziedziczy po klasie Control: class Window(Control): """Represents maya's basic window""" name ="" controlsList = [] def __init__(self, name, size): """Initializes Window""" self.setVisibility(False) self.name = name Control.__size = size self.setMelName( cmds.window(title=name, widthHeight=size)) cmds.columnLayout(adjustableColumn = True) def show(self): """Shows window""" cmds.showWindow(self.getMelName()) self.setVisibility(not self.isVisible()) def hide(self): """Hides window""" if self.isVisible(): cmds.toggleWindowVisibility(self.getMelName()) self.setVisibility(not self.isVisible()) def addButton(self, btnLabel): """Adds button to window""" nuBtn = Button(self, btnLabel) self.controlsList.append(nuBtn) return nuBtn def addTextLabel(self, txtLabel): """Adds text label to window""" nuLabel = TextLabel(self,txtLabel) self.controlsList.append(nuLabel) return nuLabel def addTextEdit(self, txtLabel): """Adds text edit to window""" nuEdit = TextEdit(self,"") self.controlsList.append(nuEdit) return nuEdit Jest to nieco bardziej skomplikowany twór, dlatego postaram się wyjaśnić jak działa. Klasa zawiera jeden atrybut - controlsList. Jest to lista kontrolek, który właścicielem jest okno (forma). Wprawdzie można by sobie poradzić bez niej, ale dobrze móc się odwoływać do kontrolek położonych na formie bez żonglowania dodatkowymi zmiennymi, np. w sytuacji, gdy chcemy wykonać jakąś akcję na wszystkich kontrolkach: for ctrl in wnd.controlsList: print ctrl.getMelName() Klasa zawiera metodę __init__(). Jest to swego rodzaju odpowiednik konstruktora z języków C++ czy C#. Prawdę mówiąc, jest to funkcja wywoływana zaraz po konstruktorze (__new__()), ale doskonale nadaje się do inicjalizacji danych. Metoda przyjmuje dwa (poza standardowym - self) argumenty. Pierwszy to string określający tytuł okna. Drugi to tuple (=krotka, a fee), zawierający szerokość i wysokość okna. Najważniejszym fragmentem kodu tej metody jest: self.setMelName( cmds.window(title=name, widthHeight=size)) cmds.columnLayout(adjustableColumn = True) Pierwsza linia ustawia prywatny atrybut __melName, na wartość zwróconą przez mayową komendę window. Zapamiętanie melName’a jest niezbędne do późniejszego operowania na oknie. Myślę, że warto teraz wspomnieć co nieco o konwencji wywoływania komend. W MEL-u jest to zazwyczaj: nazwaKomendy –parametr1 wartosc1 –parametr2 wartosc2 w Pythonie: maya.cmds.nazwaKomendy(parametr1=wartosc1, parametr2 = wartosc2) . Python pozwala na przekazywanie do funkcji nazwanych argumentów, dzięki czemu nie trzeba się trzymać ich kolejności i ilości. Konwencja nazewnictwa parametrów jest dokładniej wyjaśniona w helpie, pod Python\Python\Using Python (Maya2008/docs/Maya2008/en_US/wwhelp/wwhimpl/js/html/wwhelp.htm), ja wytłumaczę tylko to co niezbędne do zrozumienia przedstawionego kodu. Jednak najpierw wróćmy do opisu ciała metody __init__(). cmds.columnLayout(adjustableColumn = True) ustawia typ layoutu okna, który umieszcza wszystkie kontroli w jednej kolumnie. Ustawienie parametru adjustableColumn na true, powoduje, że kontrolki należące do okna będą się wraz z nim rozszerzać i zwężać, trzymając się bocznych krawędzi. Metody show() i hide() w prosty sposób wywołują komendy showWindow i toggleWindowVisibility, posługując się danymi klasy. Metody addButton(), addTextLabel(), addTextEdit(), tworzą egzemplarze odpowiednich obiektów i dodają kontrolki do okna. Sposób działania funkcji pokażę, na przykładzie pierwszej z nich. def addButton(self, btnLabel): """Adds button to window""" nuBtn = Button(self, btnLabel) self.controlsList.append(nuBtn) return nuBtn Najpierw tworzony jest nowy egzemplarz obiektu klasy Button i referencja do niego jest dodawana do listy oraz zwracana przez funkcję. Po utworzeniu nowego obiektu wywoływana jest jego metoda __init__(), która dla przycisku wygląda następująco: def __init__(self, parentControl, btnLabel): self.setMelName(cmds.button(label = btnLabel, parent=parentControl.getMelName())) Komenda button, która tworzy nowy przycisk, wymaga podania nazwy okna, do którego przycisk ma zostać dodany. Dlatego konieczne jest przekazanie do funkcji obiektu okna. Querying Pewnie zastanawiasz się jak pobrać dane z kontrolki np. z TextBoxa. W MEL-u wykonuje się to za pomocą wysłania zapytania o wartość, czyli po prostu dodania flagi –q (query) przed nazwą parametru, którego wartość chcemy pobrać. W Pythonie też jest prosto. Oto metoda zwracająca tekst etykiety przycisku: def getLabel(self): """Gets label""" return cmds.button(self.getMelName(), q=True, label = True) Jak widać wystarczy przesłać do funkcji dwa nazwane argumenty, jeden q, drugi nazwa_parametru i obu przypisać wartość True. Dodawanie procedur obsługi zdarzenia Przycisk do niczego się nie przyda, jeśli nie będzie reagował na kliknięcia. Metoda setOnCommand() ustawia procedurę obsługi kliknięcia. def setOnCommand(self, procedure): """Sets onCommand procedure procedure_name(*args)""" cmds.button(self.getMelName(), e=True, command = procedure) Wykorzystuje do tego komendę button, z flagą edit. Podobnie jak w wypadku query, należy przekazać imienny argument e (edit) ustawiony na True, z tym, że tym razem chcemy wyedytować, a nie pobrać wartość, więc trzeba również przekazać argument z nową wartością. Przykład użycia metody: def tested2(*args): print "tested2 executed!" (...) btn1.setOnCommand(tested2) Procedury obsługi różnych zdarzeń, mogą pobierać różną ilość argumentów, dlatego najwygodniejszym rozwiązaniem jest dopuszczenie dowolnej ilości, przynajmniej w sytuacji, gdy nie będziemy z nich korzystać. Pozostałe klasy pochodne Pozostałe klasy dziedziczące po Control, są bardzo podobne do Button, dlatego nie będę ich oddzielnie omawiać. Mechanizmy, które zostały zaprezentowane powyżej, powinny wystarczyć do zrozumienia działania reszty kodu. Cały kod, z przykładami użycia (funkcja main() ): #!/usr/bin/env python import maya.cmds as cmds class Control(object): """Represents basic maya control. Shoud be used as abstract class.""" __melName = "" __visible = True __size = (0,0) def getMelName(self): """Gets name representing control inside of Maya""" return self.__melName def setMelName(self, name): """Sets name representing control inside of Maya""" self.__melName = name def isVisible(self): """Checks whether control is visible""" return self.__visible def setVisibility(self, visibility): """Sets visibility of control""" self.__visible = visibility def getSize(self): """Gets size of control as (width,height)""" return self.__size """Sets size of control (width,height)""" def setSize(self, size): self.__size = size class Window(Control): """Represents maya's basic window""" controlsList = [] def __init__(self, name, size): """Initializes Window""" self.setVisibility(False) Control.__size = size self.setMelName( cmds.window(title=name, widthHeight=size)) cmds.columnLayout(adjustableColumn = True) def show(self): """Shows window""" cmds.showWindow(self.getMelName()) self.setVisibility(not self.isVisible()) def hide(self): """Hides window""" if self.isVisible(): cmds.toggleWindowVisibility(self.getMelName()) self.setVisibility(not self.isVisible()) def addButton(self, btnLabel): """Adds button to window""" nuBtn = Button(self, btnLabel) self.controlsList.append(nuBtn) return nuBtn def addTextLabel(self, txtLabel): """Adds text label to window""" nuLabel = TextLabel(self,txtLabel) self.controlsList.append(nuLabel) return nuLabel def addTextEdit(self, txtLabel): """Adds text edit to window""" nuEdit = TextEdit(self,"") self.controlsList.append(nuEdit) return nuEdit class Button(Control): def __init__(self, parentControl, btnLabel): self.setMelName(cmds.button(label = btnLabel, parent=parentControl.getMelName())) def setOnCommand(self, procedure): """Sets onCommand procedure procedure_name(*args)""" cmds.button(self.getMelName(), e=True, command = procedure) def getLabel(self): """Gets label""" return cmds.button(self.getMelName(), q=True, label = True) def setLabel(self, btnLabel): """Sets label""" cmds.button(self.getMelName(), e=True, label = btnLabel) class TextLabel(Control): """Represents basic maya's text label""" def __init__(self, parentControl, txtLabel): """Initializes maya's text label""" self.setMelName(cmds.text( label= txtLabel, parent = parentControl.getMelName() )) def setLabel(self, btnLabel): """Sets label""" cmds.text(self.getMelName(), e=True, label = btnLabel) def getLabel(self): """Gets label""" return cmds.text(self.getMelName(), q=True, label = True) class TextEdit(Control): """Represents maya's basic text edit""" def __init__(self, parentControl, initialText): """Initializes text edit""" self.setMelName(cmds.textField( text= initialText, parent = parentControl.getMelName() )) def setText(self, newText): """Sets text in text edit""" cmds.textField(self.getMelName(), e=True, text = newText) def getText(self): """Gets text in text edit""" return cmds.textField(self.getMelName(), q=True, text = True) def tested2(*args): print "tested2 executed!" def main(): wnd = Window("test", (50,100)) wnd.addTextLabel("click to execute:") btn1 = wnd.addButton("Click me!") btn1.setOnCommand(tested2) wnd.show() for ctrl in wnd.controlsList: print ctrl.getMelName() print len( wnd.controlsList) wnd.controlsList[0].setLabel("nu Label")
  15. mathix dodał odpowiedź w temacie → w Inne
    Udało się komuś wyrenderować obrazek HDR w Vue? Rendering do pliku .hdr daje osiem bitów na kanał, a ja chcę mieć floating point. Mam nadzieję, że da się to zrobić jednym przebiegiem, bez pisania skryptu do zmian exposure kamery i łączeniu plików wynikowych w Photoshopie.
  16. mathix odpowiedział SYmek → na odpowiedź w temacie → Aktualności (mam newsa)
    piotrek: true :] SYmek: dzięki za info, nowy interface to coś czego programowi brakowało, do tego wonsz pyton. Brzmi smakowicie :)
  17. mathix odpowiedział mathix → na odpowiedź w temacie → Maya
    SYmek: Cutter to dobry program, ma trochę przestarzałą filozofię, ale można do tego przywyknąć. Nuke ma support dla pythona? Heh nawet nie wiedziałem. Chyba się będzie trzeba na niego przesiąść z Fusion to nie będę musiał uczyć się LUA :P Tematyka przenoszenia geometrii bardzo mnie ciekawi i z pewnością będę do tego pythonowskiego kącika zaglądał. Dzięki za info :)
  18. mathix odpowiedział mathix → na odpowiedź w temacie → Maya
    Thx SYmek, powiedziałbym stare ale jeszcze jare.
  19. mathix dodał odpowiedź w temacie → w Maya
    Ostatnio chciałem sobie napisać kilka skryptów do Mayi, zrealizować pomysły, które chodziły mi po głowie od dłuższego czasu. Jako, że jeśli chodzi o programowanie, zostałem przyzwyczajony do tego, iż edytor mnie rozpieszcza, zacząłem szukać dobrej metody skryptowania pod Mayę. Maya oferuje dwa równoważne pod względem możliwości języki skryptowe: MEL (Maya Embedded Language) oraz od niedawna python. Jeśli chodzi o IDE dla MEL-a to niekwestionowanym liderem w tej dziedzinie jest produkt firmy Digimation - MEL Studio Pro. Niestety od pewnego czasu twórcy nie nadążają z aktualizowaniem pluginu– dzisiaj, gdy na dobre przyjęła się Maya 2008, dostępne jest MEL Studio pod ósemkę (czyli wersję o numer wcześniejszą). Na szczęście przeszukując internet można trafić na kilka ciekawych, zewnętrznych i darmowych edytorów: Cutter Edytor z doskonałym wsparciem dla MEL-a. Cutter powstał jako edytor tekstowy ułatwiający pisanie rendermanowskich plików Rib i shaderów w RSL-u, jednak autor rozszerzył możliwości programu o kolorowanie składni dla kilku języków w tym MEL-a. Oprócz kolorowania składni Cutter posiada dość prymitywny, ale całkiem skuteczny mechanizm podpowiadania. Po kliknięciu RMB na komendę MEL-a pojawia się lista parametrów w skróconych i rozszerzonych formach. Poza tym, trzymając CTRL i klikając LMB wywołamy okno przeglądarki internetowej z otwartą odpowiednią stroną dokumentacji Mayi, co pozwala w miarę szybko sprawdzić działanie danej komendy. Rozwiązania te co prawda bledną przy zaawansowanych możliwościach takiego Visual Studio dla C#, ale to i tak lepsze niż ciągłe skakanie między dokumentacją i edytorem. Ponadto program pozwala na wysyłanie skryptu bezpośrednio do Mayi i wykonanie go. Jedyne co trzeba zrobić to wywołać komendę: commandPort -n ":2222" i ustawić odpowiednie parametry w samym Cutterze. http://www.fundza.com/ Mapy + Crimson Editor Innym ciekawym rozwiązaniem, oferującym wsparcie zarówno dla MEL-a jak i pythona jest Mapy. Program pozwala na wysyłanie danych z jednego z popularnych edytorów tekstowych wprost do Mayi. Mapy ładnie integruje się z Crimson Editorem, pozwalając zarówno wysyłać skrypt do Mayi jak i odbierać, to co zwróci konsola. Sam edytor tekstowy oferuje kolorowanie składni MEL-a niestety nie posiada mechanizmu podpowiadania. Mapy współpracuje również z: SciTE, UltraEdit, Textpad, Notepad++ i innymi, które mają odpowiednie możliwości wywoływania zewnętrznych programów. http://rodmena.com/mapy/ UltraEdit Do tego programu istnieje plik umożliwiający kolorowanie składni i ubogi mechanizm intelli sense. UltraEdit współdziała z mappy, wobec czego możliwa jest bezpośrednia komunikacja z Mayą. http://www.highend3d.com/maya/downloads/tools/syntax_scripting/22.html Python MEL jak na specjalistyczny, mało popularny język programowania, posiada całkiem ładny zestaw narzędzi, uprzyjemniających pisanie w nim skryptów. Co natomiast z pythonem? O ile o MEL-u słyszeli tylko graficy pracujący w Mayi, to o pythonie słyszał cały informatyczny świat. Wobec tego ten język powinien być znacznie lepiej wspierany, od MEL-a. Niestety o ile wsparcie dla samego pythona jest ogromne, o tyle z programowaniem pod Mayę nie jest już tak różowo. Właściwie jedynym problemem jest fakt, że Autodesk do swojej wersji interpretera pythona nie dołączył plików .py, dzięki, którym IDE tego języka mogłyby obsługiwać mechanizm intelli sense, dla komend Mayi. W rezultacie przykładowo instalując eclipse i pydev, programujemy sobie w luksusowych warunkach, tak długo jak nie korzystamy z przestrzeni nazw maya. Kiedy zachodzi konieczność wykonania jakichś akcji w Mayi, cofamy się o dziesięć lat i zaczynamy skakać między dokumentacją oraz edytorem. Pisząc o Mayi i pythonie nie sposób pominąć projektu pymel. Implementacja pythona, stworzona przez Autodesk, to zwykły wrapper MEL-a i Maya API. Oznacza to, że komendy są zaimplementowane w sposób strukturalny, co absolutnie nie wykorzystuje podstawowej przewagi pythona nad MEL-em – obiektowości. Fakt ten nie spodobał się Chadrikowi z Luma Pictures, który stworzył i udostępnił za darmo moduł ubierający w wygodne obiekty, wszystko to co kryje się pod maską Mayi. W ten sposób funkcja tworząca na przykład kamerę zwraca referencję do obiektu, który ową kamerę reprezentuje, co ułatwia późniejsze manipulowanie obiektem i nie zmusza do koniecznej w MEL-u zabawy z nazwami. http://code.google.com/p/pymel/ Który z edytorów i języków polecam? Cóż, faktem jest, że nauczenie się pythona dla Mayi w wersji Autodeska, wymaga znajomości MEL-a, głównie dlatego, że jest o nim więcej materiałów i efekty naszych działań są w konsoli zwracane właśnie w tym języku. Wprawdzie programowanie w pymel-u pozwala się w pewnym stopniu odciąć od MEL-owskiej filozofii, ale aby tak naprawdę zrozumieć co się dzieje pod maską Mayi, trzeba zrozumieć język, na którym aplikacja jest zbudowana. Dlatego najpierw radzę nauczyć się MEL-a (do gustu przypadło mi to co oferuje Cutter), a później pythona (tutaj podoba mi się rozwiązanie eclipse + pydev). UPDATE: Pymel + KomodoEdit 4.2 Z moich obserwacji wynika, że eclipse + pydev nie radzą sobie zbyt dobrze z analizowaniem bibliotek pymela, w związku z tym nie otrzymujemy kochanego przez programistów mechanizmu autouzupełniania. Z początku myślałem, że to wina samego pymela, ale jak się okazuje darmowy edytor KomodoEdit, radzi sobie z tą biblioteką dość ładnie. Siła KomodoEdit polega na tym, że stoją za nim pieniądze. To darmowe IDE, jest bowiem uboższą wersją pythonowego kombajnu Komodo IDE. Aby włączyć autouzupełnianie dla pymela wystarczy wejść w Edit > Preferences > Languages > Python i w Additional Python Import Directories dodać folder z pymelem. Niestety nie działa to dla funkcji z modułu ctx (np. createPolyConeCtx() odpowiednik melowego polyCone ) . Niemniej dla klas takich jak Vector dostajemy pełne wsparcie.
  20. mathix odpowiedział spiralboy → na odpowiedź w temacie → Maya
    Zrób to jak pro. Zamiast korzystać z tego shadera zrób glowa w programie do compositingu - większa kontrola i mniej problemów.
  21. mathix odpowiedział Knysha → na odpowiedź w temacie → Editing & Compositing
    Tak dużego nigdzie nie widziałem w Polsce. Jedynie w ogóle jedyne co znalazłem to to: http://transit.pl/shop.php?a=opis_prod&categorie=174&id=pinnacle-chromakey
  22. mathix odpowiedział palmer → na odpowiedź w temacie → Animacje
    Spróbuj oddzielnie wyrenderować sobie parę na sprite'ach i skomponować z animacją. Na sprite'ach. Jeśli potrzebujesz czegoś bardziej realistycznego (ta metoda wyjdzie ładnie dla małej gęstości pary), to będziesz musiał sięgnąć po jakiś silnik fluidów pod maxa.
  23. mathix odpowiedział odpowiedź w temacie → Maya
    Jest wiele ciekawych i przyjemnych metod: http://www.3dtotal.com/team/Tutorials/object_spreading/object01.asp
  24. mathix odpowiedział ciacho191 → na odpowiedź w temacie → Maya
    Poczytaj o materiałach anizotropowych w dokumentacji mia_material. Nie ma potrzeby sie bawić bumpem.
  25. Mental 3.3 faktycznie jest mało przyjazny. Jeśli masz możliwość przesiądź się na maxa z wersją 3.5 albo 3.6. 2. Sfera z mapą nieba HDRI i Final Gathering. W późniejszych wersjach jest shaderek do nieba.

Powiadomienie o plikach cookie

Wykorzystujemy cookies. Przeczytaj więcej Polityka prywatności