물리 모델이있는 선박의 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.