Tính toán các thang đo quán tính


10

Một câu hỏi phức tạp và dài dòng mà tôi sẽ thừa nhận, tôi chưa hiểu rõ lắm nên tôi sẽ cố gắng giải thích tốt nhất có thể.

Phiên bản ngắn: Có một công thức c ++ / Physx chung ngoài kia để tính toán các thang đo quán tính dựa trên hình dạng đối tượng không?

Phiên bản dài: Đối với vật lý của chúng tôi, chúng tôi cần chỉ định các thang đo quán tính x, y và z. Hiện tại cách chúng tôi làm là khá nhiều chỉ là một tỷ lệ dựa trên khối lượng. Vì vậy, nếu một đối tượng dài trên trục X và mỏng trên Y và Z và khối lượng là 10000, chúng ta sẽ đặt Z và Y thành 7000 và X thành 3000. (Điều này không chính xác, nhưng chỉ để đưa ra ý tưởng)

Điều này hoạt động tương đối tốt nhưng vấn đề lớn nhất của chúng tôi là khi có sự bất ổn chung ở đâu đó, chúng tôi phải tiếp tục đoán ở trạng thái căng cho đến khi chúng tôi tìm ra cái gì hoạt động tốt nhất. Điều này có thể trở nên rất tốn thời gian nếu chúng ta có một mô phỏng vật lý rất lớn và một trong số hơn 20 khớp đang khiến tất cả các khớp khác mất đi sự ổn định.

Những gì tôi đang làm là một hàm sẽ lấy hộp giới hạn của một đối tượng và hy vọng tính toán các tenxơ tương đối chính xác. Tôi đã lấy một số phép toán từ http://en.wikipedia.org/wiki/List_of_moment_of_inertia_tensors và thực hiện một hàm về cơ bản hoạt động như sau cho các phép quay tương tự bên dưới.

Hình khối đặc có chiều rộng w, chiều cao h, chiều sâu d và khối lượng m nhập mô tả hình ảnh ở đây

Hoặc nếu vòng quay kết thúc, như thế này:

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

Vì vậy, điều này dường như mang lại cho tôi kết quả tương tự như cách chúng tôi đã làm, nhưng tôi không muốn chuyển sang cách này mà không đảm bảo rằng nó sẽ hoạt động cho sử dụng chung. Dưới đây là mã cho chức năng của tôi dựa trên hình ảnh đầu tiên với trục hình khối và trục giữa.

NxVec3 CalculateInertiaTensor( VisBoundingBox_cl boundingBox, float m )
{
    float width = boundingBox.GetSizeX();
    float height = boundingBox.GetSizeZ();
    float depth = boundingBox.GetSizeY();

    float xTensor = 0.083f * m*(height*height + depth*depth);
    float yTensor = 0.083f * m*(width*width + depth*depth);
    float zTensor = 0.083f * m*(width*width + height*height);

    return NxVec3(xTensor, yTensor, zTensor);
}

Tôi không thể đảm bảo rằng đây là cách đúng đắn để làm điều đó (vì cách chính xác nhất là sử dụng hình dạng thực tế thay vì hộp giới hạn) và tôi không quen lắm với các thang đo quán tính và toán học nhưng nó dường như trả về các con số khá giống với những gì chúng tôi đã sử dụng. Bất cứ ai ở đây tình cờ biết nếu có một cách tốt hơn để làm điều này?


3
Nếu bạn có thể phân tách vật thể của mình thành tứ diện thì bạn phải có thể sử dụng tuyến tính của tenxơ cùng với công thức cơ bản cho mômen quán tính của tứ diện (ví dụ bạn có thể tìm thấy điều này với Wolfram Alpha) để tính toán chính xác tenxơ. Mối quan tâm của tôi với phương pháp hộp giới hạn sẽ là nó thực sự phụ thuộc vào mức độ BB của đối tượng bạn điền vào; ví dụ, hãy tưởng tượng sự khác biệt giữa một ellipsoid béo và một lò xo xoắn ốc mảnh mai.
Steven Stadnicki

Cảm ơn các đầu vào. Và bạn đã đúng, vấn đề chính của tôi xuất hiện khi có một vật thể có hình chữ 'A', BB sẽ làm cho các tenx trở lại không chính xác. Tôi sẽ kiểm tra thông tin của bạn, cảm ơn!
Mungoid

Bạn được chào đón - nếu bạn muốn tôi viết chi tiết hơn, tôi phải có thể xây dựng một câu trả lời thích hợp từ đó, nhưng điều đó là đủ để bạn bắt đầu.
Steven Stadnicki

Nếu bạn sẵn sàng, điều đó thật tuyệt vời! Tôi đã cố gắng tìm hiểu điều này trong một thời gian nhưng tôi vẫn còn một chút non nớt trong lĩnh vực này vì vậy cuối cùng tôi càng ngày càng bối rối hơn = -)
Mungoid

Câu trả lời:


7

Tôi sẽ đề nghị rằng đây là một vấn đề khó vì các công thức thông thường dựa trên việc sử dụng Định lý Green để chuyển đổi các tích phân khối thành tích phân bề mặt không áp dụng, và vì vậy bạn thực sự phải cung cấp một phép phân tách tứ diện cho hình của bạn - nhưng nó biến Điều đó không đúng. Miễn là hình dạng của bạn có mật độ đồng đều (đó là một xấp xỉ mà bạn đã thực hiện bằng mọi cách, có lẽ, và hoàn toàn hợp lý cho hầu hết các trường hợp), thì tích phân khối có thể được đơn giản hóa thành tích phân bề mặt, và sau đó đơn giản hóa hơn nữa. Tốt hơn nữa, dường như có một thuật toán và mã đẹp mắt trên mạng để làm điều này; hãy xem http: //www.cs.ber siêu.edu / ~ jfc / michich / massProps.html, Trang của Brian Mirtich mô tả các thuật toán của ông để tính toán các khoảnh khắc và tâm khối lượng. Nó sẽ đáp ứng khá nhiều tất cả các nhu cầu của bạn trên mặt trận này. Lưu ý rằng đây là điều bạn sẽ muốn thực hiện một lần, với tư cách là công cụ xuất hình hoặc tại thời điểm nhập, nhưng không phải là thứ bạn sẽ cần thực hiện mỗi khung hình; chỉ cần lưu trữ tenxơ quán tính về tâm khối lượng cùng với phần còn lại của thông tin hình dạng, và nếu bạn cần tìm tenxơ cho mô men quán tính về một số trục khác thì bạn có thể sử dụng các định lý chuẩn để rút ra nó.

Hy vọng rằng điều này sẽ bao gồm những gì bạn cần - nếu có thêm mà tôi có thể cố gắng giúp đỡ, hãy cho tôi biết!


4

Tôi chưa bao giờ tự làm điều này, nhưng nếu tôi phải viết một giải pháp nhanh chóng cho các mắt lưới tùy ý, tôi có thể sẽ tạo ra đủ điểm khối lượng bên trong vật thể để ước tính nó và tính toán các lực căng quán tính từ chúng.

Các điểm có thể được tạo ra đồng đều bên trong hộp giới hạn của hình và sau đó loại bỏ những điểm nằm ngoài hình dạng thực. Điều này sẽ giảm vấn đề chỉ kiểm tra nếu một điểm nằm trong hình.


0

Đối với hầu hết các ứng dụng trò chơi (tức là "làm nổ tung công cụ") chỉ cần sử dụng phương trình cho vật rắn hình chữ nhật ở trên có lẽ là đủ tốt. Với điều kiện đối tượng được căn chỉnh theo trục, không phải là một đường chéo trên khung giới hạn, sẽ hoạt động. Một số công cụ vật lý trò chơi, chẳng hạn như ODE, chỉ sử dụng các thuật ngữ trên đường chéo chính của tenxơ quán tính. Đối với họ, các đối tượng của bạn cần ít nhất là được căn chỉnh theo trục để hoạt động đúng.

Tôi đã sử dụng thuật toán của Mirtich trong Falling Bodies vào năm 1997. Nó hoạt động tốt, nhưng bạn phải có hình học sạch - một lưới không tự giao nhau khép kín về mặt cấu trúc. Nếu có lỗ, tính toán quán tính sẽ tạo ra kết quả hoàn toàn không có thật. Tôi chỉ sử dụng hình học lồi, vì vậy trước tiên tôi đã chạy QHull để lấy một thân tàu lồi cho các mục đích va chạm, sau đó tính toán quán tính từ đó.

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.