Xác định độ dài cung của một spline Catmull-Rom để di chuyển với tốc độ không đổi


18

Tôi có một đường dẫn được xác định bằng cách ghép các spline Catmull-Rom. Tôi sử dụng phương thức tĩnh Vector2.CatmullRom trong XNA cho phép nội suy giữa các điểm có giá trị từ 0 đến 1.

Không phải mọi spline trong đường dẫn này có cùng độ dài. Điều này gây ra sự khác biệt về tốc độ nếu tôi để trọng lượng đi với tốc độ không đổi cho mỗi spline trong khi tiếp tục đi dọc theo đường dẫn. Tôi có thể khắc phục điều này bằng cách để tốc độ của trọng lượng phụ thuộc vào chiều dài của spline. Làm thế nào tôi có thể xác định chiều dài của một spline như vậy? Tôi có nên chỉ xấp xỉ bằng cách cắt spline thành 10 đường thẳng và tính tổng độ dài của chúng?

Tôi đang sử dụng điều này để ánh xạ kết cấu động trên một lưới được tạo được xác định bởi các spline.

Câu trả lời:


25

Có vẻ như bạn muốn giữ tốc độ của đối tượng ở một giá trị không đổi trên toàn bộ đường cong - biết độ dài cung sẽ không giúp bạn làm điều này. Nó sẽ giúp bạn tính toán thời điểm đối tượng sẽ đạt đến điểm cuối của nó nếu nó đang ở tốc độ đó, vì vậy nó sẽ tốt hơn những gì bạn có bây giờ (đối tượng sẽ có cùng tốc độ trung bình giữa tất cả các điểm), nhưng tốc độ thực tế của vật thể vẫn sẽ thay đổi khi nó di chuyển xung quanh đường cong.

Một giải pháp tốt hơn là thay đổi tham số tham số của chúng tôi (tham số đi từ 0 thành 1, tôi sẽ gọi sđể tránh nhầm lẫn t = time) với tốc độ thay đổi ds/dt, được xác định bởi tốc độ bạn muốn đối tượng di chuyển ở tốc độ nào điểm đó trên đường cong. Vì vậy, nói cách khác, thay vì thay đổi s0,01 mỗi khung hình, chúng ta có thể thay đổi nó bằng 0,005 một khung hình, 0,02 khung hình tiếp theo, v.v.

Chúng tôi thực hiện điều này bằng cách tính các đạo hàm của x( dx/ds) và y( dy/ds) mỗi khung, sau đó đặt

ds / dt = speed / sqrt ((dx / ds) 2 + (dy / ds) 2 )

Đó là, bằng cách lấy tốc độ chúng ta muốn đi và chia cho tốc độ chúng ta thực sự sẽ đi nếu chúng ta thay đổi sở một mức tăng cố định.


Bằng chứng

Chúng tôi muốn tốc độ của đối tượng của chúng tôi là không đổi; Hãy đặt tên đó không đổi speed.

Chúng ta học trong phép tính năm thứ hai rằng, đối với các phương trình tham số x(s)y(s),

tốc độ = sqrt ((dx / dt) 2 + (dy / dt) 2 )

Chúng tôi cũng học được rằng

dx / dt = dx / ds * ds / dt     (quy tắc chuỗi)

Như vậy

speed = sqrt ((dx / ds) 2 (ds / dt) 2 + (dy / ds) 2 (ds / dt) 2 )

Giải cho ds/dt, chúng ta có được phương trình đã nêu.


Tính đạo hàm

Tôi chưa bao giờ làm việc với các spline cụ thể đó, nhưng tôi hiểu họ chỉ đưa ra x(s)y(s)về phương trình bậc ba s. Vì vậy, chúng ta có thể tìm thấy đạo hàm dx/dsmột cách dễ dàng: nếu

x (s) = a * s 3 + b * s 2 + c * s + e

sau đó

dx / DS = 3a * s 2 + 2b * s + c

(Tương tự cho dy/ds) Tất nhiên, bạn sẽ cần phải biết các giá trị chính xác của a, bcđể làm điều này. Theo trang này , những giá trị rất dễ tìm.


Cuối cùng, để trả lời câu hỏi trong tiêu đề: tìm phương trình độ dài cung của hàm tham số liên quan đến việc giải một tích phân xác định khá phức tạp ; ngay cả đối với trường hợp đơn giản của phương trình bậc ba, điều này thường không thể thực hiện được.

Do đó, bạn sẽ phải ước tính số nguyên . "Cắt spline thành 10 đường thẳng và tính tổng độ dài của chúng" như bạn đề xuất là một cách rất đơn giản để làm điều này ; tuy nhiên, có các phương pháp phức tạp hơn một chút sẽ cho bạn kết quả chính xác hơn nhiều bằng cách sử dụng ít phân đoạn dòng hơ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.