TL; DR Bạn cần triển khai các thao tác boolean bằng cây BSP.
Chà, có vẻ như chúng ta đang nói về Hình học rắn xây dựng ở đây. Tôi đã triển khai CSG ở cấp độ thương mại để tôi biết một vài điều về nó.
Bài báo kinh điển về CSG có tên là Hợp nhất các cây hoạt động của cây đa năng Yields , thành thật mà nói, quá nhiều để giải thích ở đây, nhưng nói ngắn gọn thuật toán xử lý các đa giác nằm trên cùng một mặt phẳng như phân vùng không gian nhị phân, về cơ bản là xây dựng một cây BSP từ mỗi lưới đa giác. Bước thứ hai là hợp nhất các cây BSP đó; bạn chỉ cần lấy một cây và chèn nó vào cây kia. Thuật toán sau đó tiến hành giải thích làm thế nào để đối phó với từng nút lá để phân chia và trừ các nút, các nút không cần thiết trong hình dạng cuối cùng sẽ bị loại bỏ, các nút khác sẽ được cung cấp cho cha mẹ thích hợp.
Nhưng chờ đã! Bài báo đó về cơ bản là nói về các lưới đa giác và các mặt phẳng 3D, KHÔNG?
Thuật toán có thể được khái quát thành bất kỳ chiều nào, vì vậy trong trường hợp 2D của bạn, thật dễ dàng sử dụng các phân đoạn dòng thay vì mặt phẳng như các phân vùng nhị phân. Vì vậy, mỗi đa giác sẽ được chuyển đổi thành cây BSP hơn hai cây sẽ được hợp nhất. Cuối cùng, bạn đi qua cây kết quả để tạo đa giác cuối cùng,
Lưu ý rằng thuật toán này và CSG nói chung không liên quan trực tiếp đến kết xuất và mặt lưới và không thực sự hiển thị sẵn sàng, vì vậy bạn cần trích xuất các mặt của các cây BSP cuối cùng. Tôi cũng tìm thấy tia truy tìm một cách tiếp cận dễ dàng hơn để hiển thị kết quả CSG, bạn chỉ cần các tia đi ngang qua cây thay vì trích xuất và thực sự tách các mặt (hãy nhớ rằng chúng ta chỉ xử lý các phân vùng nhị phân).
Về độ mạnh của số. Thật tốt khi lưu ý rằng có hai loại tính toán hình học,
- Những người dựa trên xây dựng, bạn xây dựng một hình dạng dựa trên kết quả của một hoạt động trước đó. Ví dụ
y = sqrt(x)
và sau đó sử dụng y
trong một hoạt động mới. Đây được gọi là xây dựng; vấn đề là lỗi số sẽ tích lũy nhanh chóng.
- Ngoài ra, có các hoạt động sử dụng các vị từ thay vào đó, về cơ bản thay vì sử dụng xây dựng, bạn chỉ cần hỏi liệu một điều kiện có đúng / sai và sử dụng cùng một giá trị trong các hoạt động khác nhau. Các xét nghiệm cổ điển bao gồm bao vây và thử nghiệm định hướng; điều này cũng nghi ngờ với các lỗi số đặc biệt là nếu bạn sử dụng độ chính xác đơn hoặc kép nhưng thường sẽ cho kết quả tốt hơn nhiều. các giải pháp khác thay đổi về tốc độ và độ chính xác tồn tại. Dưới đây là một trong những bài báo gần đây tránh xây dựng bằng cách sử dụng hình học dựa trên mặt phẳng để cho kết quả chính xác. Tôi cũng sẽ trích dẫn từ bài báo:
Khái niệm biểu diễn trên mặt phẳng của các lưới đa giác được mô tả đầu tiên bởi Sugihara và Iri [SI89]. Kiểu biểu diễn này cung cấp một lợi thế quan trọng khi thực hiện các nhiệm vụ liên quan đến việc thay đổi cấu trúc liên kết của vật rắn được biểu thị bằng các mắt lưới như đánh giá biểu thức Boolean: không có thông tin hình học sơ cấp mới nào được tạo ra để thu được khối đa diện kết quả
Và cuối cùng tôi muốn thêm vào, nếu bạn muốn bắt đầu triển khai CSG BSP của mình, tôi khuyên bạn nên bắt đầu trên BSP Faqs .