Mô hình quỹ đạo hình elip


8

Tôi đang chơi với quỹ đạo trong một trò chơi 2 chiều đơn giản, nơi một con tàu bay vòng quanh vũ trụ và bị thu hút bởi những thứ đồ sộ. Vận tốc của con tàu được lưu trữ trong một vectơ và gia tốc được áp dụng cho mọi khung hình theo định luật hấp dẫn phổ quát của Newton. Các khối điểm không di chuyển (chỉ có 1 ngay bây giờ) vì vậy tôi sẽ mong đợi một quỹ đạo hình elip.

Thay vào đó, tôi thấy điều này:

Đây là những gì tôi thấy

Tôi đã thử với quỹ đạo gần tròn và tôi đã thử làm cho khối lượng khác nhau rất lớn (hệ số một triệu) nhưng tôi luôn có được quỹ đạo quay này.

Đây là một số mã (D), cho ngữ cảnh:

void accelerate(Vector delta)
{
    velocity = velocity + delta; // Velocity is a member of the ship class.
}

// This function is called every frame with the fixed mass. It's a
// method of the ship's.
void fall(Well well)
{
    // f=(m1 * m2)/(r**2)
    // a=f/m
    // Ship mass is 1, so a = f.
    float mass = 1;
    Vector delta = well.position - loc;
    float rSquared = delta.magSquared;
    float force = well.mass/rSquared;
    accelerate(delta * force * mass);
}

woo vâng D. Bài kiểm tra đơn vị mã toán so với kết quả đã biết; và tất cả sẽ tốt
giảm tốc

Câu trả lời:


7

Các lỗi là trong fallchức năng. Chúng ta có

  1. delta: một vectơ từ giếng đến tàu
  2. force: độ lớn của trọng lực giữa hai cơ thể này.

|force| là G * m1 * m2 / r ^ 2

nhưng |delta|đã r! Vì vậy, bạn đang thực sự tăng tốc quá nhanh. Bạn cần chia rlại một lần nữa (về cơ bản là bình thường hóa vectơ delta) trước khi gọi tăng tốc.

accelerate(delta * well.mass * mass / rSquared / Math.sqrt(rSquared))

4

Lưu ý rằng ngay cả khi đã sửa lỗi toán học, bạn đang sử dụng tích hợp Euler (nghĩa là velocity += deltavà có lẽ position += velocity), do đó bạn có thể sẽ nhận được một số hiệu ứng kỳ lạ như xoay hình elip quỹ đạo theo thời gian và có lẽ hình elip ngày càng lớn hơn / nhỏ hơn vì tích hợp Euler không được bảo đảm để tiết kiệm năng lượng.

Bạn có thể muốn chuyển sang tích hợp bước nhảy vọt , đó là tiết kiệm năng lượng và sẽ hoạt động tốt hơn cho cơ học quỹ đạo. Ngoài ra, bạn nên bao gồm thời gian khung trong các phương trình của mình để tốc độ mô phỏng của bạn không phụ thuộc vào tốc độ khung hình.

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.