Khi tôi cần một ước tính về độ cong của lưới cho trình tạo bóng da, thuật toán mà tôi đã kết thúc là:
Đầu tiên, tôi tính độ cong vô hướng cho mỗi cạnh trong lưới. Nếu cạnh có các vị trí và quy tắc , thì tôi ước tính độ cong của nó là:n 1 , n 2p1,p2n1,n2
curvature=(n2−n1)⋅(p2−p1)|p2−p1|2
Điều này tính toán sự khác biệt trong quy tắc, được chiếu dọc theo cạnh, như là một phần nhỏ của chiều dài của cạnh. (Xem bên dưới để biết cách tôi đưa ra công thức này.)
Sau đó, với mỗi đỉnh tôi nhìn vào độ cong của tất cả các cạnh chạm vào nó. Trong trường hợp của tôi, tôi chỉ muốn một ước lượng vô hướng về "độ cong trung bình", vì vậy cuối cùng tôi đã lấy giá trị trung bình hình học của các giá trị tuyệt đối của tất cả các độ cong cạnh ở mỗi đỉnh. Đối với trường hợp của bạn, bạn có thể tìm thấy độ cong tối thiểu và tối đa và lấy các cạnh đó làm hướng cong chính (có thể điều chỉnh chúng theo chuẩn với đỉnh bình thường). Điều đó hơi khó khăn, nhưng nó có thể mang lại cho bạn một kết quả đủ tốt cho những gì bạn muốn làm.
Động lực cho công thức này là xem xét những gì xảy ra trong 2D khi áp dụng cho vòng tròn:
Giả sử bạn có một vòng tròn bán kính (vì vậy độ cong của nó là ) và bạn có hai điểm trên vòng tròn, với các quy tắc . Vị trí của các điểm, liên quan đến tâm của vòng tròn, sẽ là và , do thuộc tính mà các quy tắc của hình tròn hoặc hình cầu luôn hướng thẳng ra từ tâm của nó.1 / r n 1 , n 2 p 1 = r n 1 p 2 = r n 2r1/rn1,n2p1=rn1p2=rn2
Do đó, bạn có thể khôi phục bán kính làhoặc. Nhưng nói chung, các vị trí đỉnh sẽ không liên quan đến tâm của vòng tròn. Chúng ta có thể giải quyết vấn đề này bằng cách trừ hai:
| p 2 | / | n 2 | p 2 - p 1r=|p1|/|n1||p2|/|n2|
p2−p1rcurvature=1r=rn2−rn1=r(n2−n1)=|p2−p1||n2−n1|=|n2−n1||p2−p1|
Kết quả là chính xác chỉ cho các vòng tròn và hình cầu. Tuy nhiên, chúng ta có thể mở rộng nó để làm cho nó trở nên "khoan dung" hơn một chút và sử dụng nó trên các lưới 3D tùy ý và có vẻ như nó hoạt động khá tốt. Chúng ta có thể làm cho công thức trở nên "khoan dung" hơn bằng cách chiếu vectơ đầu tiên lên hướng của cạnh, . Điều này cho phép hai vectơ này không song song chính xác (vì chúng nằm trong trường hợp vòng tròn); chúng tôi sẽ chỉ chiếu bất kỳ thành phần nào không song song. Chúng ta có thể làm điều này bằng cách chấm với vectơ cạnh đã chuẩn hóa:
p 2 - p 1 độ congn2−n1p2−p1
curvature=(n2−n1)⋅normalize(p2−p1)|p2−p1|=(n2−n1)⋅(p2−p1)/|p2−p1||p2−p1|=(n2−n1)⋅(p2−p1)|p2−p1|2
Et voilà, có công thức xuất hiện ở đầu câu trả lời này. Nhân tiện, một lợi ích phụ của việc sử dụng phép chiếu đã ký (sản phẩm chấm) là công thức sau đó mang lại độ cong đã ký: dương cho lồi và âm cho các bề mặt lõm.
Một cách tiếp cận khác mà tôi có thể tưởng tượng bằng cách sử dụng, nhưng chưa thử, sẽ là ước tính dạng cơ bản thứ hai của bề mặt ở mỗi đỉnh. Điều này có thể được thực hiện bằng cách thiết lập một cơ sở tiếp tuyến ở đỉnh, sau đó chuyển đổi tất cả các đỉnh lân cận vào không gian tiếp tuyến đó và sử dụng bình phương nhỏ nhất để tìm ma trận 2FF phù hợp nhất. Sau đó, các hướng cong chính sẽ là các hàm riêng của ma trận đó. Điều này có vẻ thú vị vì nó có thể cho phép bạn tìm các hướng cong "ngụ ý" bởi các đỉnh lân cận mà không có bất kỳ cạnh nào chỉ rõ ràng theo các hướng đó, nhưng mặt khác là nhiều mã hơn, tính toán nhiều hơn và có lẽ ít mạnh mẽ hơn về số lượng.
Một bài báo thực hiện phương pháp này là Rusinkiewicz, "Ước tính độ cong và đạo hàm của chúng trên các lưới tam giác" . Nó hoạt động bằng cách ước tính ma trận 2FF phù hợp nhất cho mỗi tam giác, sau đó lấy trung bình các ma trận trên mỗi đỉnh (tương tự như cách tính toán thông thường trơn tru).