Làm thế nào để xác định các bộ đẩy để bật để xoay tàu?


47

Cấu hình của con tàu thay đổi linh hoạt, vì vậy tôi phải xác định bộ đẩy nào sẽ bật khi tôi muốn xoay con tàu theo chiều kim đồng hồ hoặc ngược chiều kim đồng hồ. Các bộ đẩy luôn luôn là trục thẳng hàng với con tàu (không bao giờ ở một góc) và là bật hoặc tắt. Đây là một trong những thiết lập có thể:

http://i.stack.imgur.com/GSBSH.png

Những gì tôi đã cố gắng cho đến nay là hình dung ra vectơ bắn và vectơ chỉ hướng đến trung tâm khối lượng của con tàu:

http://i.stack.imgur.com/ZzNzi.png

Thật không may, tôi đã không nhận được rất xa với điều đó.


7
Bạn đang đi đúng hướng với các vectơ lực. Hãy thử tìm kiếm các công thức cho vận tốc ANGULAR vì bạn đang cố gắng xoay con tàu quanh tâm khối lượng.
Amplify91

Tôi quên cách chính xác để làm điều đó, nhưng về cơ bản, nó chỉ bắt buộc ở mỗi điểm en.wikipedia.org/wiki/Center_of_mass và đặc biệt là en.wikipedia.org/wiki/Parallel_axis_theorem
CobaltHex

1
Tôi đã có chính xác cùng một ý tưởng! Một mẹo có thể giúp bạn dễ dàng hơn là bạn chỉ cần tính toán gia tốc góc và tuyến tính một lần cho mỗi bộ đẩy, do đó các phép tính có thể phức tạp như bạn muốn.
Markus von Broady

@ Amplify91, bình luận của bạn đã giúp tôi tìm ra nó, cảm ơn!
Migimunz

1
@migimunz Tôi đã suy nghĩ khá nhiều cho việc tính toán gia tốc trên mỗi bộ đẩy, không phải trên mỗi phím được nhấn (nhóm bộ đẩy). Ngoài ra, cung cấp cho người chơi lựa chọn bộ đẩy nào sẽ được kích hoạt trên đó nhấn phím nào có thể thú vị (một số người sẽ giao dịch quay nhanh hơn để quay tại chỗ)
Markus von Broady

Câu trả lời:


22

Sự thành công! Nó đây rồi, và nó đang quay như bình thường: nhập mô tả hình ảnh ở đây

Những gì tôi đã làm là như sau: với mỗi bộ đẩy, tôi tính độ lớn của mô-men xoắn, liên quan đến tâm khối lượng.

private function thrustTorque():Float
{
    // distToCom is the distance vector between the thruster and center of mass
    // fire angle is a unit vector representing the direction of the thruster
    var distAngle = Math.atan2(distToCOM.y, distToCOM.x);
    var fireAngle = Math.atan2(dir.y, dir.x);
    var theta = fireAngle - distAngle;
    var torque = distToCOM.length * Math.sin(theta);
    return torque;
}

Phương trình cho độ dốc của mô-men xoắn, theo wikipedia, là T = rF sin(theta), trong đó:

  • r là khoảng cách giữa bộ đẩy và COM
  • F là cường độ của lực được áp dụng (tôi bỏ qua nó, giả vờ nó chỉ là một, vì tôi chỉ quan tâm đến dấu hiệu).
  • theta là góc giữa hai vectơ

Khi người chơi nhấn trái, tôi kiểm tra dấu hiệu mô-men xoắn cho bộ đẩy đó - nếu nó nhỏ hơn 0, tôi sẽ bắn bộ đẩy. Nó chỉ ngược lại để quay theo chiều kim đồng hồ.

Điều này có lẽ có thể được cải thiện bằng cách sử dụng sản phẩm chấm để tính cosin của góc giữa các vectơ, nhưng điều đó sẽ phải đợi đến ngày mai.

Cuối cùng, đây là một bản demo trực tiếp .


Gần đó tôi nghĩ. Nó dường như không chính xác ở trung tâm của khối lượng. Chỉ sử dụng mũi tên trái / phải, con tàu có thể dễ dàng tắt màn hình. Rất gần mặc dù. Có lẽ điểm bạn đang đo là hơi tắt. Hoặc nó có thể là một vấn đề thời gian vì nó dường như ổn định thành một vòng quay tốt sau một thời gian. Mặc dù công việc tốt
MichaelHouse

Tôi không nghĩ đó là bất cứ điều gì để làm với logic này. Không có gì ở đây để đảm bảo rằng chiếc xe không nhận được một lực tịnh tiến từ việc bắn tập hợp các tên trộm được lựa chọn theo cơ chế này. Nếu việc duy trì không có lực tịnh tiến là một yêu cầu, nó sẽ yêu cầu có thể điều chỉnh lực của các bộ đẩy riêng lẻ (và có thể sẽ trở thành một vấn đề khó giải quyết hơn nhiều)
Trevor Powell

@TrevorPowell, chính xác. Vì mục đích đơn giản (và cũng thú vị, vì con tàu của bạn hoạt động tốt như thế nào sẽ phụ thuộc vào mức độ bạn thiết kế nó), tôi quyết định rằng các bộ đẩy được bật hoặc tắt. Tôi có thể sẽ bao gồm một ngưỡng để những cái gây ra quá ít mô-men xoắn (và do đó quá nhiều chuyển động bên) không được bật, nhưng chính xác thì "quá nhiều / ít" có thể sẽ được xác định bằng thử và sai.
Migimunz

3
Những gì bạn muốn làm để tránh tính toán góc là sử dụng sản phẩm chấm vuông góc (xuất phát từ định nghĩa sản phẩm chéo của mô-men xoắn T = r chéo F nếu bạn sử dụng vectơ 3D với z = 0). Bạn lấy vectơ (-ry, rx), vuông góc với r với cùng độ lớn và bạn tính tích của chấm của vectơ đó với F. Kết quả là T = rx * Fy - ry * Fx. Khi đó abs (T) là độ lớn của mô-men xoắn và dấu của nó cho biết hướng: T> 0 là ngược chiều kim đồng hồ, T <0 là chiều kim đồng hồ.
Joren

1
Lý do tại sao nó hoạt động rất dễ nhìn thấy bằng trực giác: r dot F = r F cos. Nếu bạn xoay r ngược chiều kim đồng hồ 90 độ và lấy sản phẩm chấm, bạn sẽ nhận được r F sin θ vì cos (- 90˚) = sin (θ).
Joren

14

Khái niệm 3D chung của mô-men xoắn là sản phẩm chéo của chuyển và có hiệu lực: T = rF . Trong hai chiều, một giá trị vô hướng cho mô-men xoắn sẽ đủ và chỉ được đưa ra bốn hướng trực giao cho các bộ đẩy, chúng ta có thể viết dưới dạng piecewise:

  • Lực theo hướng + x: T = F * (-ry)
  • Lực theo hướng -x: T = F * (ry)
  • Lực theo hướng + y: T = F * (rx)
  • Lực theo hướng -y: T = F * (-rx)

Ở đây, F là độ lớn của lực được tạo ra bởi các bộ đẩy, rx và ry là các thành phần x và y của vectơ từ điểm trục đến bộ đẩy. Các mô men dương có xu hướng xoay con tàu ngược chiều kim đồng hồ. Sử dụng bốn công thức trên, thật đơn giản để suy ra dấu hiệu của mô-men xoắn mà mỗi bộ đẩy tạo ra.

Đối với một đại diện vật lý chính xác khiêm tốn, bạn không chỉ cần biết dấu hiệu của lực đẩy, mà còn cả độ lớn của nó và quán tính quay. Hơn nữa, bạn có thể không chỉ đơn giản muốn kích hoạt tất cả các bộ đẩy được căn chỉnh chính xác để thực hiện xoay vòng.

Tàu không gian

Khi được vẽ, toàn bộ sức mạnh để đẩy B, D và E sẽ tối đa hóa vòng quay, nhưng cũng sẽ tăng tốc con tàu sang phải. Tắt D sẽ ngăn chặn điều này. Nếu thay vào đó, việc tăng tốc phải được dự định, nhưng không quay theo chiều kim đồng hồ, cách hiệu quả nhất để đi là cho phép cả C và F ở hai phần ba toàn bộ sức mạnh cùng với D.

Nếu điều này không vượt quá phạm vi của những gì bạn đang cố gắng thực hiện, bạn sẽ phải viết một số loại bộ giải cho các phương trình chuyển động, rõ ràng không phải là một nhiệm vụ đơn giản.


7

Một vài điều khác nhau. Đầu tiên, chúng ta cần nhận ra rằng đây là một vấn đề bị hạn chế. Đó là, có nhiều tổ hợp máy đẩy khác nhau có thể bắn để dẫn đến việc quay theo cùng một hướng. Tôi giả sử rằng trong tình huống của bạn, chỉ có hai trạng thái cho các bộ đẩy, "bật" và "tắt", và tất cả các bộ đẩy đều tạo ra lực bằng nhau.

Thứ hai, đánh dấu mô hình của bạn, có vẻ như "trung tâm khối lượng" của bạn không thực sự là trung tâm của bạn. May mắn thay, điều này sẽ không ảnh hưởng đến tính toán của bạn cho mô-men xoắn. Tuy nhiên, nó sẽ ảnh hưởng đến tính toán của bạn cho trung tâm của sự dịch chuyển khối lượng. Tôi không chắc liệu bạn có quan tâm đến độ chính xác ở mức đó hay không, vì "tâm khối lượng" của bạn ít nhất là hình vuông gần nhất với tâm khối lượng thực sự.

Thứ ba, nếu bạn muốn tính toán một bộ đẩy nhất định sẽ ảnh hưởng đến vòng quay như thế nào, bạn có quyền, mặc dù bạn đang sử dụng một công thức không hiệu quả. Mô-men xoắn có thể được tính là r x F, có độ lớn r*F*sin(theta). Tuy nhiên, tính toán các góc trong trường hợp này là một phương pháp không hiệu quả. Thay vào đó, bạn nên sử dụng trực tiếp định nghĩa sản phẩm chéo của mô-men xoắn, vì điều này sẽ đơn giản hơn nhiều khi sử dụng các đại diện bạn có. Bởi vì tất cả các vectơ của bạn không có thành phần z, công thức cho sản phẩm chéo đơn giản hóa rất nhiều.

Không thay đổi kết quả tính toán của bạn, chúng tôi chỉ có thể cập nhật mã của bạn

private function thrustTorque():Float
{
    var torque = distToCOM.x*dir.y-distToCOM.y*dir.x;
    return torque;
}

Điều đó đẹp hơn nhiều (và nhanh hơn).

Bạn đề nghị trong câu trả lời của riêng bạn rằng giải pháp của bạn là bắn tất cả các bộ đẩy với mô-men xoắn đúng hướng. Bây giờ, điều đó khá nhiều giải quyết câu hỏi mà bạn đã hỏi. Tuy nhiên, tôi hy vọng rằng một số điểm dọc theo đường, bạn sẽ thấy rằng chiến lược của mình không thỏa đáng, nếu người dùng nhấn nút "xoay" và tất cả các bộ đẩy có mô-men xoắn dương, có khả năng di chuyển chúng lên trên về việc xoay chúng (Tôi không chắc về mức độ chi tiết của mô phỏng của bạn, nếu bạn thực sự tính toán các lực từ các bộ đẩy, hoặc nếu bạn chỉ hiển thị trực quan chúng bắn và sau đó xoay mô hình của bạn với gia tốc liên tục hoặc một cái gì đó. cách này, bạn muốn các máy đẩy được bắn ít nhất là chính xác).

Bạn không xem xét lực lượng ròng trên tàu. Nếu bạn có số lượng đẩy tùy ý, thì điều này có thể biến thành một vấn đề khá phức tạp. Tuy nhiên, vì các bộ đẩy của chúng tôi chỉ có hai trạng thái, nên việc phân tích khá đơn giản. Tôi không chắc chính xác mục tiêu của chúng tôi là gì, vì vậy tôi có thể tưởng tượng ra hai mục tiêu khác nhau: thứ nhất, chúng tôi muốn giảm thiểu tổng lực, trong khi vẫn giữ mô-men xoắn theo hướng chúng tôi muốn. Thứ hai, chúng tôi muốn tối đa hóa tỷ lệ mô-men xoắn trên tổng lực.

Bên cạnh đó, nếu bạn có thể tưởng tượng một điều khiển "khối lượng đẩy" bổ sung ảnh hưởng đến sức mạnh của tất cả các bộ đẩy, thì bạn có thể đặt điều khiển này để hai giải pháp của bạn có mô-men xoắn bằng nhau và bạn thấy rằng giải pháp thứ hai chỉ có thể có một chuyển vị nhỏ hơn đầu tiên. Tuy nhiên, chúng ta cần nhớ rằng nếu có thể bắn các bộ đẩy để bạn chỉ xoay và không di chuyển chút nào, thì cả hai giải pháp sẽ giống nhau.

Vì vậy, chúng ta sẽ đi với giải pháp thứ hai, dựa trên các đối số của đoạn trước. Bây giờ, khi phân tích tổng lực, chúng ta có thể chỉ cần lưu ý rằng chỉ có bốn hướng mà động cơ có thể chỉ ra. Do đó, tổng lực theo hướng x chỉ là số lượng bộ đẩy hướng trái trừ số chỉ về bên phải và tương tự cho hướng y.

Sau khi viết đến nay, tôi phải suy nghĩ thêm về thuật toán để tối ưu hóa nó. Tôi nghĩ phần còn lại của bài viết của tôi cũng hữu ích, vì vậy tôi sẽ đăng nó, nhưng tôi sẽ cập nhật khi tôi tìm ra cách tốt nhất để tối ưu hóa cấu hình này (Tôi đã nghĩ ra một vài cách để có câu trả lời gần đúng, nhưng không ai trong số họ là chính xác).


Cảm ơn bạn đã trả lời (và giải pháp nhanh hơn và sạch hơn để tính toán mô-men xoắn). Vòng tròn màu đỏ không phải là COM của tàu, đó là lõi năng lượng. Tôi đang sử dụng một động cơ vật lý và tôi chỉ đang áp dụng một xung lực cục bộ cho con tàu. Tôi ổn với giải pháp không hoàn hảo vì nó rất thú vị khi chơi xung quanh với các cấu hình khác nhau, nhưng tôi rất muốn biết những gì bạn nghĩ ra.
Migimunz

1
Bạn có thể tính toán mô-men xoắn từ một điểm tham chiếu tùy ý. Số kết quả sẽ thay đổi, nhưng miễn là bạn xoay con tàu quanh điểm này, không cần phải là trung tâm của khối lượng, hành vi vật lý sẽ không. Trong thực tế, không có thông tin về phân phối khối lượng, trung tâm của khối lượng là tùy ý và không thể được tính như vậy.
Marcks Thomas
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.