Làm thế nào tôi có thể tìm thấy tiếp tuyến và bình thường tại một điểm được nội suy trên một spline Catmull-Rom / Hermite?


9

Tôi có một triển khai một spline Catmull-Rom đơn giản . Nó hoạt động, nhưng tôi đang cố gắng hết sức để có thể đặt các đỉnh tại các điểm đùn dọc theo đường cong. Đối với điều này, tôi cần bình thường (và tiếp tuyến trong quá trình) để có thể tìm thấy các vị trí chính xác ngoài đường cong. Tôi không thể tìm thấy bất kỳ thông tin nào ở bất cứ đâu, ít nhất là không có gì tôi có thể hiểu, về cách tính nhanh tiếp tuyến cho một giá trị t cho trước trên đường cong. Tôi đã cố gắng tự làm đạo hàm nhưng tôi nhanh chóng nhận ra mình không biết mình đang làm gì.

Làm cách nào tôi có thể tìm đạo hàm / tiếp tuyến / bình thường cho một điểm tại giá trị trên spline Catmull-Rom?

Nói rõ hơn, đây là một bức tranh cực kỳ khó hiểu về những gì tôi cần.

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

Tôi cần lấy mẫu một điểm tại một vị trí dọc theo đường cong và tìm một vectơ trực giao, được biểu thị ở đây bằng các đường màu xanh. Cuối dòng màu xanh tôi sẽ đặt các đỉnh. Tôi đã thực hiện công việc này rồi nhưng nó là một đường cong đẹp hơn.

Câu trả lời:


7

OK, tôi tiếp tục nghịch ngợm với nó và tôi đã đi trước và chỉ cố gắng làm toán.

Đây là phương trình tôi đang sử dụng cho phép nội suy giữa hai điểm:

(2t³ - 3t² + 1) * p0 + (t³ - 2t² + t) * m0 + (-2t³ + 3t²) * p1 + (t³ - t²) * m1

p0 và p1 là các điểm kiểm soát và m0 và m1 là các tiếp tuyến tương ứng của chúng được tính ở nơi khác.

Trước đây tôi đã nói rằng tôi không biết tôi đang làm gì với toán học, nhưng đó chỉ là do con đường phái sinh cảm thấy quá dễ dàng , vì vậy tôi nghĩ rằng tôi phải làm gì đó sai. Tôi đã đi trước và thử nó và thực hiện nó bằng mọi cách. Đây là công thức cho kết quả:

p '(t) = (6t² - 6t) p0 + (3t² - 4t + 1) m0 + (-6t² + 6t) p1 + (3t² - 2t) m1

Và bạn sẽ không biết nó hoạt động! Sử dụng điều này sẽ cung cấp cho bạn vectơ tiếp tuyến tại bất kỳ giá trị t nội suy nào trên đường cong.

Từ đây việc chuyển đổi sang bình thường rất đơn giản. Trong trường hợp của tôi, tôi ở chế độ 3D và tôi không cần bất kỳ phép quay đặc biệt nào, vì vậy tôi chỉ cần thực hiện Vector3.Cross(Vector3.up, tangent)và điều đó đưa ra một vectơ theo hướng trực giao với đường cong trên mặt phẳng x / z (trong Unity).

Đây là một hình ảnh để cho thấy những gì tôi đã cố gắng để đạt được.

Bạn có thể tìm thấy một số mã nguồn thô sơ ở đây .

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


Tôi nhận thấy một downvote ở đây vì vậy nếu có bất kỳ lỗi nào xin vui lòng chỉ ra và tôi sẽ sửa nó.
ssb

1
Làm thế nào bạn tính m0 và m1 cho số điểm ngẫu nhiên?
Virgiliu

Không bao giờ, tôi tìm thấy tài khoản github của bạn và đọc mã của bạn. Công việc tuyệt vời: D
Virgiliu

1
Trong tương lai, bạn có thể ước tính độ dài của toàn bộ đường cong piecewise để bạn có thể thực hiện các bước tương đương (xem cách bên phải dường như có nhiều mẫu hơn bên trái). Giống như ở đây: stackoverflow.com/questions/29438398/
Kẻ
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.