Xác định vị trí của một đối tượng dọc theo một đường cong theo thời gian


8

Tôi có một số đối tượng trong trò chơi của mình bị "ném". Hiện tại tôi đang cố gắng thực hiện điều này bằng cách để các đối tượng này đi theo một đường cong parabol. Tôi biết điểm bắt đầu, điểm kết thúc, đỉnh và tốc độ của vật thể.

  1. Làm cách nào tôi có thể xác định tại bất kỳ thời điểm hoặc khung cụ thể nào tọa độ x & y là gì?
  2. Là một đường cong parabol thậm chí là đường cong bên phải được sử dụng?

Đầu vào của bạn là mơ hồ. Tôi giả sử đỉnh có nghĩa là vị trí nhìn chằm chằm. Và điểm kết thúc có nghĩa là vị trí kết thúc. Tốc độ có nghĩa là gì? Làm thế nào xa đối tượng có thể đi trong một giây? Là tốc độ trong bao lâu thời gian mà đối tượng nên đi từ đầu đến cuối?
deft_code

Xin lỗi vì không rõ ràng. Tôi sẽ cố gắng làm cho nó đơn giản - Tôi muốn làm cho một quả bóng di chuyển từ một bên của màn hình (x = 0) sang phía bên kia (x = 480), bắt đầu từ y = 0 và đạt tối đa y = 320 (ở nửa chừng, x = 240). Tôi muốn nó làm điều này hơn 2 giây. Từ thông tin này, tôi có thể xác định từ một công thức tọa độ x và y của tôi cho mỗi khung không?
Ben Williams

Câu trả lời:


4

Những gì bạn đang tìm kiếm một âm mưu tham số của chức năng parabol. Dễ dàng nhất để làm cho hàm tham số sử dụng phạm vi p [0,1].

Các hình thức chính tắc cho một parabola tham số là

k: = một số hằng số
f_x (p) = 2kp
f_y (p) = kp²

Sử dụng công thức này và một số đại số cơ bản cho chức năng biến hình và tôi đã nhận được

p ∈ [0,1] → x, y ∈ [0,1]
hoặc nói cách khác giữ p trong khoảng từ 0 đến 1 và x, y cũng sẽ nằm trong khoảng từ 0 đến 1.
x = p
y = 4p - 4p²

Vì vậy, để có được các chức năng này sẽ tạo ra những con số bạn đang tìm kiếm.

float total_time = 2;
float x_min = 0;
float x_max = 480;
float y_min = 0;
float y_max = 320;

float f_x( float time )
{
   float p = time/total_time;
   return x_min + (x_max-x_min)*p;
}

float f_y( float time )
{
   float p = time/total_time;
   return y_min + (y_max-y_min)*(4*p-4*p*p);
}

ký hiệu của bạn là một chút bối rối. bạn f_xsử dụng f_ygia tốc acủa nó như một nửa vận tốc của nó? Bạn nên làm điều đó x(t) = x0 + vx0*ty(t) = y0 + vy0*t + .5*ay*t*t
Tobias Kienzler

Tôi cố tình không sử dụng các công thức chuyển động euler. atchỉ là những cái tên được chọn kém. Bạn nên chú ý rằng không có thành phần vận tốc trong công thức. Chuyển động Euler và parabolas tham số không giống nhau, nhưng chúng rất giống nhau như chuyến bay đạn đạo theo dõi một đường parabol.
deft_code

4

Tìm phương trình của một đường cong mà bạn muốn đối tượng của mình di chuyển là một cách để thực hiện những gì bạn muốn, nhưng có lẽ không phải là tốt nhất.

Thay vào đó, người ta thường theo dõi các thuộc tính cục bộ của một đối tượng (vận tốc, gia tốc) và sau đó sử dụng các giá trị này để cập nhật vị trí của đối tượng mỗi khung hình.

Vì bạn đã đề cập đến một parabola, tôi giả sử rằng bạn đang ném một quả bóng ở dạng 2D và bạn muốn nó rơi xuống dọc theo trục y. Vì vậy, đối tượng của bạn có gia tốc không đổi theo hướng y (hãy gọi như vậy g) và không tăng tốc theo hướng x. Khi vật bị ném, nó được cung cấp một số vận tốc, hãy gọi nó vxvy.

Sau đó, mọi khung hình trong ứng dụng của bạn, bạn sẽ thêm gia tốc của vật thể vào vận tốc của nó, rồi thêm vận tốc của nó vào vị trí của nó. Cái gì đó như:

vy += g;
x += vx;
y += vy;

Làm điều này mọi khung hình và quả bóng của bạn sẽ bắt đầu di chuyển. Có rất nhiều điều để biết về điều này, nhưng đó là một sự khởi đầu.


Tôi đang ném một quả bóng ở dạng 2D, nhưng quả bóng có gia tốc theo hướng x. Tôi muốn nó được ném từ một bên của màn hình sang bên kia (xem bình luận về câu hỏi ban đầu). Tôi hiểu cách cập nhật dựa trên vx và vy, nhưng tôi không chắc cách tự cập nhật các giá trị đó.
Ben Williams

2
@Ben Williams Bạn chỉ cần đặt vx và vy khi bắt đầu. Và thêm trọng lực cho vy mỗi khung hình. Bạn cũng có thể có ma sát bằng cách nhân cả vx và vy với một số dưới 1 (đại loại như .95 có thể hoạt động tùy thuộc vào tốc độ khung hình của bạn). Tìm kiếm trên google "bóng nảy YourProgrammingL LanguageHere" và bạn có thể sẽ nhận được một số hướng dẫn cơ bản nhưng hữu ích.
Tấn

3
Trên thực tế, nếu bạn biết rằng đối tượng của bạn đang đi theo một quỹ đạo parabol, sẽ tốt hơn nhiều nếu thực hiện nó như một hàm đường cong, thay vì các bước vật lý rời rạc. Đúng, ban đầu có thể 'khó hơn' để viết mã, nhưng phần thưởng là sự chuyển động của đối tượng của bạn trở nên tách rời khỏi các mối quan tâm về tốc độ khung hình.
Blair Holloway

1
Tôi thứ hai @Blair, trừ khi bạn tách tốc độ khung hình vật lý khỏi tốc độ khung hình video, điều này có thể gây ra các hiệu ứng khủng khiếp như cắt các lỗi
Tobias Kienzler

2

Câu trả lời của Brandon khá hay, nhưng nếu bạn đang tìm kiếm một thứ gì đó cao cấp hơn, bạn có thể muốn kiểm tra phép nội suy tuyến tính: http://en.wikipedia.org/wiki/Linear_interpolation

Ngoài ra, nếu đường cong của bạn là một hàm, bạn có thể biết các hợp âm x và y (và z) tại một thời điểm nhất định. Điều này cũng có thể giúp: http://www.ucl.ac.uk/Mathatures/geomath/level2/fvec/fv8.html#l1


0

Trong các trò chơi trên bàn điều khiển, chúng tôi thường sử dụng Nội suy bicubic để giải quyết vấn đề này. Đầu tiên, lấy mẫu vị trí của một đối tượng theo các khoảng thời gian đều đặn t. Đối với một vật phóng, thêm gia tốc trọng trường [0, dy / dt / dt] vào vận tốc của nó [dx / dt, dy / dt] tại mỗi khoảng thời gian. Ghi lại tất cả các tọa độ [x, y] được tạo trong một mảng.

Sau đó, để xây dựng lại vị trí của đối tượng [x, y] cho một t cho trước, hãy đọc bốn mẫu gần nhất với t từ bộ đệm mà bạn đã ghi: [t - 1, t, t + 1, t + 2]. Trộn bốn mẫu theo các hệ số trong bài viết wikipedia được liên kết để có được chuyển động mượt mà trong không gian.

Điều này không chính xác về mặt vật lý như thực hiện các tính toán vật lý đang hoạt động nhưng nó cho phép giấy phép nghệ thuật và quy mô kinh tế để hỗ trợ mô phỏng của bạn.

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.