Làm thế nào để tôi mô phỏng một con lắc đang lắc?


9

Tôi muốn mô phỏng một sợi dây có trọng lượng kèm theo, lắc qua lắc lại như một con lắc. Bất kỳ vật lý thực tế là quá mức cần thiết; nó chỉ lặp đi lặp lại vô tận cùng một chuyển động.

JQuery có một "cú swing" dễ dàng tương tự như những gì tôi đang tìm kiếm. Làm thế nào nó hoạt động?

Tôi đã nghĩ đến việc xoay từ góc này sang góc khác Math.easeOutExpo, nhưng con lắc thực sự dễ dàng khác nhau ...


2
Có đường cong hình sin đưa vào vận tốc góc của con lắc, sao cho điểm 0 nằm ở cực đại và giá trị vận tốc cao nhất nằm ở đáy.
Shotgun Ninja

Câu trả lời:


10

Chà, bạn sẽ phải sử dụng một chút vật lý, nhưng bạn không cần phải mô phỏng bất kỳ vật lý nào. Có những công thức cho chuyển động của con lắc bạn có thể dễ dàng sử dụng để đặt vòng quay của con lắc. Đối với dao động nhỏ, chuyển động có thể được xấp xỉ bằng chuyển động điều hòa đơn giản .

Sự dịch chuyển góc tại một thời điểm cụ thể có thể được xấp xỉ bằng:

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

Điều này là chính xác nhất cho tối đa nhỏ, nhưng có thể sẽ đủ chính xác cho mục đích của bạn. Tạo một hàm mất thời gian hiện tại và đưa ra góc mà con lắc của bạn sẽ được xoay và xoay sprite của bạn theo số tiền đó.


4

Dưới đây là một phép tính không có trig, xuất phát từ Trig và Vật lý Lớp 11 thẳng tiến. Nó giả định rằng điểm gốc là điểm thấp nhất của hệ thống treo của con lắc, L là chiều dài của con lắc và quy ước đồ họa thông thường của y tăng xuống và x tăng sang phải được chấp nhận:

Cập nhật: Tôi đã làm hỏng yAccelencies ban đầu; cái này dễ hơn
Cập nhật # 2 : Đã thêm kiểm soát thời gian rõ ràng và thêm đơn vị đo.

const float gravity = 9.8;     // units of metres/sec/sec
const float deltaT  = 0.001;   // equals 0.001 sec or 1 millisecond

var xVelocity = 0.010;         // units metres/sec equals 10 cm/sec 
var x = 0.0;                   // units metres
var y = 0.0;                   // units metres

while (true) {
  var xAcceleration = -gravity * (x/L) * (L-y)/L;

  x += (xVelocity + (xAcceleration/2 * deltaT)) * deltaT;
  y  = Math.SQRT(L*L - x*x) - L; 

  xVelocity += xAcceleration * deltaT;
}

2
Thời gian bị thiếu trong phương trình.
Maik

@MaikSemder: Đơn vị thời gian được xác định là chu kỳ hoạt hình, bất kể đó là gì. Tại sao một người sẽ làm điều đó theo cách khác?
Pieter Geerkens

Ngay bây giờ tích hợp tăng tốc của bạn sử dụng thời gian ẩn là 1 đơn vị. Nếu đơn vị thời gian trò chơi của bạn là giây, bạn chỉ có thể có 1 khung mô phỏng mỗi giây, chỉ cần bổ sung thời gian một cách rõ ràng và bạn thoát khỏi vấn đề đó. Thời gian đã ở đó, chỉ cần làm cho nó rõ ràng. Ví dụ, thời gian khung hình thay đổi nhưng bạn cần tốc độ ổn định của hình ảnh động độc lập với thời gian khung hình, giữa các nền tảng khác nhau hoặc bạn muốn có hiệu ứng slomo, rất nhiều lý do.
Maik

1
Đó là quan điểm của tôi, g đến từ bên ngoài hoặc "trò chơi". Bây giờ bạn có đơn vị thời gian. Delta t ngay bây giờ là 1 của đơn vị thời gian đó. Đối với một mô phỏng thời gian thực không thuận tiện lắm, vì trò chơi của bạn có "ý tưởng" riêng về thời gian trôi qua. Làm cho nó trở thành một tham số rõ ràng thay vì hằng số ẩn có thể làm cho câu trả lời của bạn hữu ích cho trò chơi.
Maik

2
Đẹp :) vận tốc cũng phải được nhân với "deltaT", để có được "sự dịch chuyển" ra khỏi vận tốc, vì vậy nó có thể được thêm vào "x", được nâng cấp
Maik
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.