편집 / 업데이트 : 지금 가장 큰 질문은 3 단계의 "t = ..."방정식이 좋은 아이디어인지 또는 더 좋은 방법인지 여부입니다. 대부분의 다른 문제는 부분적으로 또는 전체적으로 해결되었지만 실제로이 문제에 대한 의견이나 답변은 없습니다. 다시 말하지만, 분석 솔루션이 필요할 수도 있고, 속도와 거리가 너무 길고, 객체가 너무 작습니다. 이런 종류의 상황을 잘 처리 할 수있는 특수 반복 / 재귀 솔루션은 분명히 열려 있습니다.) 지금까지 도와 주셔서 감사합니다. 모두 훌륭하고 여러분의 생각과 도움에 정말 감사드립니다!
작은 고속 물체 사이의 충돌을 감지하려고합니다. 이것은 상대적으로 낮은 속도에서도 터널링이 매우 쉽게 발생할 수있는 상황입니다.
광선 주조는 작동하지 않습니다. 하나의 물체와 고정 벽 사이가 아니라 두 개의 고속 물체 사이의 충돌을 감지하기 때문입니다. (레이 캐스팅을 오해하지 않는 한?) 성능은 매우 중요합니다. 가능하다면 큰 성능 저하를 피하고 싶습니다. 이미 기능적이고 매우 효과적인 쿼드 트리 ( http://en.wikipedia.org/wiki/Quadtree )가 구현되어 있으므로 아래에 설명 된대로 수정하고 사용해야합니다.
편집 : 시간 간격을 줄이면 작동하지 않습니다. 이 솔루션의 속도가 너무 빠르기 때문에 성능 충돌이 너무 커져도 터널링 충돌의 대부분은 여전히 사라 집니다. (예를 들어, 시간 간격 당 수백만 단위로 측정 된 속도로 진행하는 크기가 약 1 단위 인 물체가있을 수 있습니다 ...)
제안 된 해결책:
1 단계:
각 객체의 움직임 주위에 상자를 만든 다음 해당 상자를 쿼드 트리에 공급하여 가능한 충돌의 초기 목록을 생성합니다. 다음 이미지를 참조하십시오 (이 이미지는 한 위치에서 다른 위치로 이동하는 원 오브젝트와 사각형을 생성하는 움직임을 보여 주며, 이는 쿼드 트리에 공급됩니다)
2 단계 : (이 단계를 건너 뛰고 싶습니까?)
쿼드 트리에서 생성 된 가능한 충돌 목록을 살펴 봅니다. 가능한 각 충돌에서 사각형이 교차하는지 확인하십시오. 그렇다면 3 단계로 진행하십시오.
편집 : 아래에서 Sean Middleditch는 스윕 볼륨 / 캡슐의 교차점 (객체가 원인 경우)을 사용하도록 제안했습니다. 1) 2 단계를 완전히 건너 뜁니다. 2) 2 단계를 수행하십시오. 3) Sean의 방식으로하십시오. Sean의 방법은 내 상자 아이디어보다 계산 비용이 많이 들지만 내 방법보다 더 많은 오 탐지를 제거하여 최종 단계에 도달하지 못하게합니다.
누구든지이 세 가지 선택 중에서 가장 좋은 것에 대해 경험을 통해 말할 수 있습니까? (이 물리 엔진을 몇 가지 다른 용도로 사용하려고하므로 어떤 솔루션을 쉽게 측정 할 수있는 하나의 특정 테스트 사례가 아니라 가장 광범위한 상황에서 가장 빠르게 작동하는 "일반적으로 최상의"솔루션을 찾고 있습니다. 가장 빠릅니다).
3 단계 :
판별 (즉, 제곱근 아래 부분)이 음수이거나 0이면 충돌이 없으면 아래의 t = 방정식을 사용하고, 양수이면 충돌 시간으로 t 값을 사용하십시오 (그 후에 위치를 쉽게 조정할 수 있음). 충돌 후 두 개체가 모두 계속 존재하는 경우). 방정식:
t = (-1/2 sqrt ((2 a w-2 a x + 2 b y-2 b z-2 c w + 2 c x-2 d y + 2 dz)) ^ 2-4 (w ^ 2- 2w x + x ^ 2 + y ^ 2-2 y z + z ^ 2) (a ^ 2-2 a c + b ^ 2-2 b d + c ^ 2 + d ^ 2-r ^ 2-2 r ss ^ 2))-a w + a xb y + b z + c wc x + d yd z) / (w ^ 2-2 w x + x ^ 2 + y ^ 2-2 y z + z ^ 2 ) .
여기서 (1과 2는 객체 1과 2를 나타내는 데 사용됩니다) :
t는 0과 -1 사이의 음의 시간 값이며, 여기서 0은 현재 프레임이고 -1은 이전 프레임입니다.
a = x 위치 1;
b = y 위치 1;
c = x 위치 2;
d = y 위치 2;
w = x 속도 1;
x = x 속도 2;
y = y 속도 1;
z = y 속도 2;
r = 반경 1;
s = 반경 2;
유도 : (^ 2는 제곱을 의미합니다)
객체의 움직임에 대한 파라 메트릭 방정식 (예 : newxpos1 = a + t w)을 가져 와서 거리 공식에 꽂습니다 (양쪽 제곱) : 거리 공식 제곱 = (a + t w-(c + t x)) ^ 2 + (b + t y-(d + t * z)) ^ 2. t는 음수가 될 것임을 기억하십시오. 두 개의 원형 물체에 대한 충돌 시간을 찾기 위해 왼쪽을 (r + s) ^ 2로 설정했습니다. 이차 방정식 (그리고 많은 지루한 대수)을 사용하여 t를 풀면 위의 "t = ..."방정식을 얻게됩니다.
내 질문 :
1) 이것이 좋은 방법입니까? 전혀 작동하지 않습니까? 예기치 않은 문제가 발생합니까? (한 번에 두 개 이상의 물체가 충돌 할 때 문제가 발생한다는 것을 알고 있지만, 실제로 반대하는 유일한 경우는 상대적 속도가 낮을 때입니다 (상대 속도가 높은 경우) 알고리즘이 제공하는 "goofy"솔루션은 "충분히"좋으며, 인간이 오류를 보는 것은 불가능할 것입니다.) 2 개 이상이 동일한 시간 단계에서 낮은 상대 속도와 충돌하면 대부분의 솔루션은 비탄력적인 충돌을 계획하지 않기 때문에 어쨌든 충분히 가까이 있어야합니다.)
2) 성능이 많이 저하됩니까? 나는 그것을하지 않을 것이라고 생각하지만, 그렇게한다면 더 좋은 방법이 있습니까?
3) 2 단계를 건너 뛰고 1 단계에서 3 단계로 바로 가야합니까? 분명히 2 단계는 중요하지 않지만 성능에 도움이 될 수 있습니다 (또는 절약하는 것보다 더 많은 CPU 시간이 소요될 수 있음).
다른 모든 의견, 제안 또는 비판은 매우 환영합니다. 도와 주셔서 감사합니다!