픽셀 아트 모션에서 "계단 효과"를 어떻게 방지합니까?


21

앤티 앨리어싱으로 인한 흐림 효과를 피하기 위해 정확한 픽셀 좌표로 스프라이트를 렌더링하고 있습니다 (스프라이트는 픽셀 아트이며 필터링하면 끔찍할 것입니다). 그러나 물체의 움직임에는 가변 속도, 중력 및 물리적 상호 작용이 포함되므로 궤적은 서브 픽셀 정밀도로 계산됩니다.

화면 공간 속도가 충분할 때 (2 또는 3 픽셀보다 큰 vΔt) 매우 효과적입니다. 그러나 속도가 작은 경우 특히 대각선을 따라 눈에 띄는 계단 효과가 나타날 수 있습니다. 화면 속도가 매우 느린 경우 (v << 1 픽셀 / 초) 더 이상 문제가되지 않으므로 중간 속도 값에 대한 솔루션 만 찾고 있습니다.

왼쪽에는 객체 좌표의 간단한 반올림으로 얻은 큰 속도에 대한 플롯 된 궤도가 있습니다. 중간에서 속도가 작아지면 무슨 일이 일어나는지, 내가 이야기하고있는 계단 효과를 볼 수 있습니다. 오른쪽에는 궤도의 궤적이 있습니다.

객체 궤적의 픽셀 좌표

크고 작은 속도로 원래 동작을 유지하면서 앨리어싱을 최소화하기 위해 궤적을 필터링하는 알고리즘 아이디어에 관심이 있습니다. 임의의 수의 이전 값뿐만 아니라 Δt, 순간 위치 및 속도에 액세스 할 수 있지만 실시간 시뮬레이션이므로 미래 값에 대해 알지 못합니다 (필요한 경우 특정 가정에서 추정을 추정 할 수 있음) . 물리 시뮬레이션으로 인해 갑작스런 방향 변경도 발생할 수 있습니다.

답변:


18

다음은 합리적으로 잘 작동해야하는 알고리즘에 대한 간단한 개요입니다.

  1. 먼저 물체가 움직이는 방향을 계산하고 수평 또는 수직에 가까운 지 확인하십시오.
  2. 방향이 수직 (가로)에 더 가까운 경우, 방향 벡터따라 객체의 위치를 가장 가까운 픽셀 행 (열)의 중심으로 조정하십시오.
  3. 가장 가까운 픽셀의 중심으로 위치를 반올림합니다.

의사 코드에서 :

if ( abs(velocity.x) > abs(velocity.y) ) {
    x = round(position.x);
    y = round(position.y + (x - position.x) * velocity.y / velocity.x);
} else {
    y = round(position.y);
    x = round(position.x + (y - position.y) * velocity.x / velocity.y);
}

편집 : 네, 테스트를 거쳤습니다.


+1, 이것은 놀랍게 잘 작동합니다! 속도가 느린 속도에서 원형 이동으로 이상한 뒤로 점프하는 것을 알 수 있습니다. 속도 벡터와 반대 방향으로 조정할 수 있기 때문입니다. velocity.y / velocity.x속도에 비례하는 보정 계수 를 곱하면 해결할 수 있습니다 .
sam hocevar

@Sam : 작은 회전 반경 (= 높은 곡률)을 의미합니까? 실제로 낮은 속도에서 선형 외삽에 문제가 발생할 수 있습니다. 기본적으로 가속 당 제곱 속도가 1 픽셀보다 훨씬 길면 작동합니다. 가능한 하나의 해결책은 마지막 반올림 위치를 기억하고 새로 계산 된 위치보다 실제 위치에 더 가까운 경우 재사용하는 것입니다. (또한 고차 외삽 법을 시도 할 수도 있지만 수식은 매우 추악합니다.)
Ilmari Karonen

사실, 나는 작은 반경을 의미했습니다. 내 잘못이야. 추가 힌트를 주셔서 감사합니다. 성능은 그다지 중요하지 않으므로 품질을 향상시킬 여유가 있습니다.
sam hocevar

3

일반적인 물리 기반 세계에서 실제로 할 수있는 일은 많지 않습니다. 모든 물체가 선이나 특정 원을 따라 움직이면 무언가를 할 수 있습니다. 그러나 당신은 실제 물리학으로 운영하고 있습니다. 물체는 물리학이 놓는 곳입니다. 단순히 해당 위치의 픽셀 기반 근사치를 그립니다.

픽셀 좌표를 고수하려면 일반적으로 받아 들여야 할 것입니다. 매우 작은 해상도 (640x480 미만이지만 디스플레이의 기본 해상도 및 크기에 따라 다름)로 표시하지 않는 한 눈에 띄지 않아야합니다.


고해상도에서도 렌더링은 업 스쿨링되어 (가장 가까운 이웃) 올드 스쿨 외관을 향상시킵니다. 이것은 예술적 방향 결정입니다.
sam hocevar

@SamHocevar : 당신이 "oldschool 모습"왜 당신이 원하지 않는하려면 전체를 "외관 oldschool을?" 왜 "올드 스쿨"게임에서했던 계단식 스테핑이 전체 효과의 일부가 아닌가?
Nicol Bolas

괜찮은 구식 게임은 쓰레기처럼 보이는 계단 효과가있는 대각선 움직임을 구현하지 않았다고 생각합니다. 쓰레기처럼 보이는하지 않는 것은 내가 :-) 달성하고자하는 oldschool 효과의 주요 부분이다
샘 호스 바

@ SamHocevar : 대부분의 구식 게임은 액션 게임이므로 알아 차릴만큼 천천히 움직이지 않습니다. 또한 커브를 따라 움직이지 않는 경향이 있습니다. 특히 내가 생각했던 게임은 Solar Jetman인데, 천천히 움직일 때이 효과가 매우 큽니다. 물론, 카메라는 항상 당신을 중심으로합니다. 그래서 당신은 세상의 움직임에주의를 기울입니다.
Nicol Bolas

3

보류중인 움직임이 화면 공간에서 마지막 움직임과 직각 일 때는이를 무시하고 마지막 화면 좌표를 사용하십시오. 그로 인해 계단만큼 나쁜 말더듬이 생길 경우 보류중인 움직임과 마지막 움직임의 합을 움직일 수 있습니다.

문제는 v <sqrt (2)에 있다고 생각합니다. v> sqrt (2)는 계단 효과를 피하면서 항상 최소 대각선으로 움직여야합니다. 사전 이동 비교가 필요한 가지 치기에 유용 할 수 있습니다.


v. Ilmari의 제안에 대한 상한을 지적하면 +1이 더 자세하지만 유용한 정보를 제공하고 있습니다.
sam hocevar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.