다음은 유사한 유형의 시뮬레이션에 대한 논문 링크가있는 게시물입니다 (게임이 아닌 공학 / 학술적 맥락에서) : https://gamedev.stackexchange.com/a/10350/6398
이러한 종류의 "와이어"시뮬레이션 (Umihara Kawase 게임에서 볼 수 있음)에 대한 충돌 감지 및 응답에 대해 적어도 두 가지 다른 접근 방식을 시도했습니다. 적어도, 나는 이것이 당신이 추구하는 것이라고 생각합니다. 이런 종류의 시뮬레이션에는 특정한 용어가없는 것 같습니다. 대부분의 사람들처럼 보이기 때문에 "로프"보다는 "와이어"라고 부르는 경향이 있습니다. "로프"를 "입자 사슬"과 동의어로 간주하십시오. 그리고 닌자 로프의 끈적 끈적한 행동을 원한다면 (즉, 밀고 당길 수 있습니다), 이것은 밧줄보다 단단한 철사와 비슷합니다. 어쨌든..
Pekuja의 대답은 양호합니다. 세 지점의 부호있는 영역이 0 인 시간을 해결하여 연속적인 충돌 감지를 구현할 수 있습니다.
(OTOH를 완전히 기억할 수는 없지만 다음과 같이 접근 할 수 있습니다 .a, b, c를 통과하는 행에 점 a가 포함될 때 시간 t를 찾으십시오 (점 (ab, cb) = 0으로 t)의 값을 찾은 다음 유효한 시간 0 <= t <1이 주어지면 세그먼트 bc에서 a의 파라 메트릭 위치 s를 찾습니다. 즉 a = (1-s) b + s c b와 c (즉, 0 <= s <= 1 인 경우)는 유효한 충돌입니다.
AFAICR 당신은 다른 방법으로 접근 할 수 있습니다 (즉, s를 풀고 t를 찾기 위해 이것을 꽂습니다). 그러나 훨씬 덜 직관적입니다. (이것이 말이되지 않으면 죄송합니다. 노트를 파낼 시간이 없으며 몇 년이 지났습니다!)
따라서 이벤트가 발생하는 모든 시간을 계산할 수 있습니다 (예 : 로프 노드를 삽입하거나 제거해야 함). 가장 빠른 이벤트 (노드 삽입 또는 제거)를 처리 한 다음 t = 0과 t = 1 사이에 더 이상 이벤트가 없을 때까지 반복 / 재귀하십시오.
이 접근 방식에 대한 경고 하나 : 로프를 감쌀 수있는 객체가 동적 일 경우 (특히, 객체를 시뮬레이션하거나 로프에 미치는 영향을 반대로하는 경우) 그 객체가 각 클립을 통과하거나 통과 할 경우 문제가 발생할 수 있습니다 다른-와이어가 엉 키게 될 수 있습니다. 그리고 box2d 스타일의 물리 시뮬레이션에서 이러한 종류의 상호 작용 / 이동 (객체의 모서리가 서로 미끄러 져 들어가는 것)을 방지하는 것은 확실히 어려울 것입니다. 그 맥락에서 물체 사이의 작은 양의 침투는 정상적인 행동입니다.
(적어도 .. 이것은 "wire"의 구현 중 하나에 문제가있었습니다.)
훨씬 더 안정적이지만 특정 조건에서 일부 충돌을 놓치는 다른 솔루션은 정적 테스트를 사용하는 것입니다 (즉, 시간 순서에 대해 걱정하지 말고 각 세그먼트를 찾은대로 재귀 적으로 세분화하십시오). 훨씬 더 견고 함-와이어가 모서리에서 엉키지 않고 소량의 침투가 양호합니다.
Pekuja의 접근 방식이 이것에도 효과가 있다고 생각하지만 다른 접근 방식이 있습니다. 내가 사용한 한 가지 접근 방식은 보조 충돌 데이터를 추가하는 것입니다. 세계의 각 볼록한 정점 v (로프가 감쌀 수있는 모양의 모서리)에서 직선 선분 uv를 형성하는 점 u를 추가하십시오. 여기서 u는 일부입니다 "모서리 내부"(즉, 세계 내부, "뒤"v)를 가리 킵니다. u를 계산하려면 보간 법선을 따라 v에서 안쪽으로 광선을 투사하고 v 이후 또는 광선이 세상의 가장자리와 교차하기 전에 약간의 거리를 멈출 수 있습니다. 솔리드 영역을 종료하거나 시각적 도구 / 레벨 편집기를 사용하여 수동으로 세그먼트를 월드에 페인트 할 수 있습니다.
어쨌든, 이제 "corner linesegs"uv 세트가 생겼습니다. 와이어의 각 uv 및 각 세그먼트 ab에 대해, ab와 uv가 교차하는지 확인하십시오 (즉, 정적, 부울 라인-라인-예 : 교차 쿼리). 그렇다면, 재귀를 반복하고 (lineegeg ab를 av 및 vb로 분할, 즉 v를 삽입) v에서 로프가 구부러진 방향을 기록합니다. 그런 다음 와이어에서 인접한 lineegs ab, bc의 각 쌍에 대해 b에서 현재 굽힘 방향이 있는지 테스트합니다. b가 생성 될 때와 동일하다 (이러한 모든 "굽힘 방향"테스트는 부호있는 영역 테스트 임). 그렇지 않은 경우 두 세그먼트를 ac로 병합하십시오 (예 : b 제거).
아니면 내가 합병하고 나뉘었을 수도 있지만 잊어 버릴 수도 있지만 가능한 두 가지 명령 중 적어도 하나에서 작동합니다! :)
현재 프레임에 대해 계산 된 모든 와이어 세그먼트가 주어지면 두 와이어 끝점 사이의 거리 제약 조건을 시뮬레이션 할 수 있습니다 (그리고 내부 점, 즉 와이어와 월드 사이의 접점도 포함 할 수 있음). ).
어쨌든, 잘만되면 이것은 약간의 사용이 될 것입니다.