물리 모델이있는 선박의 AI 제어


19

2D 공간에서 다음을 구현하는 방법에 대한 아이디어를 찾고 있습니다. 불행히도 아직 AI / 경로 찾기 / 자율 제어에 대해 많이 알지 못합니다.

이 배가 자유롭게 움직일 수 있지만 질량과 운동량이 있다고 가정 해 봅시다. 또한 외력이 폭발 (폭발 등)에 영향을 줄 수 있습니다. 플레이어는 언제든지 선박의 목표를 설정할 수 있으며 해당 지점에 도달하여 정지해야합니다.

물리학이 없다면 이것은 간단 할 것입니다. 방향을 가리키고 가십시오. 그러나 기존의 모멘텀을 처리하고 그 자리에서 멈추는 방법? 선박의 배치를 직접 수정하고 싶지 않습니다.

편집 : 선박 자체의 물리 관련 수학은 분명히 문제가되지 않습니다.


곧 이와 비슷한 문제가 발생할 것으로 예상됩니다. 이에 대한 답변을 기대합니다.
Bill

답변:


15

스티어링 행동을 살펴보십시오 . 특히 찾기도착 이 귀하의 요구에 흥미로울 수 있습니다. 이러한 행동은 폭발과 같은 다른 영향으로 인해 선박 위치가 일시적으로 변경되는 경우에도 작동합니다.


+1. 2D 우주 게임의 경우 조향 동작을 프레임 워크로 사용하고 내 대답 중 하나를 해당 프레임 워크 내의 구성 요소로 사용하는 것이 좋습니다.
tenpn

질문을 읽을 때 같은 생각을 제안하려고했습니다. 나는 조향 동작을 많이 사용했으며 쉽고 간단하며 멋진 AI / 모션을 허용합니다.
dotminic

5

정확히 맞다는 것은 쉬운 문제가 아닙니다. 각 솔루션의 세부 사항은 다양하지만 다음 두 가지 중에서 선택할 수 있습니다.

수학 솔루션. 물리 시스템이 충분히 단순하면 모션에 대한 닫힌 형태를 만들고 제동력 적용을 시작하여 언제 멈추어야하는지 계산할 수 있습니다. 제동력이 일정하고 공기 저항이 없으면 이차 분해됩니다.

황제 솔루션. 수작업으로 조정 된 PID 컨트롤러를 사용 하거나 물리 시스템에서 선박의 제동 거리를 실제로 기록 할 수 있습니다. 테스트 베드에서 선박을 최대 속도에서 정지까지 제동하여 이동 한 거리와 작은 시간 간격마다 속도를 기록하십시오. 결과 거리 / 속도 그래프를 데이터 디렉토리에 저장하십시오.

런타임시 그래프를 재구성하고 현재 속도와 목표 속도를 연결하여 거리를 확보하십시오. 목표 지점에서이 거리에서 완전히 브레이크를 밟아야합니다.

이 방법의 장점은이 방법을 사용하여 모든 속도로 정확하게 제동 할 수 있다는 것입니다. 단점은 브레이크가 켜지거나 꺼져 야하는 경우 곡선에 정확하게 도달하지 못한다는 것입니다.


1

전에 말했듯 이이 상황은 조종 행동에 완벽하지만, 약간 확장하고 싶습니다. 도착 동작은이 시나리오에 적합합니다. 장애물을 고려할 수도 있습니다. 여기에서도 장애물 회피 동작을 사용할 수 있습니다.

불행히도 http://www.red3d.com/cwr/steer/ 는 행동에 대한 소스 코드를 제공하지 않습니다. 그러나 Example by Programming Game AI는 동작을 이해하기 쉬운 덩어리로 설명하고 설명합니다. 책을 얻을 수없는 경우 언제든지 소스 코드를 얻을 수 있습니다. http://www.wordware.com/files/ai/

또한 경로 찾기를 포함하도록 움직임을 확장하려는 경우 경로를 계산하는 패스 파인더 클래스 (아마도 2D 벡터의 집합으로)를 패스 경로 조향 동작을 사용하여 믹스에 추가 할 수 있습니다.

내가 링크 한 소스 코드는 이러한 조향 동작을 함께 결합하는 세 가지 방법도 제공합니다.

희망이 도움이됩니다.


red3d.com 링크는 소스를 직접 제공하지는 않지만 해당 페이지에는 OpenSter ( opensteer.sourceforge.net ) 에 대한 링크 가 있으며 이는 스티어링 동작의 오픈 소스 구현입니다.
bummzack

아, 몰랐어요, 고마워요 그러나 OpenSteer의 소스를 살펴본 결과 Buckland의 책에서 찾은 얼굴 코드에서 더 분명한 것을 쉽게 볼 수 있습니다. 특히 시작할 때.
Ray Dey

1

위치를 향한 조향은 너무 어렵지 않지만 개인적으로 위치를 향한 조향과 특정 속도로 도달하거나 속도 제한이있는 경로를 따르는 문제로 개인적으로 어려움을 겪었습니다.

Hermite 곡선을 사용하여 문제를 해결했습니다 . p0과 m0을 선박의 위치와 속도, p1과 m1을 목표 위치와 속도로 설정하십시오. 이것은 목표 후 1 초 후에 배를 따라 가기를 원한다고 가정합니다. p (0)의 2 차 미분을 계산하면 선박에 적용 할 가속도가 제공됩니다.

다음은 두 번째 미분에 대한 코드입니다 (F #에서는 원하는 언어로 조정할 수 있기를 바랍니다. sq ()는 따옴표로 해석되지 않고 문자로 해석되는 작은 따옴표를 식별자로 사용합니다).

    let h'' t =
        let h00'' t = 12.0 * t - 6.0
        let h10'' t = 6.0 * t - 4.0
        let h01'' t = -12.0 * t + 6.0
        let h11'' t = 6.0 * t - 2.0

        let t = (t - t0) / diff_t

        (sq (1.0 / diff_t)) *
        ((h00'' t * p0) +
         (h10'' t * diff_t * v0) +
         (h01'' t * p1) +
         (h11'' t * diff_t * v1))

선박에 외력 (예 : 행성의 중력)이 적용되는 경우 가속을 통해 추력을 계산할 때이를 고려해야합니다.



-3

나는 당신의 배가 위치와 속도와 같은 매개 변수를 가져야한다고 생각합니다.

속도는 모든 힘 (중력, 폭발, 사용자 입력 등)의 각 프레임 합계에 있으며 어떤 종류의 습기를 가질 수도 있습니다.

위치는 마지막 위치 + 속도 * time_step에서 계산됩니다.

그러나 이로 인해 대상에서 중지를 구현하기가 어려울 수 있습니다.


3
-1 Petteri Hietavirta가 사용이 기본 물리 시스템을 사용하는 방법을 알고있는 것처럼 들립니다. 따라서이 질문에 대한 귀하의 답변은 목표를 세우는 것이 너무 어렵다는 것입니다.
AttackingHobo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.