Làm cách nào tôi có thể mô phỏng một nhân vật nổi trong Box2D?


7

Tôi đang tạo một trò chơi nhảy bằng cách sử dụng công cụ vật lý Box2D. Nhân vật chính phải là một robot giống như sinh vật không có chân, nổi trên mặt đất được cung cấp bởi động cơ phản lực.

Chuyển động sẽ trông giống như một chiếc đĩa bay: Sinh vật không bao giờ chạm đất, nhưng cũng không bao giờ đi quá xa nó. Những gì xây dựng của khớp, hình dạng và cơ thể có thể làm điều đó độc đáo?

Tôi bắt đầu bằng cách cố gắng tạo ra một loại con lắc:

     O        <-- head
     |
    +-+
    |X|       <-- creature's body
    +-+
 ----+-----   <-- ground (pendulum crossing)
     |
     O        <-- heavy body, weld joined to the creature, it does
                  collides with nothing, just pulling the creature
                  down to keep it upright

Tuy nhiên, điều đó không hoạt động trơn tru và sinh vật bị trả lại quá nhiều. Bên cạnh đó, làm thế nào tôi có thể mô phỏng động cơ phản lực độc đáo?

Câu trả lời:


14

CẬP NHẬT : qua nhiều năm tôi đã trở nên hiểu biết hơn một chút và tôi nhận ra Thiết lập 2 có thể được mô hình hóa theo cách đơn giản hơn. Tôi đã thêm Cài đặt 3, mà tôi tin là giải pháp tốt nhất.

Câu hỏi của bạn đã truyền cảm hứng cho tôi chơi xung quanh với trình soạn thảo RUBE để tìm một giải pháp hay. Đây là những gì tôi nghĩ ra:

Cài đặt 1

RUBE UFO 1

Hãy bắt đầu với cái đơn giản hơn ở bên trái. Nó có các thiết lập sau (từ dưới lên):

  1. Một cơ thể bánh xe có thể lăn qua lại
  2. Một hộp nhỏ (khung xe) gắn vào bánh xe thông qua a b2RevoluteJoint. Thân khung xe không được phép xoay.
  3. Một cơ thể UFO chính (không quay)
  4. Một b2PrismaticJointkết nối khung xe trung tâm và UFO cơ thể (điều này làm cho chắc chắn rằng UFO luôn là thẳng đứng)
  5. Một b2DistanceJointkết nối các trung tâm của khung gầm và cơ thể UFO. Điều này cho phép UFO lắc lên xuống và cuối cùng giải quyết trên một khoảng cách đã đặt từ khung gầm (điều này xảy ra nhanh như thế nào tùy thuộc vào tần số và tỷ lệ giảm xóc).

Kết quả:

Gif UFO1

Ý tưởng là chỉ hiển thị phần ufo và sử dụng bộ lọc va chạm để phần còn lại của vật lý trong trò chơi của bạn (ngoại trừ mặt đất) không tương tác với phần bánh xe. Trong gif bạn có thể thấy rằng bánh xe không trèo qua các cơ thể khác (vì không nên), vì vậy nếu bạn muốn bao gồm các bước trong trò chơi của mình thì bạn cần thêm các đường dốc ẩn và / hoặc thay đổi hình dạng của vật lý mặt đất để bánh xe có thể leo lên các bậc.

Cài đặt 2

Nếu bạn muốn nhiều hơn là chỉ chuyển động dọc, thì tôi khuyên bạn nên thiết lập thứ hai: nhập mô tả hình ảnh ở đây

Trường hợp này giống như trường hợp đầu tiên, với các khoản trợ cấp sau:

  1. b2Distanceb2PrismaticJoints từ trước giờ được kết nối với một cơ thể nhỏ, trung gian vẫn không được phép quay.
  2. Cơ thể trung gian mới được kết nối thông qua b2RevoluteJointcơ thể UFO chính. Cơ thể UFO hiện được phép xoay.
  3. Để hạn chế cơ thể UFO khỏi tự do, chúng ta cần ổn định nó. May mắn là phương pháp để làm như vậy đã được xác định trong câu trả lời này . Bốn khớp khoảng cách được gắn vào thân UFO chính và thân trung gian mới. Tuy nhiên, khi chơi xung quanh với UFO trong RUBE, tôi nhận thấy rằng cấu hình khớp khoảng cách song song như được đề xuất trong câu trả lời đó là không ổn định và nó tiếp tục 'chụp' vào cấu hình chéo được thấy trong hình trên. Vì nó ổn định hơn nhiều, tôi quyết định đi theo nó.

Kết quả:

Gif UFO2

Cài đặt 3

Thiết lập 2 hơi phức tạp một chút và thiết lập tốt hơn một chút có thể đạt được với ít cơ thể và khớp hơn:

UFO 3

  1. Bánh xe, giống như trước đây.
  2. Lần này, bánh xe được kết nối với cơ thể 3 bằng cách sử dụng a b2WheelJoint. Điều này phủ nhận sự cần thiết cho thân máy khung gầm từ hai thiết lập đầu tiên. Điều PrismaticJointnày cũng không còn cần thiết nữa, vì hành vi của nó được tích hợp vào b2WheelJoint.
  3. Một cơ thể trung gian nhỏ vẫn cần thiết để kết nối bánh xe với cơ thể chính. Cơ thể này có cờ xoay cố định được đặt vì hai lý do: nó giữ UFO thẳng đứng (bằng cách cố định trục dọc giữa bánh xe và chính nó) và nó cung cấp góc tham chiếu không đổi cho thân chính.
  4. Cơ thể nhỏ ở vị trí 3 được kết nối với cơ thể chính thông qua a b2WeldJoint. Cái b2WeldJointnày chủ yếu được sử dụng để "kết dính các cơ thể lại với nhau", nhưng ở đây, ràng buộc có thể được làm cho mềm bằng cách chọn tần số và giảm xóc theo cách tương tự như b2DistanceJoint.
  5. Cơ thể chính của UFO.

UFO 3 gif

Thiết lập này đã loại bỏ 3 khớp và 1 thân so với Cài đặt 2. Tất cả các neo chung hiện được đặt ở các vị trí hợp lý trên mô hình, trái ngược với các b2DistanceJointvị trí neo nổi trong Cài đặt 2, việc xây dựng và đơn giản hơn nhiều gỡ lỗi trong mã trò chơi thực tế. Cuối cùng, Setup 3 cũng có phần thưởng là không bắn quá mức khi bánh xe chạy vào rào chắn; Hãy chú ý làm thế nào trong Thiết lập 2, cơ thể UFO vượt qua vị trí bánh xe một cái giật lại khi bánh xe gặp chướng ngại vật ở tốc độ cao? Đáy b2RevoluteJointđược phân tách dưới tải. Điều này không xảy ra với b2WheelJointCài đặt 3.

Dù cuối cùng bạn làm gì, tôi khuyên bạn nên thử nó trong RUBE, đây là một cách tuyệt vời để thử và tìm các giải pháp vật lý cảm giác thú vị.


Cảm ơn câu trả lời tuyệt vời đó, tôi sẽ kiểm tra xem! BTW.: Tôi đã có RUBE và tôi đã chơi với nó
philipp

Thật tuyệt, làm việc rất tốt!
philipp 23/03 '

Không vấn đề gì, vui vì tôi có thể giúp :)
NauticalMile

3

Câu trả lời của Na HảiMile là tuyệt vời (và điểm thưởng cho sơ đồ hoạt hình sát thủ). Để đưa ra một gợi ý thay thế mà không gặp phải vấn đề tương tự (va chạm bánh xe ngăn bạn di chuyển qua các vật thể mà cơ thể nổi có thể di chuyển dễ dàng, tôi đề nghị mô hình hóa một cái gì đó phù hợp hơn với thực tế của tình huống của bạn. không sử dụng va chạm cơ thể cứng nhắc và lò xo.

Mô hình nhân vật của bạn như một hộp cứng như bình thường, nhưng mỗi bản cập nhật sẽ chiếu tia trực tiếp xuống (theo hướng lực đẩy phản lực của bạn) và đo khoảng cách từ nhân vật đến vật thể va chạm gần nhất. Sau đó, áp dụng một xung lên trên cơ thể nhân vật của bạn, tỷ lệ nghịch với khoảng cách từ mặt đất. Vì vậy, bạn càng gần mặt đất, xung lực càng lớn. Đó có thể là tỷ lệ tuyến tính hoặc tỷ lệ theo cấp số nhân, nhưng bạn không muốn nó quá lớn (tức là bắn lên trời) nên bạn sẽ muốn làm ẩm nó vượt quá một phạm vi nhất định. Nhưng về cơ bản, nó phải đạt được trạng thái cân bằng chống lại tác động của trọng lực, để tạo ra hiệu ứng của một lò xo - bạn càng đến gần mặt đất, thì càng tạo ra nhiều năng lượng cho mùa xuân, nó càng đi xa hơn. Kết hợp với một yếu tố giảm xóc trên chuyển động,

Lưu ý: lực này phải được hạn chế chỉ tác động theo chiều dọc trên cơ thể bạn, nếu không, bạn bắt đầu gặp phải các vấn đề trong thế giới thực, nơi nhân vật của bạn không ổn định và muốn chùn bước hoặc lùi lại tùy thuộc vào những gì bên dưới hoặc góc của nhân vật.

Nhảy sau đó chỉ đơn giản là thêm một yếu tố thẳng đứng bổ sung cho lực đó - bạn không thể nhảy cao vô cùng, nhưng nó có thêm một sắc thái mà nếu bạn nhảy đúng lúc (nói ngay sau khi rơi xuống từ độ cao), bạn có thể nhận được thêm chiều cao khi nhảy bằng cách tận dụng hiệu ứng nảy.

Điều này sẽ có tác dụng cho phép chuyển động trơn tru qua các chướng ngại vật nhỏ mà không lấy đi bất cứ thứ gì từ vận tốc ngang của bạn. Khi chướng ngại vật đến dưới luồng tia phản lực, nhân vật sẽ di chuyển lên trên, nhưng không hề chậm lại.

Trên thực tế, một tia đơn có thể không ổn định, đặc biệt nếu bạn di chuyển trên địa hình gồ ghề. Có lẽ tôi sẽ thực hiện hai hoặc ba lần phát sóng và lấy trung bình khoảng cách; cân nó nếu bạn muốn có thể, hoặc loại bỏ các phép đo vượt quá độ lệch nhất định so với trung bình. Điều bạn không muốn là một trường hợp nhân vật di chuyển qua một khoảng trống rất mỏng trên một bề mặt phẳng khác trên thế giới và giảm mạnh xuống vì tia sáng đã đâm thẳng vào khoảng trống đó.


1
+1 Tôi cũng là một fan hâm mộ lớn của mô hình hóa cơ chế trò chơi dựa trên hành vi vật lý của họ. Đây là một cách tốt để làm điều đó. Tuy nhiên, sự đánh đổi là tính quyết định của hành vi. Ví dụ, điều gì xảy ra nếu con tàu xoay xở lộn ngược? Luôn luôn có những vấn đề nhỏ như thế này mà chúng ta cần dự đoán và tranh luận.
NauticalMile

1
Bây giờ tôi nghĩ về nó, có thể có một cách thậm chí còn tốt hơn: nếu thay vì khớp bánh xe, bạn thực hiện 3 lần phát sóng từ ufo như bạn đã nói, nhưng thay vì một cơ thể UFO, bạn sử dụng các khớp khoảng cách từ tôi câu trả lời gắn liền với lõi không quay. Bằng cách đó, bạn có thể có (gần như) sự ổn định nhất định, cho phép ufo chao đảo và tránh các vấn đề leo địa hình từ câu trả lời của tôi. Suy nghĩ?
NauticalMile
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.