Як уникнути самоперетину при нанесенні штриха на криву?


11

У моєму коді є кілька об'єктів Spline2D, кожен з яких має метод Позиції, Швидкості та Прискорення, який повертає вектор певної кількості за певний час. Я використовував ці вектори, щоб побудувати геометрію для створення градієнтних штрихів для кривих, але у мене виникають проблеми із самоперетином на крутих кривих. Як приклад, ось одна крива, де у мене це відбувається:

Каркас: http://twitpic.com/2zplw1/повне
заповнене: http://twitpic.com/2zpmnt/full

Як бачите, на другому вигині внутрішня частина перетинається сама, що спричиняє той потворний артефакт. Чи є хороший алгоритм / метод для обведення кривих, не викликаючи цього самоперетину?

EDIT : Більш екстремальні приклади плюс макет того, що я хотів би досягти:

Wireframe: http://twitpic.com/2ztwzi/full
Заповнене: http://twitpic.com/2ztwkt/full
Ідеальний результат (макет): http://twitpic.com/2ztxa8/full


Нічого собі, я навіть не зрозумів конотації заголовку, коли писав його. :)
ThatsGobbles

Відповіді:


3

Якщо ви їх рендеруєте за допомогою GPU та будь-яких сучасних 3D-програм (наприклад, OpenGL / D3D), мені здається, ви можете позбутися цього за допомогою глибинного тестування. Якщо ви присвоїте зовнішнім вертам z = FAR, а внутрішнім вершинам z = NEAR, тестування на глибині повинно запобігти появі перекриття. З 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

Caveat Emptor: це не спрацює, якщо вам потрібні напівпрозорі штрихи.


1
Чудова відповідь, що я думав, однак ви помиляєтесь, що це не працює на напівпрозорі штрихи, якщо ви дозволяєте писати zbuffer одним проходом, а потім робити колір у другому.
Річард Фабіян

Дякую, мої штрихи дійсно непрозорі, тому це спрацювало дуже просто та чудово!
ThatsGobbles

1

"Виправлення" залежатиме від того, яким ви хочете виглядати отриманий результат. Насправді ця проблема на сьогодні не досить чітко визначена: як це означало виглядати?

Я б запропонував спершу спробувати зробити ще більш екстремальний приклад глюка, а потім використати фотошоп / фарбу, щоб виправити це, ви можете знайти натхнення для рішення.

Ви хочете, щоб він склався? Перекриття краєм? Потягніть, поки вона не перекриється?


Хороший момент, я прокручую криву більш різкого повороту і "ідеальну" криву в Illustrator або Inkscape пізніше сьогодні.
ThatsGobbles

Оригінальна публікація відредагована!
ThatsGobbles
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.