스프라이트와 사용자가 생성 한 모양 사이의 충돌을 감지하는 방법은 무엇입니까?


9

스프라이트와 일종의 사용자 생성 모양 사이의 충돌을 감지하는 방법.

예를 들어. 화면에 일부 물체가 있습니다. 사용자는 손가락을 잡고 개체 주위에 원 모양을 그립니다 (선택 규칙은 스프라이트 주위에 원을 그리는 것이지만 그림 모양은 다양 할 수 있습니다). 선택한 객체를 감지해야합니다.

(데모 이미지) : 원래 http://i52.tinypic.com/28h0t1g.png로 게시되었습니다.


최종 예제에서 파란색이 선택되고 빨간색이 아닌 이유를 설명 할 수 있습니까? 선이 실제로 스프라이트에 닿아 야하는지 명확히 할 수 있습니까? 세 번째 예는 빨간색 상자를 건드리지 않지만 선택된 것으로 표시됩니다. 다섯 번째 예는 매우 유사하지만 선택되지 않았습니다. # 3과 # 5의 차이점은 무엇입니까?
Romen

답변:


2

셰이프가 주로 사용자의 선 세그먼트 (또는 제어점이있는 베 지어 곡선)로 그려지는 경우 Separating-Axis-Theorem 으로 널리 사용되는 알고리즘을 구현할 수 있습니다 . 간단히 말해 : 모양이 겹치지 않는 축 (방향을 나타내는 단위 벡터)이 있으면 (투영 된 값이 양의 차이를 나타내지 않음) 개체가 겹치지 않습니다. 나는 이것을 과거에 사용했으며 매력처럼 작동했습니다.


1

Crayon Physics 에서처럼 모양을 손으로 그린 ​​경우 직선 배열을 잡고 각 모양과의 충돌을 확인할 수 있습니다. 직선에도 불구하고 베 지어 곡선 또는 이와 유사한 것을 사용할 수 있습니다 .


0
  • 화면 (또는 모양이있는 표면)과 동일한 크기의 버퍼를 만듭니다. 각 위치에 스프라이트가 있는지 여부를 부울 값으로 포함합니다. 그런 다음 사용자 모양의 모든 "픽셀"을 해당 위치에서 스프라이트인지 여부를 확인하십시오 (부울 값을 확인하여). 또는 부울 대신 ID를 저장하여 더 많은 스프라이트를 만들 수 있습니다. 그러나 이것은 1 스프라이트의 경우입니다.
  • 사용자가 생성 한 모양을 일련의 선으로 나타낼 수 있으면 해당 선이 스프라이트를 교차하는지 여부를 확인할 수 있습니다. 스프라이트는 직사각형 모양이고 사용자 모양은 선이므로 "선 사각형 교차점"을 찾으십시오 ...

접근 방식은 비트 맵인지 벡터인지에 따라 선택한 데이터 구조에 따라 다릅니다.

첫 번째 접근 방식은 임의의 복잡한 모양을 처리 할 수 ​​있으며 구현이 간단하지만 더 많은 메모리를 사용합니다. 실제로 압축을 사용하여 메모리 오버 헤드를 줄이고 계층 적 데이터 구조 (octree)를 사용하여 속도를 높일 수 있습니다 ...

두 번째 접근 방식은 구현하기가 쉽지 않지만 더 많은 처리 능력을 사용합니다.

각 경우에 중요한지 측정하십시오. 구현하기가 더 쉽기 때문에 첫 번째 작업을 시도합니다. 행운을 빕니다. :)

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