풀 게임을위한 알고리즘이 있습니까?


14

풀 게임에서 볼의 방향과 속도를 계산하는 알고리즘을 찾고 있습니다. 풀 게임은 내가 기억할 수있는 가장 오래된 컴퓨터 게임이기 때문에 이것에 대한 오픈 소스 코드 유형이 있어야합니다.

한 볼이 다른 볼을 칠 때 두 볼의 방향을 계산하는 알고리즘이 필요합니다. 서로 충돌하는 정확한 각도와 속도에 따라 다릅니다.

Java 코딩을 연습하고 싶기 때문에 이러한 유형의 코드가있는 Java 코드 또는 패키지를 찾고 있습니다.


2
그러나 직접 해결하려면 벡터에 대한 지식이 필요할 것입니다. 운 좋게도, 누군가 다른 날이 사이트의 다른 곳에서 선형 수학에 대한 연습을 게시했습니다 .
doppelgreener

답변:


8

기본 구면 충돌 감지 / 응답은 매우 간단하지만 스핀을 처리해야하므로 좋은 풀 시뮬레이션을 위해 충분히 정확하게 수행하는 것이 더 까다로울 수 있습니다.

물리 엔진의 존재를 알고 있습니까? 몇 가지 인기있는 예는 이것입니다 (그리고 그들은 풀 공 충돌보다 많은 것을 할 수 있습니다). 아마도 풀 게임을 만들기에 좋은 선택이지만 Java를 배우기에는 그리 좋지 않습니다 ...

2D에서

Box2D : http://www.box2d.org

다람쥐 : http://code.google.com/p/chipmunk-physics/

3D에서

글 머리 기호 : http://bulletphysics.org/

ODE : http://www.ode.org

큰 예산의 상용 게임을 만드는 경우 :

하복 : http://www.havok.com


1
Java 물리 엔진은 무엇입니까?
Ricket

이 자바 포트, 또는 Box2D의, 다람쥐, 총알, 그리고 ODE에 대한 최소한 바인딩에서
bluescrn


2

스핀이 모델링되지 않은 간단한 풀 게임의 경우 알고리즘이 매우 간단합니다.

  1. 충돌이 발생하는지 확인하려면 볼 사이의 거리가 반경의 합보다 작은 지 확인하십시오.
  2. 영향의 법선을 계산
  3. 속도 차이, 법선, 충격 계수 및 질량을 기반으로 충격력 계산
  4. 두 볼에 충격력을가하십시오

의사 코드에서 이것은 다음과 같습니다.

vector difference = ball2.position - ball1.position
float distance = sqrt(difference)
if (distance < ball1.radius + ball2.radius) {
    vector normal = difference / distance
    //vector velocityDelta = ball2.velocity - ball1.velocity
    vector velocityDelta = ball1.velocity - ball2.velocity

    float dot = dotProduct(velocityDelta, normal)

    if (dot > 0) {
        float coefficient = 0.5
        float impulseStrength = (1 + coefficient) * dot * (1 / ball1.mass + 1 / ball2.mass)
        vector impulse = impulseStrength * normal
        ball1.velocity -= impulse / ball1.mass
        ball2.velocity += impulse / ball2.mass
    }
}

모든 공의 질량이 동일하고 풀 게임의 모든 공에 대해 일정한 반지름을 가정하는 경우 알고리즘에서 질량을 생략 할 수 있지만 코드는 이러한 단순화없이 더 유용합니다.

코드는 이 자습서를 기반으로 하지만 임펄스 곱셈이 잘못되었음을 기억합니다.


도트가 0보다 작은 경우는 어떻습니까? 나는이 의사 코드 (그리고 당신도 연결했지만 다른 하나는 음수의 제곱을 취하려고 노력하고 있습니다. 아마 그것은 당신이 식별 한 문제 일 것입니다). 모든 입력 위치와 속도로 결과를 얻고 싶습니까?

@Poldie 점이 음수이면 공이 이미 서로 멀어지고있는 것입니다. 이 경우 충돌을 처리 할 필요가 없습니다.
msell

방금 내 코드 버전을 여기에 올렸 습니다 : ideone.com/DhsAoW 그리고 110,90 및 100,100의 위치와 0,2 및 0, -3의 속도에 대해 -0.707을 얻습니다. 이것은 다소 정면 충돌입니다. 초기 반경 기반 충돌 감지 검사가 이미 수행되었다고 가정합니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.