Làm thế nào là tránh địa phương RTS?


15

Hiện tại, tôi đang mô phỏng các lực tác động vật lý để tránh các đơn vị cục bộ nhưng phương pháp này đôi khi đẩy các đơn vị ra khỏi đội hình và có tác dụng rất không mong muốn khi các đơn vị co cụm lại.

Đối với các game RTS như Starcraft 2, việc tránh cục bộ được thực hiện như thế nào? Là vật lý mô phỏng hoặc một bộ điều khiển omnicient quyết định mọi thứ nên ở đâu? Tôi biết câu hỏi này có thể hơi rộng nên tôi đang hỏi cụ thể cách thực hiện các hành vi tránh né cục bộ của Starcraft 2; mặc dù bất cứ điều gì làm việc sẽ được đánh giá rất cao

Tôi không tìm kiếm bất kỳ mã nào - chỉ là các tài nguyên hoặc giải thích hữu ích về cách Starcraft 2 (hoặc các trò chơi tương tự) xử lý việc tránh cục bộ.

Hiện tại, tôi đã phát hiện va chạm (với vectơ xuyên thấu), lực va chạm và chuyển động theo vận tốc được thực hiện. Mỗi đơn vị được kiểm tra chống lại sự va chạm khác - nếu chúng va chạm, các vật thể ngay lập tức được bù bởi vectơ xuyên thấu thì lực va chạm được áp dụng. Sau đó, một vòng lặp khác di chuyển các vật thể bằng vận tốc của chúng và áp dụng lực kéo cho vận tốc. Việc bù đắp giảm thiểu vấn đề lực va chạm quá mức được áp dụng trên các đơn vị bị vón cục, nhưng các đơn vị đôi khi vẫn bắn ra.

Giải pháp tôi đang tìm kiếm để đáp ứng các yêu cầu sau (như trong Starcraft 2):

  • Đối tượng không chồng chéo; hoặc ít nhất là chồng chéo phải được giải quyết cuối cùng.
  • Các vật thể không đẩy nhau ra xa hơn mức cần thiết để 2 đơn vị có thể đứng và di chuyển cạnh nhau trong một đội hình.
  • Không nên có bất kỳ hành vi kỳ lạ nào khi các vật thể co cụm về cùng một đích.
  • Có thể hỗ trợ các đơn vị có kích thước khác nhau, và thậm chí các hình dạng lồi khác nhau.

Những gì tôi đã nghĩ cho đến nay là thay vì phát hiện va chạm, phát hiện các va chạm trong tương lai để sự chồng chéo không bao giờ xảy ra. Sau đó áp dụng các ràng buộc, đảm bảo vận tốc của 2 đơn vị không làm cho chúng trùng nhau. Tôi vẫn đang nghiên cứu thuật toán để hạn chế chuyển động vượt ra ngoài sự chồng chéo.


"hành vi đổ xô" (thuật ngữ google) là một vấn đề rất rộng,
ratchet freak

Điều này nằm trong hàng đợi phiếu bầu chặt chẽ vì "quá rộng", tôi có khuynh hướng đồng ý. Cố gắng thu hẹp: Bạn đã cố gắng làm gì? "Những tác dụng không mong muốn" nào bạn đang muốn tránh? Tôi có đúng khi nói bạn muốn các đơn vị ở lại đội hình?
Anko

Các trò chơi RTS thường hoạt động bởi mỗi khách hàng chạy mô phỏng xác định giống nhau trên mỗi máy. Vì vậy, về cơ bản, nếu bạn có thể giải quyết nó cho một máy duy nhất, bạn có thể áp dụng cùng một giải pháp cho các tình huống nhiều người chơi, bất kể kỹ thuật tránh cục bộ nào mà bạn sẽ thực hiện.
Alan Wolfe

Cảm ơn các phản hồi về câu hỏi. Tôi thu hẹp câu hỏi xuống một chút và giải thích cụ thể những gì tôi đang cố gắng thực hiện.
JPtheK9

Đây là một tài nguyên tuyệt vời: red3d.com/cwr/steer
tbkn23

Câu trả lời:


11

Có vẻ như những gì bạn đang tìm kiếm là thuật toán Tránh va chạm đối ứng tối ưu . Bài viết trước cũng đáng đọc. Mặc dù bài báo có thể có một chút liên quan đến lý thuyết đằng sau thuật toán này khá đơn giản:

Giả sử rằng bạn đã có một mô phỏng (trò chơi) với các tác nhân (đơn vị) có khối lượng giới hạn xung quanh chúng. Âm lượng giới hạn này có thể là những gì bạn đã sử dụng để thực hiện phát hiện và phản ứng va chạm. Đối với mỗi tác nhân, hãy xác định vận tốc ưu tiên v_pcó thể có hoặc không dựa trên mục tiêu của tác nhân.

Bây giờ, để thực hiện mô phỏng:

  1. Đối với mỗi tác nhân, giả sử rằng nó đứng yên, hãy tính tất cả các vận tốc sẽ khiến nó va chạm vào bất kỳ thời điểm nào trong tương lai với bất kỳ tác nhân chuyển động nào khác. Điều này có thể được biểu diễn trong "không gian vận tốc" như một tập hợp các nửa mặt phẳng giao nhau (còn được gọi là chướng ngại vật vận tốc ).
  2. Xác định điểm trong không gian này gần nhất v_p, đây là vận tốc mới của đơn vị.

Nếu tất cả các tác nhân đang chạy cùng một thuật toán, thì chúng sẽ chọn vận tốc bổ sung lẫn nhau và sẽ tránh các tác nhân khác. Trong một số tình huống, bạn có thể gây ra những dao động như điều khó xử đó xảy ra khi bạn đi thẳng vào ai đó trong hội trường và cả hai bạn đều cố gắng di chuyển ra khỏi cùng một hướng, nhưng các giấy tờ bao quát cách tránh điều đó.

Để tính toán hai giai đoạn của thuật toán ở trên, bạn có thể sử dụng Minkowski Sums để xác định chướng ngại vật vận tốc là gì, sau đó sử dụng mô hình lập trình tuyến tính (như Thuật toán Simplex ) để xác định điểm gần nhất để v_ptránh chướng ngại vật vận tốc. Ngoài ra, mã để tránh va chạm có sẵn cho sự nhìn chăm chú của bạn và đã được chuyển sang C # để được sử dụng trong các công cụ trò chơi như Unity. Kỹ thuật này đã được sử dụng ít nhất trong Warhammer 40.000: Space Marine , và có thể các trò chơi khác .


Đó là một bài viết tuyệt vời và tôi cảm thấy như tôi đã đọc một nửa trong số đó từ lời giải thích của bạn. Cảm ơn thông tin này.
JPtheK9

0

Tôi không biết các đơn vị của bạn hoạt động như thế nào nhưng tôi cho rằng chúng giống như một cỗ máy nhà nước:

Trạng thái có thể

  • Chạy đến (x, y, z)
  • Tham gia (địch_id)
  • Thu thập ressource (ressource_id)

Nếu bạn chú ý đến cách starcraft tiếp cận vấn đề này, bạn sẽ thấy rằng:

  1. Nếu có không gian để di chuyển theo một hướng, người lái xe di chuyển theo hướng đó.
  2. Nếu không có không gian, thiết bị sẽ di chuyển để tạo khoảng trống
  3. Nếu đơn vị cần di chuyển để tạo không gian đã có lệnh, nó sẽ giữ lệnh, nhưng sửa đổi nó một chút để cuối cùng thực hiện.

Đây là kịch bản 1:

nhập mô tả hình ảnh ở đây

Tôi có không gian để đi đến đó không? Đúng ? Rôi đi

Kịch bản 2:

nhập mô tả hình ảnh ở đây

Tôi có không gian để đi đến đó không? Không Này, bạn có thể tạo không gian cho tôi không, bạn đang chặn tôi. Tôi đã có một lệnh để di chuyển foward nhưng tôi sẽ ở lại với bạn.

Vì vậy, những gì bạn sẽ cần phải thực hiện:

  • Các đơn vị phải nhận thức được môi trường xung quanh
  • Các đơn vị phải có cách để liên lạc với nhau
  • Bạn phải thực hiện một cách để tiếp tục thực thi một lệnh trong khi thực hiện một đơn vị khác

Cảm ơn thông tin và hình dung. Ngay bây giờ tôi đang sử dụng phát hiện va chạm để tìm hiểu xem một đơn vị có thể di chuyển đến nơi khác hoặc nếu đơn vị khác đang chiếm giữ nó. Điều chính tôi đang cố gắng tìm ra là một thuật toán thuộc loại nào đó để cho đơn vị khác biết khoảng cách cần di chuyển hoặc vận tốc cần điều chỉnh theo. Nói cách khác, cách đơn vị chặn sẽ chứa đơn vị đang cố gắng vượt qua.
JPtheK9

Vì hành vi này được tính toán mỗi lần cập nhật vật lý, bạn thực sự không cần phải nói khoảng cách, nó sẽ di chuyển cho đến khi hết cách. Đối với hướng, bạn chỉ cần quét nhân tốc độ của hai đơn vị, điều này sẽ cung cấp cho bạn điểm giữa chừng để nó tiếp tục di chuyển trong khi chứa. Sau đó, bạn có thể chơi xung quanh với nó để làm cho nó bám sát hơn theo thứ tự hoặc di chuyển ra khỏi đường nhanh hơn.
Antoine

Bạn có ý nghĩa gì khi "di chuyển cho đến khi hết cách"? Làm thế nào để các đơn vị di chuyển ở nơi đầu tiên?
JPtheK9

Xin lỗi tôi quên đề cập: Đơn vị không phải là máy trạng thái. Chúng có nhiều khả năng trong tủ khóa được mô phỏng mọi khung hình - ngoại trừ những khả năng này chỉ có hiệu lực khi được kích hoạt, cho dù đích đến cách xa X hoặc với sự tồn tại của mục tiêu. Chuyển động của một đơn vị là kết quả của vận tốc của nó có thể được thay đổi bởi một khả năng.
JPtheK9

0

Một cách để làm điều đó là để các đơn vị hình thành tự động và để chúng cố gắng ở một vị trí tương đối với trung tâm của đội hình . Sau đó, thay vì di chuyển từng đơn vị riêng lẻ di chuyển trung tâm của đội hình xung quanh.

Đây là một cách cơ bản để làm điều đó bằng cách sử dụng đội hình hộp và lò xo đơn giản để giữ các thiết bị ở vị trí thích hợp:

// 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;

Cảm ơn! Đây là một giải pháp thực sự thú vị và sáng tạo. Tôi đã triển khai một cái gì đó tương tự như thế này cho hành vi / hình thành đám đông nhưng tôi vẫn gặp vấn đề về các đơn vị chồng chéo. Điều gì sẽ xảy ra nếu 2 hình thành chạy vào nhau?
JPtheK9

Tôi nghĩ rằng nó phụ thuộc vào thiết kế. Điều dễ nhất sẽ chỉ là áp dụng một lực lượng lái khác cách xa các đơn vị gần đó trong các đội hình khác như trong hình ảnh này . Một điều khác bạn có thể làm là hợp nhất các đội hình lại với nhau khi chúng được người chơi chọn hoặc thậm chí tạo thành "meta-formations"
mklingen

Hình thành meta nghe có vẻ rất phức tạp và có lỗi: C. Hình ảnh bạn liên kết có thể chính xác là những gì tôi cần mặc dù. Tôi sẽ làm một số nghiên cứu thêm về lực lượng lái đi. Bạn có liên kết đến bài viết của hình ảnh?
JPtheK9

Tôi có một vấn đề tương tự như của bạn, sẽ rất thú vị khi biết bạn đã giải quyết nó như thế nào. Một cú sút ý tưởng lóe lên trong óc sau eeading bài viết này: có thể kết hợp Pathfinder (A *) cho một kế hoạch con đường vĩ mô trong khi sử dụng lực lượng REPPEL cho tránh va chạm vi:
ColdSteel

0

Tôi biết một số người cau mày khi bán phá giá liên kết, tuy nhiên tôi đã tìm thấy Cách tiếp cận dựa trên lĩnh vực tiềm năng đa tác nhân cho các trò chơi chiến lược thời gian thực (ISBN 976-91-7295-160-0) là một bài báo rất sáng sủa, và nó rõ ràng truyền tải nhiều hơn tôi có thể giải thích. Bài viết khám phá bằng cách sử dụng các trường tiềm năng nhân tạo (một khái niệm bắt nguồn từ robot), để tạo điều kiện tránh va chạm cục bộ trong bối cảnh phát triển trò chơi.


Cảm ơn! Nghiên cứu chỉ hữu ích như lời giải thích cho tôi. Tôi sẽ đi sâu vào bài báo này.
JPtheK9

Tôi có một bản đồ ảnh hưởng đã được thiết lập nhưng điều này có vẻ quá phức tạp đối với thị hiếu của tôi. Điều chính là tạo ra các trường tiềm năng cho các đơn vị khác nhau để di chuyển chúng, và cũng chuyển đổi dữ liệu từ trường tiềm năng thành vận tốc để di chuyển. Về cơ bản, tôi không nghĩ rằng điều này sẽ làm việc cho các đơn vị có kích thước khác nhau. Đó là một bài đọc tuyệt vời với rất nhiều ý tưởng thú vị.
JPtheK9
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.