Ai đó có thể giải thích đường viền kép?


9

Tôi đã cố gắng để hiểu kết xuất voxel và đã xem xét đường viền kép (DC).

Cho đến nay tôi hiểu điều này nhiều:

  1. Chạy hàm mật độ cho một tập hợp các điểm lưới (tức là hàm nhiễu)
  2. Tìm các cạnh trong gird chứa các thay đổi giữa các điểm cuối
  3. Từ các cạnh này tạo ra các điểm giao nhau (tức là vectơ)

Bây giờ đây là nơi tôi bị mắc kẹt, tiếp theo sẽ là tạo ra các quy tắc, nhưng bằng cách nào? Khi nhìn vào chủ đề này, hình ảnh này thường mọc lên.

                                                   Một lưới đã ký với các cạnh được gắn thẻ bởi dữ liệu Hermite

Thực hiện nghiên cứu chỉ ra rằng các quy tắc sẽ được tạo ra từ một mặt phẳng. Là chính xác để nghĩ rằng tôi đi từ tiếng ồn đến isosurface để bình thường? Nếu vậy làm thế nào tôi sẽ hoàn thành từng bước?

Theo hiểu biết của tôi, bước tiếp theo sẽ là sau đây từ bài báo DC ;

Đối với mỗi cạnh thể hiện sự thay đổi dấu hiệu, tạo ra một hình tứ giác nối các đỉnh thu nhỏ của bốn hình khối chứa cạnh đó.

Là trích dẫn này được đại diện bởi hình ảnh trên?

Cuối cùng, bước tiếp theo sẽ là chạy QEF với các điểm và quy tắc giao nhau và điều này sẽ tạo ra dữ liệu đỉnh của tôi. Điều này có đúng không?


Theo tôi hiểu quá trình này, nó giống như ... tiếng ồn> đám mây điểm> bề mặt iso> quy tắc ... nhưng tôi không đủ thông minh để khẳng định tôi có thể giải thích quy trình này một cách chính xác vì vậy tôi sẽ không thử trả lời.
Chiến tranh

Câu trả lời:


3

Các quy tắc sẽ được tạo ra dựa trên độ dốc của hàm mật độ đồng thời bạn có được các điểm giao nhau giữa các cạnh và bề mặt. Nếu đó là một cái gì đó đơn giản và dạng đóng như hình cầu thì bạn có thể tính toán các quy tắc một cách phân tích, nhưng với tiếng ồn, bạn sẽ cần phải lấy mẫu.

Bạn có các bước tiếp theo theo thứ tự sai. Đầu tiên, bạn tạo một đỉnh cho mỗi ô thể hiện sự thay đổi dấu hiệu. QEF bạn đang thu nhỏ chỉ đơn giản là tổng khoảng cách đến mỗi mặt phẳng được xác định bởi điểm giao nhau / cặp bình thường cho ô đó. Sau đó, bạn đi qua các cạnh thể hiện các thay đổi dấu hiệu và tạo ra một hình tứ giác bằng cách sử dụng bốn đỉnh liền kề (được đảm bảo đã được tạo trong bước cuối cùng).

Bây giờ, trở ngại lớn nhất của tôi trong việc thực hiện điều này là giải quyết QEF. Tôi thực sự đã đưa ra một giải pháp lặp đơn giản sẽ chạy tốt trên (ví dụ) một GPU song song. Về cơ bản, bạn bắt đầu đỉnh ở trung tâm của tế bào. Sau đó, bạn lấy trung bình tất cả các vectơ được lấy từ đỉnh đến mỗi mặt phẳng và di chuyển đỉnh dọc theo kết quả đó và lặp lại bước này một số lần cố định. Tôi thấy việc di chuyển nó ~ 70% dọc theo kết quả sẽ ổn định với số lần lặp ít nhất.


Vì vậy, giả sử tôi có một ô / voxel mà tôi biết có biểu hiện thay đổi dấu hiệu (ví dụ như trường hợp như MC), tôi đã chạy một hàm tiếng ồn cho mỗi 8 góc của ô để tìm mật độ của nó. Điều tôi gặp khó khăn trong việc hiểu là từ đây làm cách nào để tìm các biến x , np của QEF?
Xà phòng

x là vị trí đỉnh. Đối với mỗi điểm giao nhau, bạn có p (vị trí) và n (bình thường), tạo nên các mặt phẳng mà tôi đang nói đến.
jmegaffin

p được tìm thấy bằng cách tìm nơi trung bình trọng số của hai mật độ dọc theo cạnh bằng không. Sau đó, bạn tính n bằng cách lấy độ dốc của hàm mật độ của bạn tại p .
jmegaffin

Vì vậy, về cơ bản cho mỗi khối lập phương tôi tính toán pn cho mỗi 12 cạnh, và sau đó chạy QEF cho mỗi tế bào cạnh pn vào x , mà trong ví dụ của bạn là trung tâm của một voxel / di động để bắt đầu với? Sau đó, nếu bốn ô chia sẻ cùng một cạnh, tôi tạo ra một quad kết nối mỗi bốn ô x ? Và là kết quả quad của dữ liệu đa giác của tôi?
Xà phòng

Không phải mọi cạnh sẽ có một giao điểm, vì vậy bạn không nhất thiết phải giải QEF cho 12 mặt phẳng. Khác hơn là bạn đã có nó!
jmegaffin

1

Từ việc đọc bài báo đến trang 2, có vẻ như các khối lượng được lưu trữ ở các góc của lưới thay vì trọng lượng của khối lập phương như các thuật toán kiểu Marching Cubes bình thường ưa thích. Các trọng số góc này xác định một điểm nằm dọc theo cạnh giữa 2 góc trong đó có sự thay đổi dấu hiệu từ góc này sang góc khác. Các cạnh có thay đổi dấu hiệu cũng lưu trữ bình thường cho cạnh là đường thẳng góc trong biểu diễn 2D của bạn trong OP. Thông tin bình thường đó được xác định trong quá trình tạo âm lượng (bằng bất kỳ công cụ chỉnh sửa hoặc phương pháp tạo khối thủ tục nào đang được sử dụng), không phải sau khi isosurface được tạo như mong đợi của thuật toán kiểu Marching Cubes. Dữ liệu bình thường này "tuyên bố" rằng đường / bề mặt đi qua điểm phải có giá trị bình thường được xác định trước. Trong trường hợp Marching Cubes sẽ uốn cong đường thẳng tại điểm đó để ghép với một điểm khác trên cạnh liền kề, Extended Marching Cubes và Dual Contouring đều mở rộng đường / bề mặt ra ngoài cho đến khi nó giao với đường / bề mặt đi qua điểm trên cạnh liền kề có giá trị bình thường khác nhau. Điều này cho phép tạo ra các góc nhọn từ dữ liệu âm lượng trong đó các thuật toán Marching Cubes cơ bản sẽ làm tròn bề mặt. Tôi không hiểu lắm về cách QEF (các hàm lỗi bậc hai) xử lý vấn đề này ngoại trừ việc có vẻ như chúng giúp tính toán điểm mở rộng trong khối lập phương nơi đặt một góc sẽ dễ dàng hơn. Cả Marching Cubes và Dual Contouring đều mở rộng đường / bề mặt ra ngoài cho đến khi nó giao với đường / bề mặt đi qua điểm trên cạnh liền kề có giá trị bình thường khác. Điều này cho phép tạo ra các góc nhọn từ dữ liệu âm lượng trong đó các thuật toán Marching Cubes cơ bản sẽ làm tròn bề mặt. Tôi không hiểu lắm về cách QEF (các hàm lỗi bậc hai) xử lý vấn đề này ngoại trừ việc có vẻ như chúng giúp tính toán điểm mở rộng trong khối lập phương nơi đặt một góc sẽ dễ dàng hơn. Cả Marching Cubes và Dual Contouring đều mở rộng đường / bề mặt ra ngoài cho đến khi nó giao với đường / bề mặt đi qua điểm trên cạnh liền kề có giá trị bình thường khác. Điều này cho phép tạo ra các góc nhọn từ dữ liệu âm lượng trong đó các thuật toán Marching Cubes cơ bản sẽ làm tròn bề mặt. Tôi không hiểu lắm về cách QEF (các hàm lỗi bậc hai) xử lý vấn đề này ngoại trừ việc có vẻ như chúng giúp tính toán điểm mở rộng trong khối lập phương nơi đặt một góc sẽ dễ dàng hơn.

Lưu ý rằng tôi đã nói về các đường và cạnh ở đây theo nghĩa 2D như được mô tả bởi đại diện trong OP .. Tôi sẽ phải đọc thêm và suy nghĩ để mở rộng điều này sang 3D để tạo lưới thể tích.

Để giải quyết nửa sau câu hỏi của bạn về cách tạo ra các quy tắc và suy nghĩ theo quan điểm thủ tục điều khiển tiếng ồn, có vẻ như bạn sẽ lấp đầy âm lượng của mình bằng dữ liệu nhiễu sau đó tìm các cạnh có thay đổi dấu hiệu, sau đó kiểm tra 4 hình khối chia sẻ cạnh để tìm ra nơi sẽ tạo ra các tam giác, và tính toán đỉnh bình thường như bạn cho bất kỳ giao điểm nào khác của nhiều tam giác, lấy trung bình của các quy tắc cho mỗi tam giác có chung đỉnh. Điều này rất suy đoán về phần tôi vì bài báo chủ yếu đề cập đến các hoạt động CSG và khối lượng được tạo ra từ các lưới chuyển đổi quét, cả hai đều có các quy tắc được xác định rõ trên các bề mặt.

Tôi hy vọng ít nhất phần 1 của câu trả lời này giải quyết sự khác biệt về cách dữ liệu trọng lượng được biểu diễn và sử dụng theo cách hoàn toàn khác với Marching Cubes cơ bản và tại sao dữ liệu bình thường phải được tạo ra khá sớm trong quá trình tạo khối, trong đó với các quy tắc khối diễu hành cơ bản thường được tạo ra như là giai đoạn cuối cùng trong quy trình tạo lưới.

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.