Nhận điểm trên một đường thẳng giữa hai điểm


9

Tôi đang tạo một trò chơi không gian đơn giản bằng JavaScript, nhưng bây giờ tôi đã va vào tường về các vectơ.

Chế độ xem trò chơi là từ trên xuống trên lưới 2d. Khi người dùng nhấp vào lưới, tàu không gian sẽ bay đến điểm đó.

Vì vậy, nếu tôi có hai bộ điểm:

{ x : 100.2, y : 100.6 }; // the ship
{ x : 20.5,  y : 55.95 }; // the clicked coordinates

Nếu vòng lặp trò chơi tích tắc ở 60 lần lặp mỗi giây và tốc độ tàu mong muốn là 0,05 điểm mỗi tích tắc (3 điểm mỗi giây), làm thế nào để tôi tính toán bộ tọa độ mới cho tàu cho mỗi lần đánh dấu của vòng lặp trò chơi?

ps Tôi không muốn tính đến quán tính hoặc nhiều vectơ ảnh hưởng đến con tàu, tôi chỉ muốn con tàu dừng bất cứ điều gì nó đang làm (tức là bay một chiều) và di chuyển đến tọa độ được nhấp ở tốc độ tĩnh.

Câu trả lời:


8

Trong mã giả:

speed_per_tick = 0.05
delta_x = x_goal - x_current
delta_y = y_goal - y_current
goal_dist = sqrt( (delta_x * delta_x) + (delta_y * delta_y) )
if (dist > speed_per_tick)
{
    ratio = speed_per_tick / goal_dist
    x_move = ratio * delta_x  
    y_move = ratio * delta_y
    new_x_pos = x_move + x_current  
    new_y_pos = y_move + y_current
}
else
{
    new_x_pos = x_goal 
    new_y_pos = y_goal
}

@Tristan: Ý bạn là goal_disttrong iftình trạng của bạn ?
Nate W.

21

LERP - Nội suy tuyến tính

Tôi đã đưa ra câu trả lời này cho một vấn đề tương tự vài ngày trước, nhưng ở đây chúng tôi đi:

Nội suy tuyến tính là một hàm cung cấp cho bạn một số giữa hai số, dựa trên tiến trình. Bạn thực sự có thể, có được một điểm giữa hai điểm.


Công thức tuyệt vời - Cách tính toán

Công thức LERP chung được đưa ra bởi pu = p0 + (p1 - p0) * u. Ở đâu:

  • pu: số kết quả
  • p0: Số ban đầu
  • p1: Số cuối cùng
  • u: Sự tiến bộ. Nó được đưa ra theo tỷ lệ phần trăm, từ 0 đến 1.

Cách lấy phần trăm

Bạn có thể tự hỏi, "Làm thế nào tôi có thể có được tỷ lệ phần trăm này!?". Đừng lo lắng. Nó giống như thế này: Mất bao nhiêu thời gian để di chuyển để bắt đầu vectơ kết thúc? Ok, chia nó cho thời gian đã trôi qua. Điều này sẽ cung cấp cho bạn tỷ lệ phần trăm.

Hãy nhìn xem, một cái gì đó như thế này: percentage = currentTime / finalTime;


Tính toán vectơ

Để có được một vectơ kết quả, tất cả những gì bạn cần làm là áp dụng công thức hai lần, một cho thành phần X và một cho thành phần Y. Một cái gì đó như thế này:

point.x = start.x + (final.x - start.x) * progress;
point.y = start.y + (final.y - start.y) * progress;

Tính thời gian phương sai

Bạn có thể muốn có điểm của mình để di chuyển với tốc độ 0,5 điểm, đúng không? Vì vậy, giả sử, một quãng đường dài hơn sẽ được di chuyển trong một thời gian dài hơn.

Bạn có thể làm như sau:

  • Lấy chiều dài khoảng cách cho nó, bạn sẽ cần hai thứ. Lấy vectơ khoảng cách, sau đó biến đổi nó thành một giá trị độ dài.

    distancevec = final - start;
    distance = distancevec.length();

Tôi hy vọng bạn biết toán học vectơ. Nếu bạn không, bạn có thể tính toán chiều dài vectơ theo công thức này d = sqrt(pow(v.x, 2) + pow(v.y, 2));.

  • Nhận thời gian nó sẽ mất và cập nhật thời gian cuối cùng. Điều này là dễ dàng. Khi bạn muốn mỗi đánh dấu bạn nhận được 0,5 chiều dài, chúng ta chỉ cần chia và nhận được bao nhiêu đánh dấu chúng ta có.

    finalTime = distance / 0.5f;

Làm xong.

THÔNG BÁO: Có thể, đây có thể không phải là tốc độ dự định cho bạn, nhưng đây là quyền. do đó bạn có một chuyển động tuyến tính, ngay cả trên các di chuyển chéo. Nếu bạn muốn làm x + = 0,5f, y + = 0,5f, sau đó đọc sách toán học vectơ và kiểm tra lại kế hoạch của bạn.


Điều gì nếu bạn muốn% trái đến đích từ vị trí của bạn? NẾU bạn không thể sử dụng thời gian delta mà thay vào đó là tọa độ x: y.
Dave

Nếu bạn tính toán progressnhư đã nêu trong câu trả lời này, thì nó sẽ nằm trong 0..1phạm vi. Chỉ cần làm:progressLeft = 1.0 - progress;
Gustavo Maciel

3

Điều này có thể được thực hiện bằng cách tính toán bình thường của hướng và sau đó tính toán vị trí hiện tại thông qua phương trình tham số

newPoint = startPoint + directionVector * velocity * t

Trong đó t là thời gian trôi qua kể từ khi con tàu bắt đầu di chuyển theo hướng mong muốn. Bạn cũng có thể thực hiện điều này trên mỗi bản cập nhật thông qua

newPoint = currentPoint + directionVector * velocity * timeDelta

Và bạn chỉ cần tính toán điều này ở mọi khung hình / vật lý / v.v. cập nhật cho đến khi tàu đến đích.

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.