Có thể tính gần đúng một giải pháp cho vấn đề này đối với hầu hết các quỹ đạo tham số. Ý tưởng là như sau: nếu bạn phóng to đủ sâu trên một đường cong, bạn không thể nói chính đường cong đó từ tiếp tuyến của nó tại điểm đó.
Bằng cách đưa ra giả định này, không cần phải tính toán trước bất kỳ thứ gì ngoài hai vectơ (ba cho các đường cong Bezier hình khối, v.v. ).
Vì vậy, đối với đường cong chúng ta tính toán vectơ tiếp tuyến của nó tại điểm . Định mức của vectơ này là và do đó, quãng đường di chuyển trong một khoảng thời gian có thể xấp xỉ là . Theo sau đó, một quãng đường được di chuyển trong một khoảng thời gian .M( t )dMdtt∥ dMdT∥Δ t∥ dMdT∥ delta tLL ÷ ∥ dMdT∥
Ứng dụng: đường cong Bezier bậc hai
Nếu các điểm kiểm soát của đường cong Bezier là , và , quỹ đạo có thể được biểu thị là:MộtBC
M( t )= ( 1 - t )2A + 2 t ( 1 - t ) B + t2C= t2( A - 2 B + C) + t ( - 2 A + 2 B ) + A
Vậy đạo hàm là:
dMdt= t ( 2 A - 4 B + 2 C) + ( - 2 A + 2 B )
Bạn chỉ cần lưu trữ vectơ và ở đâu đó. Sau đó, với một cho trước , nếu bạn muốn tăng chiều dài , bạn làm:v⃗ 1= 2 A - 4 B + 2 Cv⃗ 2= - 2 A + 2 BtL
t = t + Ll e n gt h ( t ⋅ v⃗ 1+ v⃗ 2)
Đường cong hình khối Bezier
Lý do tương tự áp dụng cho một đường cong có bốn điểm kiểm soát , , và :MộtBCD
M( t )= ( 1 - t )3A + 3 t ( 1 - t )2B + 3 t2( 1 - t)C+t3D= =t3( - A + 3 B -3C+ D ) +t2( 3 A - 6 B +3C)+t(−3A+3B)+A
Đạo hàm là:
dMdt= t2( - 3 A + 9 B - 9C+ 3 D ) + t ( 6 A - 12 B + 6 C) + ( - 3 A + 3 B )
Chúng tôi tính toán trước ba vectơ:
v⃗ 1v⃗ 2v⃗ 3= - 3 A + 9 B - 9 C+ 3 D= 6 A - 12 B + 6 C= - 3 A + 3 B
và công thức cuối cùng là:
t = t + Ll e n gt h ( t2⋅ v⃗ 1+ t ⋅ v⃗ 2+ v⃗ 3)
Vấn đề chính xác
Nếu bạn đang chạy ở tốc độ khung hình hợp lý, (cần được tính theo thời lượng khung hình) sẽ đủ nhỏ để phép tính gần đúng hoạt động.L
Tuy nhiên, bạn có thể gặp sự không chính xác trong trường hợp cực đoan. Nếu quá lớn, bạn có thể thực hiện phép tính toán, ví dụ như sử dụng 10 phần:L
for (int i = 0; i < 10; i++)
t = t + (L / 10) / length(t * v1 + v2);