Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

Maya: wyświetlanie geometrii NURBS

Każdy, kto choć przez chwile miał styczność z grafiką 3D powinien wiedzieć, że w swej naturze powierzchnie NURBS (Non-Uniform Rational B-Spline) są bardzo "płynne", w przeciwieństwie do powierzchni zbudowanych o wielokąty (ang. polygons), które swą gładkość osiągają przez:

  • zwiększenie liczby wielokątów (to pociąga za sobą większe obciążenie CPU oraz GPU),
  • algorytmy wygładzające (subdivision levels, które także obciążają CPU/GPU),
  • triki polegające na odpowiednim kierunkowaniu wektorów normalnych dla poszczególnych wierzchołków (w Mayi ustawia się to za pomocą funkcji Set Normal Angle...).

NURBS-y korzystając ze swojej matematycznie określonej konstrukcji (nie będę wchodził w zbyt techniczne szczegóły) pozwalają przy niewielkim obciążeniu procesora GPU, a także, jeśli dochodzi do renderingu, CPU (wyjątkiem jest mental ray korzystający z CUDA, jeśli takowe wykryje) dać nam powierzchnie, na których światło rozpada się równomiernie.

Zatem przykładowo tworzymy prymityw - kulę. Odpalamy render (w moim przypadku jest to mental ray). I... zaskoczenia nie ma. Powierzchnia wygląda dokładnie tak samo na ekranie roboczym jak i po wyrenderowaniu, poza (spodziewanym) nieco innym rozpadem światła. Można powiedzieć, że znajduje tu zastosowanie stara zasada WYSIWYG. Niestety, a może "stety", rzeczywistość nie jest tak prosta jak się wydaje.

Daj mi więcej kontroli!

W programie Autodesk Maya mamy skróty klawiszowe, które zajmują się jakością wyświetlania geometrii.

  • Klawisz "1" odpowiadający za Low Quality Display (MEL: setDisplaySmoothness 1).
  • Klawisz "2" odpowiadający za Medium Quality Display (MEL: setDisplaySmoothness 2).
  • Klawisz "3" odpowiadający za High Quality Display (MEL: setDisplaySmoothness 3).

Skróty działają w zupełnie odmienny sposób na geometrie zbudowane z wielokątów, NURBS, czy Subdivision surfaces (pl. powierzchnie wielopodziałowe, w polskim koślawym tłumaczeniu znalezionym tylko i wyłącznie w „Maya 2011. Wprowadzenie” :-). Żeby było jeszcze zabawniej, każdy rodzaj geometrii, zależnie od tego jak powstał, ma odmienny stopień jakości wyświetlania. W tym tekście skupię się tylko na powierzchniach NURBS.

Kiedy stworzyliśmy nasz prymityw (kulę) on także miał od tamtego momentu przypisane sobie parametry określające sposób jego prezentacji. Znajdują się one gdzieś pomiędzy wspomnianymi: Medium Quality Display a High Quality Display. Żeby to sobie trochę rozjaśnić w głowie, najlepiej przetestować samemu przyciskając odpowiednio na klawiaturze: 1, 2 i 3... W trakcie robienia tego nasz model musi być zaznaczony. Jeśli w obszarze roboczym mamy wiele obiektów o różnej budowie (polygons, NURBS, subdivs) niedobrze by było, gdyby Maya domyślnie zmieniała stopień jakości wyświetlania dla wszystkich, ze względu na, jak już wspomniałem, różne oddziaływanie tych skrótów na różne rodzaje geometrii.

Co się zatem dokładnie dzieje z naszą geometrią kiedy korzystamy z tych skrótów? By to zobaczyć powinniśmy wejść do Attribute Editor i przy zaznaczonym obiekcie otworzyć kartę noszącą generalnie nazwę Shape node, a w z schemacie wyświetlającą się jako nazwaObiektuShape, gdzie nazwaObiektu to... nazwa naszego obiektu - jeśli ją nadaliśmy. W przypadku naszej kuli powinno to być domyślnie nurbsShpereShape. Kiedy już weszliśmy w tą kartę poniżej zobaczymy zwinięte menu o nazwie NURBS Surface Display. Czas zajrzeć pod maskę.

Parametry, które będą nas interesowały to: Curve Precision oraz Crv Precision Shaded. Pierwsze określa dokładność wyświetlania krzywych, drugie zaś wyświetlanie krzywych w trybie Smooth Shade. Jeśli chodzi o płaszczyzny NURBS nie zaś same krzywe (jako oddzielne obiekty, które notabene nie mają w ogóle takich opcji w Atribute Editor) to sprawa wygląda następująco: parametr Curve Precision będzie zmieniał wygląd naszej geometrii tylko w trybie Wireframe (klawisz 4), zaś Crv Precision Shaded tylko wygląd w trybie Smooth Shade (klawisz 5). Na screenshotcie umieszonym powyżej widzimy domyślne ustawienia jakie są przydzielane dla wszystkich prymitywów NURBS dostępnych w menu. Używając skrótów: 1, 2 oraz 3 nadpisujemy te parametry w następujący sposób:

  • Low Quality Display (1): Curve Precision = 3; Crv Precision Shaded = 1;
  • Medium Quality Display (2): Curve Precision = 7; Crv Precision Shaded = 2;
  • High Quality Display (3): Curve Precision = 15; Crv Precision Shaded = 4;

Analizując powyższe zmiany można dojść do wniosku, że w zasadzie domyślne atrybuty nadawane prymitywom są jak najbardziej w porządku i nie trzeba ich zmieniać. Ponadto rewaluujemy wartości dla Divisions U I Divisions V, ale w tym tekście nie będę się nimi zajmował. Natomiast zaznaczę, że można zobaczyć tego wpływ w trybie Wireframe.

Często się zdarza, że w trakcie budowy modelu na zasadzie geometrii NURBS możemy napotkać problem zbyt kanciastego wyświetlania w trybie Smooth Shade, wtedy wystarczy po prostu podnieść wartość Crv Precision Shaded do wartości nas satysfakcjonującej i po kłopocie.

Panie renderze, czy Pan mnie w ogóle słucha?

Te opracowanie w ogóle by nie powstało, gdyby nie to, że rozbieżności w wyświetlaniu geometrii sięgają jeszcze dalej. To, co opisałem powyżej to absolutne podstawy, które każdy korzystający z Mayi powinien znać... Doszliśmy do głównego punktu programu. Czyli różnicy pomiędzy wyświetlaniem modelu NURBS w obszarze roboczym i jego aparycją w renderze. Trzeba wiedzieć, że to dwie różne kwestie.

Najlepiej to pokazać na przykładzie, gdzie nadajemy dla naszego dobrego już przyjaciela - kuli NURBS - właściwości Low Quality Display i następnie sprawdzimy efekt tego działania w renderze.

Ciekawe? Prawda jest taka, że jeśli chodzi o geometrie NURBS to w przeciwieństwie do polygonów (pozwolę sobie na takie spolszczenie) to co widzimy w obszarze roboczym nie jest równe temu co dostajemy po wyrenderowaniu (tutaj akurat subdivision surfaces reagują tak samo jak NURBS). Ale co by to nas niby obchodziło, skoro końcowym efektem ma być koniec-końcu gładka powierzchnia? Jest? Jest. No, niestety nie zawsze.

Wszystko dzieje się w imię większej kontroli nad tym, co się robi. W imię nieskończonej optymalizacji.

Mimo tego, że modele NURBS są matematycznie opisane w przeciwieństwie do zorientowanych przestrzennie wierzchołków opisujących wielokąty, to w trakcie renderingu obowiązuje je ta sama zasada, co ich "sztywnych" braci. Mianowicie podział na trójkąty - najmniejsze do uzyskania elementy płaszczyzn. Dedykowany renderer w celu obliczeń rozbija powierzchnie modeli na trójkąty i dalej na tej podstawie określa jak światło ma się rozchodzić po ich powierzchni.

Wystarczy tej teorii. Czas wreszcie zostawić naszą kulę i zbudować coś ciekawszego... niewiele, aczkolwiek coś, co pomoże nam lepiej dostrzec problem. Prosty kabel zbudowany na zasadzie dwóch krzywych: koła oraz nieregularnej linii i narzędzia Extrude - czyli sytuacja, która przy modelowaniu NURBS nie jest rzadkością. Nasz obiekt będzie wyglądał z początku kanciasto, ale wiemy już jak to naprawić, więc zmieniamy Crv Precision Shaded, przechodzimy do renderowania i...

Baby don’t hurt me, don’t hurt me... no more.

Jak to się stało, że do tej pory zawsze gładkie powierzchnie NURBS teraz w renderze postanowiły nam zrobić takiego placka? Otóż jest coś, co różni nasze prymitywy (menu: Create > NURBS Primitives) od geometrii skonstruowanej na zasadzie Surfaces > Revolve / Loft / Planar / Extrude. To kafelkowanie, inaczej teselacja... dokładniej triangulacja. A jeszcze ściślej... różnice w jej egzekwowaniu pomiędzy tak tworzonymi modelami. Jednak Maya i w tej kwestii nie zostawia nas na pastwę losu. Nad teselacją również mamy kontrolę i to dosłownie pod nosem, bo poniżej już omawianego menu NURBS Surface Display i nazywa się ono, nie inaczej, Tessellation.

Na potrzeby tego tekstu nie będę dalej wnikał, "po co" i "dlaczego", wyjaśnię po prostu, co zrobić by problem pokazany powyżej rozwiązać. Interesuje nas podmenu Simple Tessellation Options. Główną różnicą pomiędzy naszą wcześniejszą kulą, a obecnym kablem jest to, że dla U Division Factor oraz V Division Factor kula miała przypisane wartości 4.5, kabel zaś ma aż o 3 razy mniejsze: 1.5. By podglądać efekty naszych działań na żywo wystarczy zaznaczyć pierwsze okienko Display Render Tessellation. W dużej ilości przypadków wartości rzędu 4.5 wystarczają w zupełności. Należy mieć na uwadze, że podwyższanie U/V Division Factor powoduje intensyfikacje podziału powierzchni na większą ilość trójkątów, co zatem przekłada się na większe obciążanie CPU podczas renderingu. Zatem powinniśmy kontrolować tą wartość do najmniejszej potrzebnej.

Na upartego można dostrzec w poprawionym renderze po prawej stronie trochę krawędzi, ale wynika to już tylko z ekstremalnie zbudowanej geometrii na potrzeby prezentacji, gdzie specjalnie użyłem mniejszej ilości wierzchołków kontrolnych (ang. CVs - control vertices) do wyraźniejszego pokazania problemu.

Posłowie

Powyższy tekst nie wyczerpuje w pełni tematu wyświetlania NURBS, co parokrotnie w nim zaznaczałem. Jednakże informacje w nim zawarte pozwolą spokojnie rozwiązać większość napotkanych przez nas problemów związanych z wyświetlaniem tego rodzaju geometrii.  

oprogramowanie porady

Komentarze

JanStefan  23.08.2012 19:16 #1

Witam,
widzę, że szykuje się bardzo ciekawa seria wpisów. Mam nadzieję, że się nie mylę?

Mógłbyś w komentarzu opisać w jakim kierunku będziesz się poruszał i czy tylko wpisy będą dotyczyć programu Maya?

Pozdrawiam
JanStefan

makal  23.08.2012 20:33 #2

Niestety nie potrafię udzielić konkretnej odpowiedzi na żadne z tych pytań. Po prostu nie lubię rzucać słów na wiatr. Czas napisze ten scenariusz.

iluzion  23.08.2012 21:45 #3

Świetnie zapowiada się ta seria. Nie znam programu Maya, ale wiem że umożliwia korzystanie z języka programowania Python oraz jego bibliotek (podobnie jak Blender). Z poprzedniego wpisu natomiast dowiedziałem się o istnieniu Maya Embedded Language.

Szybkie pytanie do Google dało mi takie porównanie obu:

http://www.scriptswell.net/2010/07/maya-scripting-should-i-learn-mel-or.html

W ramach sprostowania tego co jest w tym wpisie...

1) Nazwa Python pochodzi od Monty Pythona, a nie od węża jak sugeruje obrazek.
2) Python umożliwia tworzenie GUI: http://nathanhorne.com/

Piterson79  23.08.2012 22:35 #4

Bardzo fajny wpis. Fajnie, że ktoś na DP również interesuje się tym tematem. Jak znajdę trochę czasu, to może też opiszę pewne funkcje modelingu w ZBrush, Mudboxie albo animacji w XSI, Houdini lub Blenderze :)

makal  23.08.2012 22:55 #5

Houdini... chętnie sobie coś poczytam :) Btw. Londyn? Startowałeś może do Cinesite?

JanStefan  24.08.2012 09:26 #6

W takim razie dzięki za szczerą odpowiedź, a ja w tym komentarzu postaram Ciebie zmotywować.

Chce więcej! ;)

Pozdrawiam
JanStefan