hoạt động boolean trên lưới


15

đưa ra một tập hợp các đỉnh và hình tam giác cho mỗi lưới. Có ai biết về một thuật toán, hoặc một nơi để bắt đầu tìm kiếm (tôi đã thử google trước nhưng không tìm thấy một nơi tốt để bắt đầu) để thực hiện các thao tác boolean trên các lưới đã nói và lấy một đỉnh và tam giác cho lưới kết quả? Quan tâm đặc biệt là phép trừ và liên minh.

Hình ảnh ví dụ: http://www.rhino3d.com/4/help/Commands/Booleans.htm

Câu trả lời:


10

Tôi nghĩ về điều này như Hình học Xây dựng-Rắn (CSG). Hy vọng bạn có thể tìm thấy một số trợ giúp ở đây.

http://www.alsprogrammingresource.com/csg.html

http://createuniverses.blogspot.com/2009/09/qtcsg-constructive-solid-geometry.html

http://www.nigels.com/research/

Cũng tìm kiếm google cho Hình học rắn xây dựng khi bắt đầu.

HTH


+1 - Tôi sẽ đăng các liên kết tương tự, JustBoo - cho đến khi tôi nhận thấy rằng bạn đánh bại tôi với nó! :)
jacmoe

cảm ơn! Thuật ngữ Xây dựng-Solid-Geometry là chính xác những gì tôi cần!
lathomas64

@jacmoe - Điều trớ trêu là tuyệt vời và đầy đủ ngay bây giờ :-) Bạn xứng đáng nhận được tín dụng cho một số trong số đó. Cám ơn.
JustBoo

một vài trong số đó? : PI tin rằng tôi đã ghi lại tất cả chúng ở đó. : D Tuy nhiên, chúng chỉ là những thứ CSG cơ bản. Nó trở nên đẹp hơn từ đó - thậm chí các gói mô hình thương mại lớn cũng không đúng.
jacmoe

3

Tôi nghĩ rằng chúng ta có thể giải đố nếu chúng ta chỉ nghĩ về nó.

Bạn rõ ràng sẽ muốn tạo ra các khuôn mặt (hình tam giác) nơi hai hình học giao nhau. Sau đó, bạn còn lại ba lưới: giao điểm bạn vừa cách ly, hình 1 và hình 2.

Sau đó, chỉ cần xóa những gì bạn không cần!

  • BooleanDifference: xóa phần bị cô lập và hình học 2.
  • BooleanIntersection: xóa hình học 1 và 2, để lại phần bị cô lập
  • BooleanUnion: hợp nhất hình học 1 và 2 và xóa phần bị cô lập (đảm bảo ghép các hình học 1 và 2 lại với nhau thành một hình dạng rắn)
  • BooleanSplit: Tách hình học 1, hình 2 và sao chép phần bị cô lập (gắn một hình với hình 1 và phần kia vào hình 2)

Tôi nghĩ rằng nó bao gồm nó, eh? Phần khó khăn rõ ràng sẽ tạo ra các mặt giao nhau. Đối với điều đó, lặp qua từng mặt của một mặt và kiểm tra xem mặt đó có phải là một phần của mặt kia không; nếu nó hoàn toàn bên trong, thì sao chép khuôn mặt như một phần của lưới giao nhau. Nếu nó nằm một phần bên trong, thì bạn cần chia tam giác dọc theo đường giao nhau; Tôi nghĩ DirectX và OpenGL đều có chức năng trợ giúp cho việc này, hoặc đó chỉ là một số phép toán mặt phẳng 3D (vectơ). Tôi đã học được điều đó trong Giải tích 3 (hoặc là 2?) Nhưng nếu bạn không có manh mối, có thể hỏi tại math.stackexchange.com . Và dĩ nhiên nếu mặt ở ngoài, không làm gì cả. Khi bạn lặp lại trên tất cả các mặt của cả hai mắt lưới, bạn sẽ bị bỏ lại với lưới giao nhau.


2

Nếu bạn đang xử lý các mô hình đa giác, bạn có thể phải xử lý hình học không đa dạng, có nghĩa là câu hỏi "bên trong" là gì và "bên ngoài" không được xác định. Thật khó để thực hiện một thao tác boolean nếu bạn không biết nếu bạn có 0 hay 1.

Bạn cũng phải đối phó với các trường hợp rìa như đa giác đồng phẳng, đa giác giao nhau với các cạnh, các đỉnh nằm trên các cạnh và / hoặc các mặt, và những thứ thuộc về bản chất đó. Không có gì là không thể, bạn chỉ cần một cách rất mạnh mẽ để thể hiện dữ liệu lưới của bạn và một định nghĩa chặt chẽ về những gì bạn mong đợi sẽ xảy ra trong những trường hợp đó.


1

Điều đáng chú ý là hầu hết các hoạt động của bạn có thể được biểu diễn bằng phủ định và kết hợp, trong đó phủ định của một số hình học chỉ là hình học với các quy tắc được lật. Vì vậy, nếu bạn có thể có được liên minh ngay, thì các hoạt động khác chỉ nên làm theo:

  • ngã tư (A, B): =! union (! A ,! B)
  • trừ (A và B): =! union (! A, B)

Sander có một số bài đăng blog khá hay thảo luận về việc triển khai CSG: http://sandervanrossen.blogspot.com/search/label/CSG


1
Tôi sẽ đề cập đến công cụ CSG của riêng tôi, nhưng rõ ràng người khác đã làm: O)
Sander van Rossen

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.