Как сгладить зубчатые пути? - PullRequest
1 голос
/ 26 февраля 2020

Итак, я работаю над 2D игрой Unity. Он имеет несколько уровней, и каждый из них имеет элемент заземления, который представляет собой комбинацию линий и кривых в формате png. Level terrain

Следующим шагом является создание EdgeCollider2D на верхней стороне земли. Однако, имея сотни уровней, я подумал, что было бы проще попробовать написать сценарий python, который бы вычислял путь краевого коллайдера (возвращая массив точек).

Итак, первое, что я сделал, чтобы попытаться получить список каждого верхнего пикселя границы. Я преуспел и получил очень точный массив очков. Обратите внимание, что с помощью этой техники, когда вы видите что-то, что выглядит как прямая линия, оно на самом деле содержит столько точек, сколько пикселей на линии.

Проблемы:

  • Точки массив огромен (в данном случае 4130).
  • Тропа неровная (см. изображение ниже), и, поскольку игрок катится по мячу, плавность коллайдера очень важна, так как в противном случае шар начинает прыгать на микро -бампы.

Collider's path is jagged

Что можно сделать:

  • Для прямых участков: удалить каждую точку в линии, за исключением первого и последнего.
  • Для изогнутых участков: Упростите, удалив точки (скажем, удаляйте точку каждые две точки или что-то в этом роде).

Проблемы с прямыми линиями

Для вертикальных и прямых линий это очень просто (тот же x или y = та же линия). Однако, что касается других строк, я до сих пор не понял, как их обнаружить. Я думал, что могу обнаружить шаблон (например, 2 пикселя на 1 пиксель вправо), однако, большинство склонов имеют гораздо более сложные шаблоны для обнаружения, или, возможно, шаблон настолько велик, что по всей длине линии он все еще не появлялся или очень мало раз.

Проблемы с кривыми

Посмотрите на скриншот ниже. (Еще раз обратите внимание, что все, что выглядит как прямая линия, на самом деле имеет столько же точек, сколько пикселей на линии).

Curved section

Если я случайно удаляю Скажите точку через каждые 2 других пункта, тогда я все равно буду иметь неровный путь. Кроме того, мне нужно выбрать точки, которые расположены на самом внешнем возможном пути (первая точка каждой горизонтальной линии при подъеме и последняя точка при спуске).

Любое предложение или ответ приветствуется, даже если оно находится в форма более «математического» ответа, а не сценария.

Заранее спасибо:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...