2D 충돌 감지


11

이 캐릭터를 사용한다고 가정 해 봅시다.

새
(출처 : iconbug.com )

충돌 감지를 어떻게 구현 하시겠습니까? 새의 모양이 사각형 근처에 없기 때문에 경계 상자를 사용하는 것은 좋은 근사치가 아닌 것 같습니다.

이미지의 일부를 나타내는 객체 안에 일종의 쿼드 트리 데이터 구조를 가지고 있다고 생각했습니다. 각 잎은 false(조류 외부의 흰색 / 투명 공간을 덮는 경우) 또는 true(조류의 부리, 눈 등을 나타내는 경우) 일 수 있습니다. 그런 다음 장면 에서 조류와의 충돌 에 대한 유일한 장애물을 테스트 하십시오 .

그러나 내 접근 방식의 내 문제는 다음과 같습니다.

  1. 쿼드 트리를 초기화하는 방법을 모르겠습니다.
  2. 쿼드 트리가 초기화되면 장애물이 이미지의 좌표 내에 있으면 횡단 및 사용 방법을 잘 모르겠습니다.

비평 방 문자로 충돌 감지를 어떻게 수행 하시겠습니까?

LE : 내가 본 다른 접근 방식은 여러 경계 상자를 사용하는 것입니다. 예를 들어 부리에는 하나 또는 몇 개의 경계 상자가 있고 머리카락이나 꼬리에는 몇 개가 있습니다. 그러나 지루할 수 있습니다. 이것이 내 경우에 유효한 접근 방법이라면 어떻게 경계 상자를 생성합니까? 내 프로그램에서 하드 코딩해야한다고 의심합니다.

LE2 : 상당히 정확한 충돌이 중요합니다. 단일 경계 상자 또는 원이 적어도 그 모양과 대략적으로 비슷한 방법을 상상할 수 없으므로이 방법은 효과가 없습니다.


2
일반적인 참고 사항 : 경계 상자와보다 세밀한 검사를 모두 사용합니다. 세분화 검사는 성능이 저하되므로 가능한 한 거의 실행하지 않기를 원합니다. 따라서 먼저 경계 상자를 확인하고 맞은 경우에만 한 단계 더 깊이 들어가 더 세밀한 접근 방식을 테스트하십시오 (무엇이든).
Philip Allgaier

고마워, 나는 어쨌든 그렇게 할 계획 이었지만, '입상 점검'이 무엇인지 완전히 확신하지 못한다. :)
async

1
유일하게 중요한 세부 사항이 누락되었습니다. 무엇을 하시겠습니까? 정확한 충돌에 관심이 있습니까? 원으로 캐릭터를 근사하게 하시겠습니까? 먼지 입자가 캐릭터의 눈과 나머지 입자와 별도로 충돌하기를 원하십니까?
Anko

@Anko 원으로 그 모양을 어떻게 근사 할 수 있습니까? 나는 픽셀 정확도가 아니라 상당히 자연스럽고 정밀한 충돌에 관심이 있습니다.
async

1
마찬가지로 . "좋은 것"과 "자연적인 것"은 무엇을 의미합니까? 이것은 철학적 인 질문입니까?
Anko

답변:


12

서클 콜 라이더. 물리학에 영향을받는 특정 부분이나 부 자연스럽게 보이는 부분으로 멋진 일을하지 않는 한, 나는 그것을 말할 것입니다.

지나치게 복잡하지 마십시오.

이를 위해 완전한 쿼드 트리 구조가 필요하지 않습니다. 여러 개의 상자 나 원을 직선 배열로 만든 다음 모든 상자와 교차하십시오. 이것은 성능이 충분히 중요하지 않을 수 있으며 쿼드 트리를 사용하면 그다지 많은 것을 얻지 못할 것입니다.


3
그렇습니다. 단일 모양으로 덮지 않으면 여러 모양으로 구성된 작은 배열을 만드십시오. 예를 들면 : i.imgur.com/Dd4yyGN.png
MichaelHouse

Jonkel & @ Byte56에게 감사합니다. 내 상황에서 몇 가지 모양을 사용하는 것이 올바른 해결책 인 것 같습니다. 정확하고 빠른 구현이 간단합니다. 이것을 고려하지 않고 쿼드 트리로 바로 뛰어 들었다는 것을 믿을 수 없습니다! 어
async

정확도를 높이기 위해 본체의 원 콜 리더와 부리의 직사각형입니다.
Kroltan

14

2 단계 점검 프로세스

첫 번째 단계에서 경계 상자를 확인하고 충돌이 없으면 테스트가 끝난 것입니다. 충돌이 발생하면 두 번째 패스로 넘어갑니다

두 번째 단계 에서 정밀도를 원하고 진정한 픽셀 완벽 솔루션을 원한다면 픽셀 완벽 검사 통과를 수행 할 수 있습니다

이미지는 PNG (또는 알파 채널을 포함하는 다른 파일 형식)이기 때문에 다소 쉽습니다.

  1. 장면에서 그 하나의 객체와 조류 사이의 교차 영역을 계산하여 두 이미지에 간단한 교차 사각형을 생성하십시오.
  2. 해당 교차점에서 두 이미지 모두에서 각 픽셀의 알파 값이 0보다 큰지 확인하십시오.
  3. 이러한 픽셀이 있으면 충돌이 발생한 것입니다. 그렇지 않으면 아니오

이미지 알파 채널을 보면 픽셀 완벽 충돌에 필요한 모든 정보가 이미 포함되어 있음을 알 수 있습니다

이미지의 알파 채널

픽셀 퍼펙트 콜리 전은 일반적으로 비싸기 때문에, 처음에는 경계 상자 또는 더 자세한 콜리 전 수치 (Anko가 제안한 것과 같은)로 대략적인 추정을 수행하면 소중한 시간을 절약 할 수 있습니다

Anko가 제안한 "finer"상세 충돌 경계 상자 :

더 자세한 경계 상자

추신 : 이미지에 후광, 효과 또는 충돌하고 싶지 않은 0이 아닌 알파 채널이 있으면 알고리즘 임계 값을 쉽게 조정할 수 있습니다.


1
감사합니다! 그러나 결국 픽셀 완벽 정밀도가 필요하지 않습니다. 그러나 훌륭한 대답은 나중에 유용 할 것입니다.
async

물론 친구, 그래, 픽셀 퍼펙트 콜리 전은 2D 파이터와 같이 실제로 필요한 게임을 제외하고는 거의 항상 과잉입니다.
codemonkey

3

나는 몸통에 원을 사용하고 부리에 하나의 직사각형을 사용하지만 그것은 내 의견 일뿐입니다. 충돌 지오메트리를 과도하게 복잡하게 만들면 앱 속도가 느려질 수 있지만 실제로 화면의 문자 수가 두 배가됩니다.


0

어쩌면 일종의 이상한 다각형 / 모서리 충돌체를 사용할 수 있습니다.

이것이 어떻게 작동하는지 확실하지 않지만 :

두 개체 : 개체 1 : 새 (o1), 개체 2 : 새를 칠 수있는 것 (o2)

1) 문제의 첫 번째 객체 (o1)에 꼭 맞는 다각형 인 경계 모양을 정의합니다.

2) O1의 가장자리, O2를 가져옵니다 그 수 알만에서 충돌 할 수없는 생각할에서 충돌 O2 거치지 않고 통해 반대 O1 또는 그.

모양 (o2)의 위치와 크기를 사용하면 아마도 o2에 가까운 다른 가장자리 (o1의 "뒤에"있기 때문에)에 맞지 않을 수있는 o1의 가장자리를 분리 할 수 ​​있습니다. 빗변이 위를 향하고 오른쪽을 향한 직각 삼각형과 직각으로 직각에 접근하는 직사각형 (x 축을 따라 긴 변)이있는 경우 시작 및 끝 y 값이 둘 다이므로 생략 할 가장자리를 알 수 있습니다 사각형 위 또는 아래.

3) o2의 가장자리에있는 점 중 하나가 2 단계에서 선택한 o1의 가장자리에있는 점과 같은지 확인합니다.

이 개념은 다각형 (예 : 가장자리가 명확한 것)을 충돌시키는 데 가장 적합하지만 원을 하나의 긴 가장자리로 처리 할 수 ​​있습니다 (예 : o2가 원인 경우).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.