Blog (3)
Komentarze (5)
Recenzje (0)
@makalMaya: wyświetlanie geometrii NURBS

Maya: wyświetlanie geometrii NURBS

23.08.2012 | aktual.: 23.08.2012 17:47

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.

427762

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.

427769

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ę.

427771

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.

By usunąć kanciastość wartość Crv Precision Shaded została zmieniona z 4 na 16.
By usunąć kanciastość wartość Crv Precision Shaded została zmieniona z 4 na 16.

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.

427780

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...

427785

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.

427789

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.

Wybrane dla Ciebie
Komentarze (6)