Làm thế nào để tôi nội suy tuyến tính giữa hai vectơ?


16

Tôi có một vectơ vận tốc nơi khách hàng của tôi đang ở và nơi nó đi, và tôi có cùng một vectơ xuất phát từ máy chủ cho biết khách hàng nên ở đâu. Đôi khi nó hơi khác một chút, vì vậy tôi muốn nội suy giữa vị trí hiện tại của tôi với vị trí chính xác của máy chủ.

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

Mũi tên màu đen là vectơ vận tốc của máy khách, mũi tên màu đỏ là vectơ vận tốc của máy khách trên máy chủ và mũi tên màu xanh là cái mà tôi muốn tính toán và nội suy.

Làm thế nào để tôi tính toán các vectơ màu xanh? Sau đó, làm thế nào tôi có thể nội suy tuyến tính giữa chúng?

Câu trả lời:


18

Vectơ màu xanh có thể được tính toán dễ dàng: đỏ - đen (dấu hiệu giữa các vectơ là âm). Nhưng nếu bạn chỉ muốn nội suy giữa vectơ đen và đỏ, bạn không phải tính toán nó. Nội suy tuyến tính chỉ là sự kết hợp tuyến tính. Vì vậy, bạn chỉ có thể lấy: alpha * black + (1 - alpha) * đỏ, trong đó alpha phải nằm trong khoảng <0,1>. Nếu alpha sẽ là 1, thì bạn sẽ nhận được vector đen, khi alpha bằng 0, bạn sẽ nhận được vector đỏ.

Và nếu tôi hiểu đúng, bạn sẽ nội suy giữa các vectơ này theo thời gian. Vì vậy, chỉ cần chọn đúng gia tăng của alpha trong thời gian.

Tôi đã hiểu bạn phải không? Hay bạn có nghĩa là một cái gì đó hoàn toàn khác nhau?


Vâng, bạn đã cho tôi đúng. Chỉ một câu hỏi nữa, làm thế nào để tôi nhân số cho vectơ? Hoạt động đó sẽ trả lại cho tôi một vector mới? Chẳng hạn, màu đỏ là một vectơ (0, 10) có độ dài 8 và màu đen là (-2, 5) với chiều dài 4. Làm thế nào để tôi làm alpha * đen hoặc (1 - alpha) * đỏ? Cảm ơn bạn.
gmemario

Bạn chỉ cần nhân mỗi tọa độ vector riêng biệt. Nếu alpha là ví dụ 0,5, thì alpha * black + (1 - alpha) * red = (0,5) + (-1, 2.5) = (-1, 7.5) - nếu bạn sẽ vẽ nó lên một số giấy, bạn sẽ thấy nó thực sự chính xác giữa hai vectơ đó.
zacharmarz

9

Chụp ảnh này:

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

AB là vectơ đỏ từ A đến B.

Nói P là 25% từ A đến B. Cách cơ bản để đến P từ gốc là

A + ( B - A ) / 4
= 3/4 A   +   B / 4

Vậy 3/4 A và 1/4 B.

Một cách khác để tìm ra rằng bạn muốn một vectơ 75% "gần" với A và 25% "gần" với B. (Một vectơ "gần" 100% với A chỉ là vectơ A.)

Vì vậy, bạn cũng có thể tìm thấy P là:

A*t + (1-t)*B

Với t = 0,75 (có nghĩa là "đóng" 75% với A)

0.75A + 0.25B

Vì vậy, một hàm LERP đơn giản trong C cho lớp Vector3f sẽ là:

static Vector3f lerp( const Vector3f& A, const Vector3f& B, float t ){
  return A*t + B*(1.f-t) ;
}
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.