Я рендерил спрайты с точными пиксельными координатами, чтобы избежать эффекта размытия, вызванного сглаживанием (спрайты являются пиксельной графикой и выглядят ужасно, если их отфильтровать). Однако, поскольку движение объектов включает переменную скорость, гравитацию и физические взаимодействия, траектория вычисляется с точностью до субпикселя.
При достаточно больших скоростях пространства экрана (vΔt больше, чем 2 или 3 пикселя) это работает очень хорошо. Однако, когда скорость мала, может появиться заметный эффект лестницы, особенно вдоль диагональных линий. Это больше не проблема при очень медленных скоростях пространства экрана (v << 1 пиксель в секунду), поэтому я ищу только решение для промежуточных значений скорости.
Слева - построенная траектория для большой скорости, полученная простым округлением координат объекта. В середине вы можете увидеть, что происходит, когда скорость становится меньше, и эффект лестницы, о котором я говорю. Справа локус траектории я бы хотел получить.
Меня интересуют идеи алгоритмов для фильтрации траектории, чтобы минимизировать алиасы, сохраняя при этом исходное поведение при больших и малых скоростях. У меня есть доступ к Δt, мгновенному положению и скорости, а также к произвольному числу предыдущих значений, но, поскольку это симуляция в реальном времени, я не знаю о будущих значениях (хотя при необходимости оценка может быть экстраполирована при определенных предположениях) , Обратите внимание, что из-за физического моделирования могут также произойти внезапные изменения направления.
источник
velocity.y / velocity.x
на поправочный коэффициент, пропорциональный скорости.Вы ничего не можете с этим поделать для основанного на физике мира. Если бы все ваши объекты двигались вдоль линий или определенных кругов, вы могли бы что-то сделать. Но вы работаете в реальной физике. Объект - это место, куда его ставит физика; вы просто рисуете пиксельное приближение этого местоположения.
Как правило, это то, что вы должны принять, если хотите придерживаться пиксельных координат. Это не должно быть слишком заметно, если вы не показываете в невероятно маленьком разрешении (менее 640x480, хотя это зависит от собственного разрешения и размера дисплея).
источник
Когда ожидающее движение перпендикулярно последнему движению (в пространстве экрана), игнорируйте его и используйте последние координаты экрана. Если это приводит к заиканию, так же плохо, как и к лестнице, вы можете попытаться переместить сумму ожидающего и последнего движения.
Я думаю, что проблема заключается в v <sqrt (2). v> sqrt (2) всегда должен двигаться как минимум на полную диагональ, избегая эффекта лестницы. Может быть полезно для обрезки, которые требуют предварительного сравнения движений.
источник