Cách đơn giản nhất để tính độ cong chính cho tam giác lưới là gì?


19

Tôi có một lưới và trong khu vực xung quanh mỗi tam giác, tôi muốn tính toán ước tính các hướng cong chính. Tôi chưa bao giờ làm điều này trước đây và Wikipedia không giúp được gì nhiều. Bạn có thể mô tả hoặc chỉ cho tôi một thuật toán đơn giản có thể giúp tôi tính toán ước tính này không?

Giả sử rằng tôi biết vị trí và quy tắc của tất cả các đỉnh.

Câu trả lời:


24

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=(n2n1)(p2p1)|p2p1|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:

công thức độ cong áp dụng cho hai điểm trên một 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|

p2p1=rn2rn1=r(n2n1)r=|p2p1||n2n1|curvature=1r=|n2n1||p2p1|

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 độ congn2n1p2p1

curvature=(n2n1)normalize(p2p1)|p2p1|=(n2n1)(p2p1)/|p2p1||p2p1|=(n2n1)(p2p1)|p2p1|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).


1
FYI nếu vấn đề đó, tôi đã sử dụng câu trả lời của bạn ở đây blender.stackexchange.com/questions/146819/ nhưng nhưng thêm trọng số bằng cách sử dụng góc xung quanh p1. Không biết bạn có thấy giá trị không? Dù sao hãy bình luận. Cảm ơn.
chanh

19

Chỉ cần thêm một cách khác vào câu trả lời xuất sắc @NathanReed, bạn có thể sử dụng độ cong trung bình và gaussian có thể thu được bằng Laplace-Beltrami rời rạc.

vi

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

A(vi)13vj

f(vi)

ΔSf(vi)=12A(vi)vjN1(vi)(cotαij+cotβij)(f(vj)f(vi))

vjN1(vi)vi

v

H=12||ΔSv||

θj

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

Độ cong Gaussian là:

K=(2πjθj)/A

Sau tất cả những nỗi đau này, các đường cong rời rạc chính được đưa ra bởi:

k1=H+H2K  and  k2=HH2K

Nếu bạn quan tâm đến chủ đề (và để thêm một số tài liệu tham khảo cho bài đăng này) thì một bài đọc tuyệt vời là: Các toán tử hình học vi phân rời rạc cho tam giác 2-Manifold [Meyer et al. 2003].

Đối với những hình ảnh tôi cảm ơn cựu giáo sư Niloy Mitra của tôi khi tôi tìm thấy chúng trong một số ghi chú tôi đã dành cho bài giảng của mình.


Cả hai câu trả lời đều rất hay, thật khó để tôi chọn. Vì tôi đã hỏi về cách đơn giản nhất, tôi nghĩ rằng Nathan lấy bánh.
ap_

2
K=(πjθj)/Amixed

@teodron Bạn có thể có bất kỳ hiểu biết nào về độ cong trung bình cho các đỉnh biên giới không? Một điều như vậy có thể được định nghĩa?
Hồi giáo

vi

-1

@ Nathan-Reed: Chỉ là một câu hỏi cho câu trả lời của Nathan-Reed: tại sao bạn sử dụng ý nghĩa hình học? Đó có phải là vì nó được "mô hình hóa" theo độ cong Gaussian?


3
Nếu bạn có một câu hỏi mới, vui lòng hỏi nó bằng cách nhấp vào nút Đặt câu hỏi . Bao gồm một liên kết đến câu hỏi này nếu nó giúp cung cấp bối cảnh. - Từ đánh giá
Dragonseel
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.