공이 구석에 닿으면 어디로 향합니까?


46

삼각법을 정리하고 간단한 수학적 모델로 여기를 도울 수 있기를 바랍니다. 여기 이미지가 첨부 된 지금까지의 모델이 있습니다. 공이 매우 빠르게 움직일 때 프레임 애니메이션에 다른 문제가 있다는 것을 알고 있지만 지금은 ballDx와 ballDy를 계산하면됩니다. ballDx = 0 (수직 이동 만)도 가능하지만 볼이 편향 될 때 ballDx는 다른 값을 얻을 수 있습니다.

공을 움직일 수없는 솔리드 객체의 모서리와 볼 사이의 2D 충돌


22
이것이 그들이 "코너 사건"이라고 부르는 것입니까?
Andrew Grimm

2
확실히, 일이 진행됨에 따라 곧 우리는 상대성 이론을 사용하여이를 해결할 수 있습니다. 문제는 점점 커지고 있습니다.
Lumis

답변:


45

참고 : 다음의 모든 사항은 볼 표면에 마찰이없는 것으로 가정합니다 (따라서 회전을 시작하거나 다르게 반동하지 않습니다).

충돌이 발생하면 공이 코너에 닿습니다. 단단한 물체가 충돌하면 소위 표면 법선을 따라, 즉 충돌 지점에서 표면에 수직으로 힘이 작용합니다.

공이기 때문에 표면에 수직 인 것은 공의 중심을 향합니다. 자, 우리는 힘의 방향을 알고 있습니다. 힘의 크기는 어떻습니까? 탄성 충돌 (사각형이 움직일 수 없음)을 가정 할 때, 공은 충돌하는 속도와 같은 속도로 리바운드해야합니다.

(nDx, nDy)는 충돌 후의 속도, (oDx, oDy) 충돌 전의 속도, (x, y) 충돌 지점에서의 볼의 위치로 지정하십시오. 공이 충돌하는 코너가 (0,0)에 있다고 가정합시다.

통찰력을 공식으로 표현하면 다음과 같습니다.

(nDx, nDy) = (oDx, oDy) + c * (x, y)
length (nDx, nDy) = length (oDx, oDy)

다음과 같습니다.

nDx = oDx + c * x
nDy = oDy + c * y
nDx^2 + nDy^2 = oDx^2 + oDy^2

마지막 방정식에서 처음 두 방정식을 대체하면 다음과 같은 결과를 얻습니다.

(oDx + c * x)^2 + (oDy + c * y)^2 = oDx^2 + oDy^2

이항 톰을 사용하여 확장

(a+b)^2 = a^2 + 2ab + b^2 

수율 :

oDx^2 + 2 * oDx * c * x + (c * x) ^ 2 + oDy^2 + 2 * oDy * c * y + (c * y) ^ 2 = oDx^2 + oDy^2
2 * oDx * c * x + 2 * oDy * c * y + (c * x) ^ 2 + (c * y) ^ 2 = 0
(2 * oDx * x + 2 * oDy * y) * c + (x^2 + y^2) * c^2 = 0

이 2 차 방정식 c에는 두 가지 해가 있는데 그 중 하나는 0입니다. 분명히, 그것은 충돌의 결과로 볼의 방향이 바뀔 것이기 때문에 우리가 관심있는 해답이 아닙니다. 다른 솔루션을 얻으려면 양쪽을 c로 나누고 다음을 얻습니다.

(2 * oDx * x + 2 * oDy * y) + (x^2 + y^2) * c = 0

그건:

 c = -(2 * oDx * x + 2 * oDy * y) / (x^2 + y^2)

요약하면 다음과 같습니다.

c = -(2 * oDx * x + 2 * oDy * y) / (x^2 + y^2)
nDx = oDx + c * x
nDy = oDy + c * y

편집 : 코드에서 :

if (collision) {
    float x = ballX - cornerX;
    float y = ballY - cornerY;
    float c = -2 * (ballDx * x + ballDy * y) / (x * x + y * y);
    ballDx = ballDx + c * x;
    ballDy = ballDy + c * y;
}

몇 가지 구현 고려 사항 : 시뮬레이션 단계 후에 볼의 위치로 근사치 (x, y)를 구할 수 있지만,이 근사치가 처짐 각도를 변경하므로 매우 눈에 띄게됩니다. 따라서 시뮬레이션 단계는 매우 정밀해야합니다 (아마 공은 단계 당 직경의 1/20 이상 이동하지 않습니다). 보다 정확한 솔루션을 위해 충돌이 발생하는 시간을 계산하고 그 시점에서 시뮬레이션 단계를 분할 할 수 있습니다. 즉 충돌 지점까지 부분 단계를 수행하고 나머지 단계에서 다른 부분 단계를 수행 할 수 있습니다.

편집 2 : 영향 지점 계산

r은 시뮬레이션 단계 시작시 볼의 반경, (x0, y0) 위치 및 (dx, dy) 속도가되게하십시오. 간단하게하기 위해 문제의 코너가 (0,0)에 있다고 가정합니다.

우린 알아:

(x,y) = (x0, y0) + (dx, dy) * t

우리는 원한다

length(x,y) = r

그건

(x0 + dx * t) ^ 2 + (y0 + dy * t) ^ 2 = r^2
x0^2 + 2 * x0 * dx * t + dx^2 * t^2 + y0^2 + 2 * y0 * dy * t + dy^2 * t^2 = r ^ 2
(dx^2 + dy^2) * t^2 + (2 * x0 * dx + 2 * y0 * dy) * t + (x0^2 + y0^2 - r^2) = 0
\____  _____/         \____________  ___________/       \_______  ________/
     \/                            \/                           \/
     a                             b                            c

그것은 t 의 2 차 방정식 입니다. 판별하는 경우

D = b^2 - 4 * a * c

공이 현재 코스에서 절대로 코너에 닿지 않습니다. 그렇지 않으면 두 가지 솔루션이

t1 = (-b - sqrt(D)) / (2 * a)
t2 = (-b + sqrt(D)) / (2 * a)

우리는 충돌이 시작된 시간에 관심이 있습니다 t1.

귀하의 방법은 다음과 같습니다.

    // compute a,b,c and D as given above

    if (D >= 0) {
        t = (-b - sqrt(D)) / (2 * a);
        if (0 < t && t <= ts) {
            // collision during this timestep!

            x = x + t * dx;
            y = y + t * dy;
            ts = ts - t;

            // change dx and dy using the deflection formula 
        }
    }

    x = x + ts * dx;
    y = y + ts * dy;

1
이 가치 +1
동적


3
당신은 매우 일찍 말하지만 At the moment of collision, the ball will be touching the corner이 근사에 대한 정당화를 보지 못합니다 (그리고 그것이 사실이 아니기 때문에 근사해야합니다-공이 곳 에서 닿아 코너가 아닙니다).
피터 테일러

1
@ 피터 테일러 : OP가 사각형 바깥 에 공을 그렸 음을 알았으며 질문에 주어진 충돌 감지 공식도 이것을 가정합니다. 상자 밖에서 생각해야합니다 :-)
meriton-on strike

1
이 답변을 좋아하지만 수학의 $ \ LaTeX $ 마크 업을 사용할 수 있습니다.
Martin Wickman

13

문제를 시각적으로 보는 방법은 다음과 같습니다.

원래 문제 세트는 원과 사각형입니다 (아래 이미지에서 회색). 이것은 포인트 대 둥근 사각형 (검은 색으로 표시)과 같습니다.

따라서 이것은 여러 부분으로 이루어진 문제입니다. 점 충돌 대 상자의 가장자리에서 원래 원의 반지름으로 돌출 된 4 개의 선과 4 개의 원 (사각 원의 반지름이 같은 원의 모서리에서 돌출)을 테스트하고 있습니다.

원본 이미지의 속도가 거칠면 점이 오른쪽 아래 모서리 원에 닿습니다. 모퉁이 원의 한 점을 파악하고 그 각도를 계산 한 후 그 점을 반영하기 만하면됩니다.

여기에 이미지 설명을 입력하십시오

나는 그것의 파생을 독자에게 연습으로 남겨 둘 것이다.


2

저는 게임을하고 있는데 여기에 붙어 있습니다. 그러나 나는 이것이 이런 식으로 간다고 생각한다.

여기에 이미지 설명을 입력하십시오

또 다른 견해가 있습니다. 내 문제는 새로운 dx, dy를 빠르게 계산하는 방법을 모른다는 것입니다 (전통적인 수학을 사용하면 너무 많은 계산이 필요합니다).


새로운 속도 벡터가 블록의 중심에 의존한다고 생각하지 않기 때문에 제 관점은 두 번째 링크의 관점과 다릅니다. 동생은 공이 이전 방향 (dx = -dx && dy =-dy)으로 튀어 오를 것이라고 말했지만 그렇게 생각하지 않습니다.
Risa

볼이 코너에 닿고 cornerX로부터 ballX 거리가 ballW의 1/4보다 작 으면 뒤로 튀어 오릅니다. 그렇지 않으면 오른쪽으로 앞으로 향하게됩니다. 이것은 현재 사용중인 간단한 모델이며 정확한 각도를 찾기 위해 미세 조정되지 않았습니다.
Lumis

0

운동학은 계산 에 가장 편리한 기준 프레임과 같이 올바른 것을 선택하는 것 입니다.

여기서 우리는 먼저 축을 볼 중심과 모서리 사이의 선에 평행 한 ( x ' ) 및 직각 ( y' ) 구성 요소로 해석 하는 변환 T 를 정의합니다 . 역변환 T * 는 원래 좌표계를 복원합니다.

이 새로운 기준 틀에서, 반사 (물리의 시간과 공간 대칭)에 의해, 우리는 접촉 M 의 속도 변환 ( 점 임펄스 )을 x ' 성분 을 반전시키고 y' 성분을 변경하지 않은 채로 둡니다 . 에서는 매트릭스 조건이 대각선 대각 행렬 -1 1이다.

충돌 후의 속도는 간단히 V ' = T * 입니다. M . T . Vo에 .

충돌 시간 t는 다음 막 (위한 해결책 T . ) + ( X . T . Vo에 ) ( t ) = R (X)는 X 축 투영 연산자이고 , R은 볼의 반경이다. 재 배열, 우리가 얻을
t = ( R - ( T . )) / (( X . T . Vo에 ) ( t ))

이것은 모든 복잡한 수학을 엄격하게 작성, 테스트 및 디버깅 된 표준 그래픽 라이브러리에 저장한다는 뚜렷한 이점이 있습니다. 이 솔루션은 2D 및 3D 상황에서도 동일합니다. 그래픽 라이브러리 만 전환하면됩니다. 마지막으로 물리 문제를 해결하기 전에 먼저 적절한 참조 프레임에 대해 생각해야한다는 점을 강조합니다 . NIH 유혹은 항상 있지만 실제로는 더 간결한 솔루션을 사용할 수있을 때 버그를 만드는 방법 일뿐입니다.

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