Lực đẩy cân bằng động của tàu không gian


14

Các tàu không gian trong trò chơi của tôi có nghĩa là do người chơi chế tạo với số lượng bộ đẩy tùy ý được gắn ở bất cứ đâu với bất kỳ vòng quay nào. Tôi hiện có một số mã bẩn để xoay con tàu đến một góc nhất định (tăng tốc và giảm tốc).

Đây là một ví dụ về một con tàu đối xứng, nơi các đường màu đỏ, được bảo là xoay trái.

Tàu

Tuy nhiên, như bạn có thể tưởng tượng, tùy thuộc vào nơi người chơi đã đặt các bộ đẩy, đôi khi các lực tuyến tính không mong muốn đang ảnh hưởng đến con tàu. Trong trường hợp này, con tàu bắt đầu di chuyển về phía trước.

Tôi đang nghiên cứu xem liệu có thể tìm thấy lực đẩy tối đa mà một bộ đẩy có thể áp dụng để không gây ra vận tốc tuyến tính hay không. (Trong trường hợp trên sẽ không có gì vì không có gì để chống lại các lực lượng từ các máy đẩy phía sau, và những người phía trước giết nhau).

Những gì tôi nghĩ ra cho đến nay là một công thức để xác định "hiệu suất bật", ví dụ như có bao nhiêu vòng quay được tạo ra liên quan đến chuyển động tuyến tính.

a - vectơ vị trí để đẩy một vectơ vị trí b sang lực đẩy b v1 - lực từ lực đẩy một v2 - lực từ lực đẩy b

hiệu quảDelta = a.cross (v1) / | v1 | - (a.cross (v1) + b.cross (v2)) / | v1 + v2 |

, về cơ bản là "a.cross (v1 * t) / | v1 |" được cho là hiệu quả lần lượt. Và sau đó chúng tôi trừ nó bằng hiệu suất lần lượt của các bộ đẩy kết hợp, để xem liệu bắn bộ đẩy mới có đáng không.

Vấn đề phát sinh khi tôi nhận ra rằng các bộ đẩy không được bật / tắt, nhưng có thể thay đổi lực đẩy của chúng từ 0 đến 1. Và làm thế nào để đi khi người chơi muốn con tàu đi tiếp. Tất nhiên, cần phải có sự cân bằng về mức độ xoay / di chuyển.

Tôi không phải là nhà khoa học tên lửa nên tôi hy vọng có ai đó có thể cho tôi biết liệu có thể tính được lực đẩy của mỗi bộ đẩy theo cách này hay không và cho tôi một cú hích đúng hướng.

Cảm ơn bạn đã dành thời gian! / Kim


3
Tôi đã bắt đầu trên cùng một con đường, nhưng với nhiều cấu hình, không thể vừa xoay vừa không dịch. Vì vậy, bạn có mất đi luân chuyển? Hay bạn cho phép dịch thuật? Cuối cùng, tùy thuộc vào người dùng thiết kế con tàu. Đối với bản demo của tôi về điều này, tôi đã làm giả nó. Liên quan: gamedev.stackexchange.com/questions/58216/... , gamedev.stackexchange.com/questions/40615/...
MichaelHouse

Tôi đã đi xuống một con đường tương tự và cuối cùng đã viết một bản demo trên trang này . Khi bạn di chuyển các bộ đẩy xung quanh (kéo chúng trên tàu để đặt vị trí và sức mạnh), nó sẽ vẽ ba hình dạng. Trực giác là bạn có thể nghĩ về tất cả các chuyển động có thể là một điểm trong không gian 3d (x, y, xoay) và bị giới hạn ở 0-1 là một hạn chế trong không gian đó. Vì vậy, bạn kết thúc với một hình dạng 3d có chứa tất cả các chuyển động có thể. Nếu bạn không muốn vận tốc tuyến tính, bạn đang nhìn vào dòng (x = 0, y = 0) trong không gian đó (Q, W, E, S tất cả 0 trong bản demo của tôi)
amitp

Câu trả lời:


7

Tôi sẽ giả định rằng bạn có chuyển động vật lý chính xác cho tàu của bạn, vì nếu không phân tích này sẽ không giữ được. Bạn cần một cái gì đó mạnh hơn hiệu quả để giải quyết vấn đề này đúng cách.

Mỗi bộ đẩy sẽ tạo ra hai hiệu ứng trên chuyển động của tàu: tuyến tính và góc. Đây có thể được xem xét độc lập. Nếu bộ đẩy tạo ra một lực ftheo một hướng dirvà được bù từ tâm khối lượng bằng một vectơ r(không phải tâm hình học hoặc tâm của sprite!), Thì hiệu ứng trên thành phần tuyến tính là:

t = f * dir // f is a scalar, dir is unit length

Ảnh hưởng đến vận tốc góc được cho bởi mô-men xoắn:

tau = f * <dir.x, dir.y, 0> CROSS <r.x, r.y, 0> // cross product

tlà một vectơ lực (tức là lực đẩy tuyến tính). taulà một vô hướng đã ký mà khi chia cho mômen quán tính khối lượng sẽ cho gia tốc góc. Điều quan trọng là dirrcả hai trong cùng một không gian tọa độ, tức là cả hai tọa độ cục bộ hoặc cả hai tọa độ thế giới.

Gia tốc tuyến tính tổng thể của con tàu được tính bằng tổng của tmỗi bộ đẩy chia cho khối lượng của con tàu. Tương tự, gia tốc góc chỉ là tổng của các mômen chia cho mômen quán tính khối lượng (là một vô hướng khác). Con tàu sẽ không quay nếu tổng mô-men bằng không. Tương tự, nó sẽ không di chuyển nếu tổng lực đẩy bằng không. Mô-men xoắn nhớ lại là một vô hướng nhưng lực đẩy (tổng của t') là một vectơ 2D.

Điểm của giải trình này là bây giờ chúng ta có thể viết vấn đề của mình dưới dạng Chương trình tuyến tính . Nói trước tiên chúng tôi muốn tàu của chúng tôi rẽ mà không di chuyển . Chúng tôi có một biến cho mỗi bộ đẩy, $ x_1, x_2, ... $, đó là lượng lực đẩy mà bộ đẩy sẽ cung cấp. Một tập hợp các ràng buộc là:

0 <= x_i < fmax_i  //for each i

đâu fmaxlà lực tối đa cho bộ đẩy đó (điều này cho phép chúng ta có những lực mạnh hơn hoặc yếu hơn). Tiếp theo, chúng tôi nói rằng cả hai đẳng thức:

0 = Sum_i  x_i * dir_i.x
0 = Sum_i  x_i * dir_i.y

Điều này mã hóa các ràng buộc mà chúng ta sẽ không áp dụng gia tốc tuyến tính, bằng cách nói tổng lực đẩy bằng không (lực đẩy là một vectơ, vì vậy chúng ta chỉ nói mỗi phần bằng 0).

Bây giờ chúng tôi muốn tàu của chúng tôi rẽ. Có lẽ chúng tôi muốn làm như vậy càng nhanh càng tốt, vì vậy chúng tôi muốn:

max (Sum_i  x_i * c_i)
where c_i = <dir_i.x, dir_i.y, 0> CROSS <r_i.x, r_i.y, 0>

Giải quyết vấn x_iđề trong khi thỏa mãn sự bất bình đẳng và công bằng ở trên, trong khi tối đa hóa tổng kết ở trên, sẽ cho chúng ta lực đẩy mong muốn. Hầu hết các ngôn ngữ lập trình đều có thư viện LP dành cho họ. Chỉ cần đặt vấn đề trên vào nó và nó sẽ tạo ra câu trả lời của bạn.

Một vấn đề tương tự sẽ cho phép chúng ta di chuyển mà không quay đầu. Giả sử chúng ta viết lại vấn đề của mình trong một hệ tọa độ mà chúng ta muốn di chuyển theo hướng x dương. Sau đó, các ràng buộc là:

0 <= x_i < fmax_i  //for each i
max Sum_i  x_i * dir_i.x
0 = Sum_i  x_i * dir_i.y
0 = (Sum_i  x_i * c_i)
where c_i = <dir_i.x, dir_i.y, 0> CROSS <r_i.x, r_i.y, 0> // as before

Với sự hạn chế rằng các bộ đẩy chỉ có thể tạo ra lực đẩy theo một hướng duy nhất, sẽ có giới hạn cho loại quay và vận tốc tuyến tính mà bạn sẽ có thể đạt được. Điều này sẽ biểu hiện như là giải pháp 0 = x_1 = x_2 = ... = x_n, có nghĩa là bạn sẽ không bao giờ đi đến bất cứ đâu. Để giảm thiểu điều này, tôi khuyên bạn nên thêm một cặp bộ đẩy nhỏ, yếu (giả sử 5% hoặc 10%) cho mỗi người chơi đặt bộ đẩy ở góc 45 độ ở hai bên. Điều này sẽ giúp giải pháp linh hoạt hơn, bởi vì chúng có thể được sử dụng để chống lại các tác động thứ yếu yếu của các bộ đẩy chính.

Cuối cùng, để có thể vượt qua 100 thruster, giải pháp cho LP đủ nhanh để thực hiện trên mỗi khung hình. Tuy nhiên, vì giải pháp không phụ thuộc vào vị trí hoặc trạng thái hiện tại, bạn có thể tính toán trước giải pháp cho từng tổ hợp đầu vào bộ điều khiển hợp lý bất cứ khi nào hình dạng thay đổi (điều này bao gồm thêm các bộ đẩy không thay đổi mô men quán tính hoặc khối lượng của tàu, bởi vì sau đó các bộ đẩy ở một vị trí khác so với tâm khối lượng!). Đây là 24 khả năng (tức là 8 lần hướng {quay trái, không quay, quay phải}).


Giải thích rất tốt!
Kim

1
Điều này Sum_icó nghĩa gì trong bối cảnh này?
S. Tarık Çetin

1

Suy nghĩ đầu tiên của tôi là một giải pháp hoàn toàn theo kinh nghiệm, đó là mô phỏng giàn khoan trong môi trường hộp cát cho các mức độ lực đẩy khác nhau để tìm ra cách nó hoạt động. Thay vì cân bằng nhiều toán học phức tạp trong quá trình tìm kiếm một giải pháp xác định, bạn có thể tiếp cận nó bằng số bằng cách sử dụng phương pháp của newtons. Thí dụ:

Phạm vi cho lực đẩy là 0 đến 1000 trong đó 1000 là ALOT.

Bước 1

Mô phỏng với độ tin cậy (0 + 1000) / 2 = 500. Kết quả: quá tin tưởng

Bước 2

Phạm vi bây giờ là 0 đến 500 Mô phỏng với độ tin cậy (0 + 500) / 2 = 250. Kết quả: quá tin tưởng

Bước 3

Phạm vi hiện là 0 đến 250 Mô phỏng với độ tin cậy (0 + 250) / 2 = 125 Kết quả: quá ít tin tưởng

Bước 4

Phạm vi hiện tại là 125 đến 250 Mô phỏng với độ tin cậy (125 + 250) /2=187.5 Kết quả là quá tin tưởng

Bước # 5 Phạm vi hiện tại là 125 đến 187,5 Mô phỏng với độ tin cậy (125 + 187,5) /2=156.25 Kết quả là quá ít tin tưởng

Bước # 6 Phạm vi hiện tại là 156,25 đến 187,5 Phạm vi dưới ngưỡng 35, điều đó có nghĩa là đó là một ước tính đủ tốt

Kết quả cuối cùng = (187,5 + 156,25) / 2 = 171,875

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.