RTS 지역 회피는 어떻게 이루어 집니까?


15

현재 단위의 로컬 회피를 위해 물리 충격력을 시뮬레이션하고 있지만이 방법은 때때로 단위를 형성에서 벗어나 밀어냅니다.

Starcraft 2와 같은 RTS 게임의 경우 로컬 회피는 어떻게 이루어 집니까? 물리가 시뮬레이션되거나 전지전능 한 컨트롤러가 모든 것이 어디에 있어야하는지 결정합니까? 스타 크래프트 2의 로컬 회피 행동을 달성하는 방법에 대해 구체적으로 묻기 때문에이 질문이 약간 광범위하다는 것을 알고 있습니다. 작동하는 것은 매우 감사하겠습니다.

Starcraft 2 (또는 유사한 게임)가 로컬 회피를 처리하는 방법에 대한 유용한 리소스 또는 설명 만 어떤 코드도 찾고 있지 않습니다.

현재 충돌 감지 (침투 벡터 포함), 충돌 력 및 속도에 의한 움직임이 있습니다. 충돌에 대해 모든 유닛이 다른 유닛과 비교하여 검사됩니다. 충돌하는 경우 객체가 침투 벡터에 의해 즉시 오프셋되고 충돌 력이 적용됩니다. 그런 다음 다른 루프는 속도로 객체를 이동하고 속도에 드래그를 적용합니다. 오프셋은 덩어리 진 유닛에 가해지는 과도한 충돌 력의 문제를 완화 시키지만 때때로 유닛이 여전히 쏴집니다.

내가 찾고있는 솔루션은 다음 요구 사항을 충족시켜야합니다 (Starcraft 2에서와 같이).

  • 객체가 겹치지 않아야합니다. 또는 적어도 겹치는 부분은 결국 해결되어야합니다.
  • 물체는 필요 이상으로 서로를 밀지 않으므로 2 개의 유닛이 서서 서로 옆으로 움직일 수 있습니다.
  • 물체가 같은 목적지로 뭉쳐 질 때 이상한 행동이 없어야합니다.
  • 다른 크기의 유닛, 심지어 다른 볼록한 모양을 지원할 수 있습니다.

지금까지 내가 생각한 것은 충돌을 감지하는 대신 미래의 충돌을 감지하여 겹침이 발생하지 않도록하는 것입니다. 그런 다음 구속 조건을 적용하여 두 유닛의 속도가 겹치지 않도록하십시오. 나는 여전히 중첩을 넘어 이동을 제한하는 알고리즘을 고민하고 있습니다.


"집중 행동"(Google 용어)은 매우 광범위한 문제입니다.
ratchet freak

이것은 "투표"로 마감 투표 대기열에있었습니다 – 나는 동의하는 경향이 있습니다. 좁히려 고 시도 : 무엇을 시도 했습니까? 어떤 "바람직하지 않은 효과"를 피하고 싶습니까? 내가 유닛을 형성하기를 원한다고 말하는 것이 맞습니까?
Anko

RTS 게임은 종종 각 컴퓨터에서 동일한 결정 론적 시뮬레이션을 실행하는 각 클라이언트에서 작동합니다. 따라서 기본적으로 단일 시스템으로 해결할 수 있다면 로컬 회피 기술에 관계없이 멀티 플레이어 상황에 동일한 솔루션을 적용 할 수 있습니다.
Alan Wolfe

질문에 대한 의견을 보내 주셔서 감사합니다. 나는 질문을 조금 좁히고 내가 달성하려는 것을 구체적으로 설명했다.
JPtheK9

이것은 훌륭한 자료입니다 : red3d.com/cwr/steer
tbkn23

답변:


11

당신이 찾고있는 것은 Optimal Reciprocal Collision 회피 알고리즘입니다. 앞의 논문은 또한 가치가 읽기입니다. 논문에 약간의 관련이 있지만 알고리즘의 이론은 매우 간단합니다.

이미 주변에 어떤 종류의 경계 볼륨을 가진 에이전트 (유닛)가있는 시뮬레이션 (게임)이 있다고 가정합니다. 이 경계 볼륨은 충돌 감지 및 응답을 수행하기 위해 이미 사용중인 것일 수 있습니다. 각 요원 v_p에 대해 요원의 목표를 기반으로하거나하지 않을 수 있는 선호 속도 를 정의하십시오 .

이제 시뮬레이션을 수행하십시오.

  1. 각 요원에 대해 정지 상태라고 가정하면 향후 다른 요원과 충돌 할 수있는 모든 속도를 계산하십시오. 이것은 "속도 공간"에서 일련의 교차 반 평면 ( 속도 장애물 이라고도 함)으로 표시 될 수 있습니다 .
  2. 이 공간에서에 가장 가까운 점을 결정하십시오 v_p. 이것은 장치의 새로운 속도입니다.

모든 에이전트가 동일한 알고리즘을 실행하는 경우 서로 상호 보완하고 다른 에이전트를 피하는 속도를 선택합니다. 어떤 상황에서는 복도에있는 누군가에게 직접 걸어 가면서 같은 방향으로 나 가려고 할 때 발생하는 어색한 현상과 같은 진동을 유발할 수 있지만, 논문은이를 피하는 방법을 다룹니다.

위의 알고리즘의 두 단계를 계산하려면 Minkowski Sums를 사용하여 속도 장애물이 무엇인지 확인한 다음 선형 프로그래밍 모델 (예 : Simplex Algorithm )을 사용 v_p하여 속도 장애물을 피하는 가장 가까운 지점을 결정하십시오 . 또한 충돌 방지를위한 코드 사용자 가 사용할 수 있으며 Unity와 같은 게임 엔진에 사용되도록 C #으로 포팅되었습니다. 이 기술은 적어도 Warhammer 40,000 : Space Marine다른 게임에서 사용되었습니다 .


그것은 놀라운 기사 였고 나는 당신의 설명에서 그 절반을 읽은 것처럼 느낍니다. 이 정보에 감사드립니다.
JPtheK9

0

나는 당신의 유닛이 어떻게 작동하는지 모르지만 나는 그것들이 상태 머신과 같다고 가정합니다 :

가능한 상태

  • (x, y, z)로 실행
  • 부착 (enemy_id)
  • 자원 수집 (ressource_id)

스타 크래프트가이 문제에 어떻게 접근하는지주의를 기울이면 다음과 같은 사실을 발견 할 수 있습니다.

  1. 한 방향으로 이동할 공간이 있으면 숯이 그 방향으로 움직입니다.
  2. 공간이 없으면 도중에 유닛이 이동하여 공간을 만듭니다.
  3. 공간을 확보하기 위해 이동해야하는 장치에 이미 명령이있는 경우 명령을 유지하지만 최종적으로 배치되도록 약간 수정합니다.

시나리오 1 :

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

거기에 갈 공간이 있습니까? 예 ? 그럼가

시나리오 2 :

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

거기에 갈 공간이 있습니까? 아니 ? 이봐, 공간 좀 만들어 줄래, 날 막고있어 나는 이미 전진하라는 명령을 받았지만 당신을 수용 할 것입니다.

따라서 구현해야 할 것 :

  • 부대는 주변 환경을 알고 있어야합니다
  • 서로 통신 할 수있는 방법이 있어야합니다
  • 다른 장치를 할당하는 동안 명령을 계속 실행하는 방법을 구현해야합니다

정보와 시각화에 감사드립니다. 지금은 충돌 감지를 사용하여 장치가 다른 장소로 이동할 수 있는지 또는 다른 장치가 점유하고 있는지 알아냅니다. 내가 알아 내려고하는 가장 중요한 것은 다른 장치에게 이동할 거리 또는 조정할 속도를 알려주는 일종의 알고리즘입니다. 다시 말해서, 차단 유닛이 통과하려고하는 유닛을 어떻게 수용 할 것인가.
JPtheK9

이 동작은 모든 물리 업데이트마다 계산되므로 거리를 알 필요가 없습니다. 거리가 멀어 질 때까지 움직입니다. 방향의 경우 두 단위의 속도를 단순히 곱하면 스캔이 진행되는 동안 중간 지점을 제공하여 수용하는 동안 계속 움직입니다. 그 후 당신은 순서에 더 충실하거나 더 빨리 벗어날 수 있도록 그것을 가지고 놀 수 있습니다.
Antoine

"길을 벗어날 때까지 움직인다"는 것은 무엇을 의미합니까? 처음에 장치가 어떻게 움직입니까?
JPtheK9

죄송합니다. 언급을 잊었습니다. 장치는 상태 머신이 아닙니다. 로커에는 매 프레임마다 시뮬레이션되는 많은 기능이 있습니다. 단,이 기능은 대상이 X 거리에 있거나 대상이 있는지 여부에 따라 활성화 될 때만 영향을 미칩니다. 유닛의 이동은 능력에 의해 변경 될 수있는 속도의 결과입니다.
JPtheK9

0

이를 수행하는 한 가지 방법은 단위가 자동으로 형성되도록하고 형성 의 중심에 상대적인 위치를 유지 하도록하는 것 입니다. 그런 다음 각 유닛을 개별적으로 이동하는 대신 구조물의 중심을 주변으로 이동하십시오.

상자 형성과 간단한 스프링을 사용하여 장치를 적절한 위치에 유지하는 기본 방법은 다음과 같습니다.

// Defines a phalanx (box) formation
class Formation
    // Center of the box in the world
    Position center;
    // Width in # of units
    int width;
    // Height in # of units
    int height;
    // Space between units
    float scale;
    // How much force units will apply to stay near
    // their assigned spot.
    float springforce;

    // Return a position of a unit at the given row and column
    // Todo: add a rotation to this formation so it can rotate when moving.
    Position GetUnitPhalanxPosition(int row, int column)
        return new Position(center.X + column * scale - width * scale /2, 
                            center.Y + row * scale    - height* scale / 2);

// Represents a simple point object with a velocity and position;
// it belongs to a formation.
class Unit
    Position pos;
    Velocity vel;
    Formation formation;
    // What's our assigned spot in the formation?
    int row;
    int column;

    void Update(float dt)
        // Get the desired target position in the formation
        Position target = formation.GetUnitPhalanxPosition(row, column);
        // Apply a spring force toward the position (todo: you might want to damp this)
        vel += (target - position) * dt * formation.springforce;
        // Move along the velocity vector.
        pos += vel * dt;

감사! 이것은 정말 흥미롭고 창의적인 솔루션입니다. 군중 행동 / 대형에 대해 이와 비슷한 것을 구현했지만 여전히 단위가 겹치는 문제가 있습니다. 2 개의 구조물이 서로 닿으면 어떻게됩니까?
JPtheK9

디자인에 달려 있다고 생각합니다. 가장 쉬운 방법은 이 이미지와 같이 다른 유닛에서 다른 조향력을 다른 유닛에서 멀리 떨어 뜨리는 것입니다 . 당신이 할 수있는 또 다른 것은 플레이어에 의해 선택 될 때 형성을 병합하거나 심지어 "메타 형성"을 형성하는 것입니다
mklingen

메타 형식은 정말 복잡하고 버그가 있습니다. 당신이 연결 한 이미지가 정확히 필요한 것일 수도 있습니다. 나는 조향력에 대해 더 많은 연구를 할 것입니다. 이미지 기사에 대한 링크가 있습니까?
JPtheK9

나는 당신과 비슷한 문제가 있습니다. 어떻게 해결했는지 알면 흥미로울 것입니다. 이 기사를 검토 한 후 한 번의 아이디어가 떠 올랐습니다. 미세 충돌 방지를 위해 reppel 힘을 사용하는 동안 매크로 경로 계획을 위해 Pathfinding (A *)을 결합 할 수 있습니다.
ColdSteel

0

일부 사람들이 링크 덤핑에 대해 찌르는 것을 알고 있지만 실시간 전략 게임 봇에 대한 다중 에이전트 잠재적 필드 기반 접근법을 발견했습니다 . 렸지만 (ISBN 978-91-7295-160-0)에 이 매우 밝은 종이라는 것을 알았습니다. 내가 정교하게 할 수있는 것보다 더 많은 방법. 이 논문은 게임 개발 환경 내에서 로컬 충돌 회피를 용이하게하기 위해 인공 잠재력 필드 (로봇 공학에서 유래 한 개념)를 사용하여 탐구합니다.


감사! 연구는 나에게 설명만큼 도움이된다. 이 논문으로 뛰어들겠습니다.
JPtheK9

영향 맵이 이미 설정되어 있지만 취향에 따라 너무 복잡해 보입니다. 가장 중요한 것은 다른 단위로 전위 필드를 생성하여 이동할 수 있고 전위 필드의 데이터를 이동할 속도로 변환하는 것입니다. 기본적으로 나는 이것이 다른 크기의 단위에서 작동하지 않을 것이라고 생각합니다. 흥미로운 아이디어가 많이 있지만 잘 읽습니다.
JPtheK9
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.