2009-12-07 5 views
2

작은 게임을 구현 중이며 물리가 올바르게 작동하는 데 문제가 있습니다. 이 게임에는 하나의 볼 (프레임에서 프레임으로 이동하는 원, 반경이 바뀔 수 있음)과 여러 벽 (프레임에서 프레임으로 변경되고 이동하는 선분)이 있습니다. 나는 정확하게 충돌을 감지 할 수 있으며 올바른 방향으로 공을 튀게하는 것은 문제가되지 않습니다.원과 선 세그먼트 사이의 충돌 처리

공이 한 프레임의 선과 교차하고 다음 프레임에서 다시 공 교차하는 상황에서 어려움이 발생하여 이중 바운스가 발생합니다. 나는 올바른 위치에 올 때까지 라인의 정상을 따라 공을 되돌릴 수 있지만, 문제의 라인이 축을 따라 부딪 칠 때 정말로 이상한 행동을 일으킨다. (핑퐁 공이 직립 이쑤시개에 떨어지는 것을 상상해 보라. 갑자기 이쑤시개의 한쪽에 있도록 ...). 공이 주어진 프레임에서 두 개 이상의 선과 교차 할 때 몇 가지 문제가 있습니다 (4 개의 선이 함께 직사각형을 만들고 공이 사각형의 모서리와 교차한다고 가정) - 어느 방향으로 튀어야합니까? 어느 방향으로 이동해야합니까?

저는 구체적인 질문이 없지만 유용한 팁이나 유용한 자습서를 찾고 있습니다. 지금까지 발견 한 모든 2D 것들은 직사각형의 교차점만을 커버합니다.

차이가있을 경우 XNA를 사용하고 있습니다.

감사합니다,
카메론

+0

Farseer 물리 엔진을 확인해 보셨습니까? http://www.codeplex.com/FarseerPhysics – Martin

+0

사실, 방금 질문을 한 직후에 다운로드했습니다. 나는 그것을 시험해 보려한다. - 지금까지는 좋았다. (나는 문서를 읽었다)! – Cameron

+0

결국 엔 엔진이 내가 원하는 것을 할 수 없었고, 문서가 다소 부족하여 내 맞춤 물리 엔진으로 돌아가서 아래 제안 사항 중 일부를 사용하여 개선했습니다. – Cameron

답변

2

등 힘을 계산 한 후, 충돌이 진정으로 일이 지난 현재 프레임 사이의 지점에 다시 보간 그 시점에 다시 객체를 이동해야 대부분의 물리 라이브러리에 보편적 인 문제. "침투 깊이"("물리학"과 함께, 내가 제안하거나 완전히 다른 것을 발견 할 수 있습니다 : D)에 대해 Google에서 이러한 라이브러리라도 자신의 트릭을 사용한다는 사실을 알게 될 것입니다.

싸구려 하나가 당신의 업데이트 빈도를 증가시키는 것이다 :

이 두 가지 솔루션이 있습니다. 하나의 큰 스텝 대신 10 개의 작은 스텝으로 오브젝트를 움직이면 침투력이 줄어들어 볼을 벽으로부터 멀리하여 오프셋하는 것이 덜 눈에.니다.

값 비싼 것은 지속적인 충돌 감지입니다. 움직이는 물체와 정지 된 물체가있을 때, 둘 다 교차 할 정확한 시점을 알려주는 알고리즘이 있습니다. Google은 "스윕 구형 직사각형 교차점"을 사용하여 이들 중 일부를 찾습니다.

다음과 같이 업데이트 할 수 있습니다. 공이 1.0 단위만큼 이동해야합니다. 충돌을 확인하십시오. 충돌은 0.25 단위 이후에 발생하므로 공을 0.25 단위 이동하고 반사 벡터를 계산하여 (공이 벽에서 튀어 오름) 나머지 0.75 단위로 충돌 점검을 반복합니다 (공의 최종 위치를 알기 전까지). 이렇게하면 완전히 관통하는 것을 피할 수 있으며 공이 너무 빨라서 일반적으로 단일 업데이트로 벽을 건너 뛸지라도 충돌이 감지됩니다.

+1

답장을 보내 주셔서 감사합니다! 나는 더 많은 시간을 할 때 당신이 제안한 것을 확실히 구글로 올릴 것이다. 나는 충돌이 감지 될 때까지 마지막 프레임에서 현재까지의 모든 위치를 아주 작은 백분율 (공이 한 픽셀 이동하기에 충분할만큼)으로 보간함으로써 내 물리학에서 대부분의 꼬임을 해결했습니다 (효율은 2 차 목표). – Cameron

1

일반적으로 시간 단계의 때문에 충돌이 업데이트 사이에 허용되는 지점을지나 교차 것이라고 인정합니다.

기본적으로, 당신이이입니다

+0

나는 주어진 프레임에서 교차하고있는 모든 물체와 공을 충돌시키는 대신 초기 충돌을 찾아서 해결할 수 있습니다. – Cameron