Jak uniknąć przecięcia się podczas nakładania pociągnięcia na krzywą?


11

Mam w swoim kodzie kilka obiektów Spline2D, z których każdy ma metodę Position, Velocity i Acceleration, która zwraca wektor określonej ilości w określonym czasie. Używam tych wektorów do budowy geometrii w celu utworzenia pociągnięć gradientowych dla krzywych, ale mam problemy z samozakrojem na stromych krzywych. Na przykład, oto jedna krzywa, na której mam to miejsce:

Model szkieletowy: http://twitpic.com/2zplw1/full
Wypełniony: http://twitpic.com/2zpmnt/full

Jak widać, na drugim zakręcie wewnętrzna część przecina się, co powoduje ten brzydki artefakt. Czy istnieje dobry algorytm / metoda obrysu krzywych bez powodowania tego przecięcia się?

EDYCJA : Bardziej ekstremalne przykłady plus makieta tego, co chciałbym osiągnąć:

Model szkieletowy: http://twitpic.com/2ztwzi/full
Wypełniony: http://twitpic.com/2ztwkt/full
Ideal Outcome (makieta): http://twitpic.com/2ztxa8/full


Wow, nawet nie zdawałem sobie sprawy z konotacji tytułu, kiedy go napisałem. :)
ThatsGobbles,

Odpowiedzi:


3

Jeśli renderujesz je za pomocą GPU i dowolnego nowoczesnego interfejsu 3D (np. OpenGL / D3D), wydaje mi się, że możesz się tego pozbyć dzięki testom głębokości. Jeśli przypiszesz swoje zewnętrzne wierzchołki do z = FAR, a wewnętrzne do z = NEAR, testowanie głębokości powinno zapobiec wyświetlaniu nakładania się. Z OpenGL:


  // don't forget to clear depth buffer to 1.0f at beginning of frame.
  glClearDepth(1.0f);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  // enable depth testing.
  glEnable(GL_DEPTH_TEST);
  glDepthFunc(GL_LEQUAL);

// draw the Spline2D for each segment in spline for each vert in segment if (vert is an outer vert), set vert.z = 1.0, otherwise set vert.z=0.0

Zastrzeżenie emptor: to nie zadziała, jeśli potrzebujesz półprzezroczystych pociągnięć.


1
Świetna odpowiedź, właśnie o tym myślałem, jednak mylisz się, że nie działa na półprzezroczyste pociągnięcia, jeśli pozwolisz napisać zbuffer w jednym przejściu, a następnie zrobić kolor w drugim.
Richard Fabian,

Dzięki, moje pociągnięcia są rzeczywiście nieprzejrzyste, więc zadziałało to bardzo prosto i cudownie!
ThatsGobbles,

1

„Poprawka” będzie zależeć od tego, jak ma wyglądać wynikowy wynik. Problem nie został tu wystarczająco dobrze zdefiniowany: jak to ma wyglądać?

Sugeruję, aby najpierw spróbować zrobić jeszcze bardziej ekstremalny przykład usterki, a następnie użyć Photoshopa / farby do naprawy, by znaleźć inspirację dla rozwiązania.

Czy chcesz to złożyć? Nakładasz się na krawędź? Wciągać, dopóki się nie nakłada?


Chodzi o to, że później wyskoczę ostrzej zakrzywioną krzywą i „idealną” krzywą w Illustratorze lub Inkscape.
ThatsGobbles,

Oryginalny post został edytowany!
ThatsGobbles,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.