Xây dựng dữ liệu kề tam giác


9

Đưa ra một danh sách các chỉ số tam giác, chính xác làm thế nào để chuyển đổi nó thành một danh sách các chỉ số có tính phụ thuộc cho một shader hình học?

Lưu ý rằng chúng tôi nghiêm túc nói về các chỉ số ở đây - các đỉnh có mặt, nhưng chúng tôi sẽ chỉ tập trung vào các chỉ số, bởi vì chúng tôi có thể sử dụng chúng để khớp với các đỉnh trùng lặp mà không cần phải so sánh các dấu phẩy động và epsilon - công việc đó có đã được thực hiện.

Tôi biết rằng với bất kỳ tam giác đã cho nào trong danh sách, các chỉ số {0, 1}, {1, 2} và {2, 0} (hoặc {n, n + 1}, {n + 1, n + 2}, { n + 2, n} nếu bạn thích) của nó tạo thành các cạnh; danh sách chỉ số được hình thành tốt và tôn trọng thứ tự quanh co chính xác.

Tôi biết rằng với bất kỳ cạnh nào đã cho, chúng ta có thể tìm kiếm toàn bộ danh sách cho một tam giác khác sử dụng hai trong số các chỉ số đó và chỉ số thứ ba của tam giác đó là chỉ số được sử dụng để hoàn thành tam giác liền kề cho cạnh đó.

Tôi biết rằng trong danh sách kề, mỗi tam giác ban đầu được biểu thị bằng 6 chỉ số, các chỉ số ban đầu đi vào các khe 0, 2, 4; các chỉ số mới để hoàn thành kề kề đi vào các khe 1, 3, 5. Chỉ mục cần hoàn thành cho cạnh {0, 1} đi vào khe 1, chỉ mục cần hoàn thành cho cạnh {1, 2} đi vào khe 3, chỉ mục để hoàn thành cho cạnh {2, 1} đi vào khe 5.

Tôi đã thử những gì?

Tôi đã thử dùng vũ lực, và vâng, nó sẽ hoạt động, nhưng tôi theo một cách tiếp cận thanh lịch hơn.

Tôi đã thử xây dựng danh sách cạnh của Eric Lengyel, nhưng (1) dường như không tôn trọng trật tự tam giác ban đầu, (2) dường như không tôn trọng trật tự quanh co, (3) nó rõ ràng như bùn đi đâu tiếp theo sau khi bạn đã xây dựng danh sách cạnh và (4) Tôi nghi ngờ mã mẫu có lỗi rõ ràng như "tam giác" so với "face Index" - tác giả thậm chí đã biên dịch mã, không bao giờ để ý mã đó xác minh điều đó?

Vì vậy - bất kỳ đề xuất hoặc con trỏ từ đây về?


Xin chào, tôi đã chỉnh sửa nội dung về khối lượng bóng và thay đổi tiêu đề, vì nó có vẻ không phù hợp và có khả năng gây nhầm lẫn - câu hỏi thực sự chỉ là về việc xây dựng dữ liệu kề, mặc dù mục đích cuối cùng của bạn là sử dụng nó cho khối lượng bóng.
Nathan Reed

Câu trả lời:


11

Tôi sẽ thử sử dụng bảng băm cho việc này (ví dụ: std::unordered_mapnếu bạn đang ở C ++). Xây dựng bảng băm ánh xạ từ một nửa cạnh (được biểu thị dưới dạng một cặp chỉ số, theo thứ tự) đến chỉ số thứ ba của tam giác mà nửa cạnh thuộc về.

Điều này có thể được xây dựng bằng cách lặp lại danh sách tam giác và thêm ba nửa cạnh của mỗi tam giác vào bảng băm. Nếu danh sách chỉ mục ban đầu của bạn có một cặp tam giác liền kề, (0, 1, 2, 2, 1, 3), bạn sẽ kết thúc với một bảng băm chứa:

(0, 1) -> 2
(1, 2) -> 0
(2, 0) -> 1
(2, 1) -> 3
(1, 3) -> 2
(3, 2) -> 1

Lưu ý rằng các cạnh (1, 2) và (2, 1) đều xuất hiện trong bảng, đại diện cho hai cạnh của cạnh và chỉ vào đỉnh thứ ba của mỗi trong hai hình tam giác.

Sau đó, để xây dựng dữ liệu kề, tất cả những gì bạn phải làm là lặp lại danh sách tam giác và truy vấn từng cạnh của tam giác với cuộn dây đối diện. Vì vậy, khi xử lý tam giác (0, 1, 2) bạn sẽ truy vấn các cạnh (1, 0), (2, 1) và (0, 2). Điều này sẽ tìm thấy đỉnh đối diện của mỗi cạnh, nếu nó tồn tại.


1
Thật tuyệt, tìm kiếm các cạnh với thứ tự ngược lại là một phần quan trọng của thông tin còn thiếu; làm việc một nhà vô địch; +1 và được chấp nhận.
Maximus Minimus

2

Nhìn vào cấu trúc dữ liệu nửa cạnh .

Ý tưởng đại khái là bạn lưu trữ một danh sách các nửa cạnh , ví dụ như một nửa của một cạnh cụ thể được gắn vào một khuôn mặt cụ thể. Cấu trúc này sau đó cũng lưu trữ thông tin về nửa cạnh tương ứng cho mặt tiếp giáp.

Cấu trúc dữ liệu làm cho các truy vấn về kết nối, kề, v.v. rất hiệu quả. Có các thuật toán để tạo dữ liệu hiệu quả, mặc dù không nhất thiết phải là "thời gian chạy trò chơi" một cách hiệu quả (có thể bạn sẽ muốn thực hiện việc này ngoại tuyến trong đường dẫn tài sản của mình).

Xem thêm những bài viết trên blog . Tôi tin rằng cấu trúc và thuật toán cũng nằm trong Phát hiện va chạm trong thời gian thực, nhưng tôi không nhớ là chắc chắn và không có một bản sao tại văn phòng.


-1, xin lỗi, nhưng điều đó không cung cấp bất kỳ thông tin nào tôi chưa có, và được định hướng xoay quanh việc sử dụng CPU thay vì xây dựng một danh sách với sự phụ thuộc để sử dụng trong GS.
Maximus Minimus
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.