Làm thế nào để tính toán tốc độ rơi và tăng tốc?


9

Tôi đang nghĩ đến việc tạo ra một trò chơi đổ bộ, nơi bạn điều khiển tàu vũ trụ và cần hạ cánh nó mà không gặp sự cố. Một công thức đơn giản để tính tốc độ rơi hoặc tăng tốc liên quan đến thời gian làm việc với động cơ thời gian là gì?

Câu trả lời:


28

Cách đơn giản nhất là tích hợp Euler. Bạn phải lưu trữ vector vị trí và vector vận tốc. Tại mỗi khung:

  • đo thời gian trôi qua kể từ bước tích hợp cuối cùng: dt
  • tính toán lực vecor do động cơ của bạn: F
  • tính toán vectơ gia tốc: A = F / m trong đó m là khối lượng tàu vũ trụ.
  • thêm vectơ trọng lực: A = A + G đảm bảo rằng điểm G hướng về tâm của hành tinh
  • cập nhật vectơ vận tốc V = V + A · dt
  • cập nhật vectơ vị trí X = X + V · dt

( x cho vô hướng, X cho vectơ)

hãy chắc chắn rằng dt nhỏ ...

| G | là khoảng 9,8 m / s² đối với trái đất và khoảng 1,6 m / s² đối với mặt trăng

nói chung, lực hấp dẫn do tương tác trọng lực là:

Định luật vạn vật hấp dẫn của Newton

Nó ảnh hưởng đến từng cơ thể và nó hướng về phía người khác.

Các G vô hướng là rất nổi tiếng hằng số hấp dẫn đó là về 6.67e-011 N (m / Kg) ²

Vì bạn quan tâm đến việc tăng tốc:

Sự tăng tốc

Bạn chỉ cần biết khối lượng của hành tinh (m2) và bán kính (r) để tính gia tốc của bạn.

Thông thường, gia tốc di chuyển hành tinh về phía tàu vũ trụ của bạn là không đáng kể vì thường m1 không đáng kể so với m2.

Tuy nhiên, nếu bạn đang cố gắng hạ cánh xuống một tiểu hành tinh nhỏ, bạn có thể phải sử dụng công thức chung thêm lực đó vào vectơ tổng lực trong bước thứ hai.

BIÊN TẬP:

Theo yêu cầu một số gợi ý về việc thực hiện. Bạn sẽ cần:

  • Một thư viện vector
  • Mô hình động cơ
  • Mô hình phisics
  • Phát hiện va chạm
  • Giao diện người dùng (đầu vào và kết xuất đồ họa)

Trước hết là thư viện vectơ: trò chơi của bạn có thể là đơn sắc / bi / cây / bốn ... tùy ý, theo như bạn coi trường hợp của bạn là hình chiếu của một từ 3D, các roules vật lý giữ.

Nếu n là thứ nguyên bạn chọn (có thể là 2 hoặc 3 trong trường hợp của bạn), thư viện phải có:

  • một thực thể lưu trữ vector (danh sách n số dấu phẩy động cho mỗi vectơ)
  • một toán tử tổng (tổng thành phần theo thành phần)
  • một toán tử nhân vô hướng (mỗi thành phần nhân với một float)
  • phép nhân chấm giữa các vectơ (nhân thành phần theo thành phần và tổng hợp tất cả)
  • chiều dài vectơ (căn bậc hai của một vectơ chấm - tự nhân đôi)

Bạn có thể sử dụng một thư viện thực hiện điều này hoặc tự mình thực hiện; một vectơ có thể là một cấu trúc hoặc một lớp, sự lựa chọn là của bạn.

Mỗi động cơ nên được mô tả bởi:

  • một vectơ chỉ ra sức mạnh và hướng của nó
  • một vô hướng cho biết mức sử dụng nhiên liệu mỗi giây khi hết công suất;

đầu vào người dùng của bạn sẽ được sử dụng để cung cấp cho mỗi động cơ một số sẽ nằm trong khoảng từ 0 (động cơ không sử dụng) đến 1 (toàn bộ công suất): hệ số động cơ (mức sử dụng).

Nhân hệ số động cơ cho vectơ lực đẩy của nó để có được sự tin tưởng thực sự của động cơ và tổng hợp tất cả các kết quả của tất cả các động cơ có sẵn; điều này sẽ cung cấp cho bạn F của bước thứ hai.

Hệ số động cơ của bạn có thể được sử dụng để biết mức sử dụng nhiên liệu thực tế cho từng động cơ: nhân hệ số động cơ với mức sử dụng nhiên liệu và dt để biết mức sử dụng nhiên liệu tức thời; bạn có thể trừ giá trị này từ tổng công suất nhiên liệu (điều này mang đến cho bạn cơ hội cập nhật tổng khối lượng m nếu khối lượng nhiên liệu đáng kể).

Bây giờ bạn có thể tiến hành sử dụng tích hợp để tính toán vị trí mới, kiểm tra sự va chạm với bề mặt hành tinh của bạn; nếu có, sử dụng chiều dài của vectơ vận tốc để nói nếu cuộc đổ bộ là thành công hay thảm họa.

Rõ ràng các kiểm tra va chạm khác có thể / nên được thực hiện, một số thực thể bề mặt không thể được phép làm điểm hạ cánh để mọi va chạm là một điểm nghiêm trọng.

Tôi để lại làm thế nào để có được đầu vào và làm thế nào để hiển thị tàu vũ trụ của bạn cho bạn; ví dụ, bạn có thể sử dụng hệ số động cơ để hiển thị khung trạng thái động cơ theo khung.


Điều đó thật tuyệt, nhưng một số ý tưởng làm thế nào để đưa nó vào mã sẽ rất tuyệt.
Dvole

1
nơi tôi học vật lý shiffman.net/teaching/nature
Ming-Tang

Anh chàng này biết môn Vật lý của mình!
MGZero

7

Vì câu trả lời xuất sắc khác có vẻ hơi lý thuyết, đây là phiên bản mã đơn giản:

// Position of the lander:
var positionX =  100.0;
var positionY = 100.0;

// Velocity of lander
var velocityX = 0.0;
var velocityY = 0.0;

// Acceleration due to gravity
var gravity = 1.0;

// If the player is pressing the thrust buttons
var isThrusting = false;
var isThrustingLeft = false;
var isThrustingRight = false;

// Thrust acceleration
var thrust = -2.0;

// Vertical position of the ground
var groundY = 200.0;

// Maximum landing velocity
var maxLandingVelocity = 3.00;    

onUpdate()
{
    velocityY += gravity;

    positionX += velocityX;
    positionY += velocityY;

    if (isThrusting)
    {
        velocityY += thrust;
    }

    if (isThrustingLeft)
    {
        velocityX += thrust;
    }
    else if (isThrustingRight)
    {
        velocityX -= thrust;
    }

    if (positionY >= floorY)
    {
        if (velocityY > maxLandingVelocity)
        {
            // crashed!
        }
        else
        {
            // landed successfully!
        }
    }
}

2
Giữ cho nó đơn giản. Tôi hy vọng điều này là dọc theo những gì anh ấy đang tìm kiếm.
Beska

2

Thật không may, toán học ở đây có lông. Câu trả lời của FxIII là tốt cho trường hợp chung của một vật thể rơi nhưng bạn đang nói về một tên lửa - và tên lửa đốt cháy nhiên liệu.

Tôi đã thấy mã làm điều đó nhưng nó hoàn toàn không có giấy tờ và tôi không bao giờ tìm ra toán học đằng sau nó. Trừ khi bạn bị giới hạn CPU bằng cách nào đó, tôi sẽ không làm phiền và chỉ đơn giản là dùng vũ lực - Cách tiếp cận FxIII được áp dụng trong khoảng thời gian khá ngắn và điều chỉnh lực đẩy (hoặc sử dụng nhiên liệu nếu bạn điều chỉnh lại tên lửa khi nhiên liệu bị đốt cháy để duy trì gia tốc quy định thay vì lực đẩy quy định) giữa mỗi lần lặp khi tên lửa đốt cháy nhiên liệu.


Đi ra khỏi nhiên liệu chỉ đại diện cho một thông số rơi. Nó chỉ đơn giản là một lực vectơ với giá trị giảm dần. Tôi có lầm không? Trong trường hợp đơn giản, bạn có G so với F, trong đó F là động cơ của tên lửa và trọng lực của trái đất: Trong trường hợp này, bạn chỉ cần đo cả hai so với nhau, vì vậy nếu không có nhiên liệu thì F rơi xuống 0 nên bạn chỉ phải áp dụng G làm lực vectơ cho đối tượng của bạn. Hoạt động với mọi giá trị của F. Miễn là F> = G, đối tượng "nên" di chuyển theo hướng của F.
daemonfire300

2
@ daemonfire300: Bạn hiểu nhầm - Tôi không nói về tác dụng của việc hết nhiên liệu, mà là hiệu quả của việc đốt cháy nhiên liệu. Cài đặt bướm ga liên tục trên động cơ của bạn tạo ra một con số tăng tốc liên tục, gia tốc liên tục tạo ra tốc độ đốt cháy nhiên liệu liên tục giảm. Điều này có nghĩa là các tính toán đơn giản mà FxIII đưa ra sẽ tạo ra số sử dụng nhiên liệu không chính xác.
Loren Pechtel

Lượng tăng tốc đạt được từ A = F / M khi nhiên liệu bị đốt cháy sẽ là một giá trị không đáng kể trừ khi tỷ lệ khối lượng nhiên liệu trên xe cao vô lý hoặc tốc độ đốt cháy nhiên liệu cao tương tự. Đây là một trò chơi, sau tất cả.
Patrick Hughes

@Patrick Hughes: Lượng nhiên liệu được mang theo bởi bất kỳ tàu đổ bộ tên lửa thực thụ nào (tôi không tính các trường hợp lai aerobrake / tên lửa sao Hỏa) là một phần đáng kể trong tổng trọng lượng của nó. Giả sử nhiên liệu: tỷ lệ tăng tốc được cố định sẽ tạo ra một câu trả lời rất sai.
Loren Pechtel

1
Đây không phải là một câu trả lời cho câu hỏi, chỉ là một nhận xét về câu trả lời của @ FxIII.
Jonathan Connell
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.