Sắp xếp đa giác theo thứ tự - không hoạt động?


7

Tôi còn khá mới để lập trình trong thế giới 3d.

Tôi đang cố gắng tạo ra một bức tranh trong đó tất cả các đối tượng được vẽ theo thứ tự từ xa nhất đến gần nhất và từ dưới lên trên - để chúng không chồng chéo lẫn nhau, nhưng có vấn đề.

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

Như bạn có thể thấy, một số đối tượng đang chồng chéo lẫn nhau. Không có đối tượng nào trong màn hình sẽ di chuyển nên tôi tự hỏi: có thuật toán nào để sắp xếp các đối tượng theo đúng thứ tự không? Hiện tại tôi có chúng sắp xếp theo trục Z tăng dần, sau đó X giảm dần và Y giảm dần.


2
Tôi sẽ tự ý hỏi, vì bạn nói bạn chưa quen với lập trình 3d, không phải là công cụ bạn đang sử dụng thử nghiệm độ sâu hỗ trợ? phân loại độ sâu sẽ chỉ đưa bạn đến nay. ngay cả khi bạn giải quyết vấn đề này, ví dụ, các khối hình chữ L hoặc T sẽ gây ra hiện tượng
dreta

+1 vì đây là một chủ đề được nhiều người quan tâm đến 3d nói chung và minh họa của bạn rất tuyệt.
Patrick Hughes

Câu trả lời:


3

Như @dreta đã đề cập trong các nhận xét, cách thức điển hình của động cơ 3D giải quyết vấn đề này là sử dụng bộ đệm độ sâu và sử dụng kiểm tra độ sâu phần cứng, cho phép bạn vẽ các vật thể có hình dạng tùy ý theo bất kỳ thứ tự nào và sẽ theo dõi bề mặt gần nhất ở mỗi pixel . Cũng có thể sắp xếp các đối tượng theo cách thủ công, nhưng sẽ không nhất thiết phải xử lý các đối tượng không trùng lặp hoặc các đối tượng chồng chéo một cách chính xác.

Tuy nhiên, nếu bạn muốn sắp xếp các đối tượng, bạn sẽ cần tính giá trị độ sâu cho từng đối tượng, sau đó sắp xếp theo độ sâu giảm dần. Để có chiều sâu, nếu bạn đang sử dụng thiết lập công cụ 3D thông thường, bạn sẽ cần chuyển đổi điểm trung tâm của từng đối tượng thông qua ma trận chế độ xem của bạn (đi từ không gian thế giới sang không gian xem), sau đó lấy tiêu cực của tọa độ Z của kết quả. (Tiêu cực vì ở tọa độ thuận tay phải với X và Y thẳng hàng với màn hình, Z sẽ được chỉ ra khỏi màn hình.)

Nếu luôn luôn là chế độ xem đẳng cự như thế này, bạn có thể thoát khỏi việc tính toán độ sâu = ± X ± Y - Z, trong đó có nghĩa là: chọn dấu hiệu làm tăng độ sâu khi bạn càng rời xa máy ảnh. Điều đó sẽ phụ thuộc vào hướng của trục X và Y của bạn.


Ngay cả với chế độ xem đẳng cự, không thể sắp xếp các hình bằng cách sử dụng giá trị độ sâu. Điều duy nhất bạn có thể làm, với điều kiện là các hình dạng và tổ chức cảnh không quá phức tạp (và chúng thường như vậy), là xây dựng một thứ tự từng phần ( nghĩa là đưa ra hai hình dạng, cho biết hình nào nên được vẽ trước). Từ đó, bạn sẽ cần sắp xếp các hình dạng (ví dụ sử dụng sắp xếp theo cấu trúc liên kết) và một mình thường là thao tác O (n²) khi bạn may mắn nhưng thay vào đó tôi đang đặt cược vào O (n²logn).
sam hocevar

@SamHocevar Vâng, như tôi đã lưu ý trong câu trả lời của mình, việc sắp xếp đối tượng theo độ sâu sẽ không xử lý chính xác tất cả các trường hợp, đặc biệt (nhưng không giới hạn ở) các đối tượng không trùng lặp hoặc chồng chéo. Đó là một xấp xỉ tốt nhất. BTW, tôi tin rằng việc sắp xếp theo thứ tự một đồ thị luôn có thể được thực hiện trong O (V + E) (gần như chỉ là DFS). Số cạnh có thể là O (V ^ 2) nhưng tôi nghi ngờ nó thường không tệ.
Nathan Reed

@SamHocevar Trong chế độ xem đẳng cự với tất cả các đối tượng hình chữ nhật không khớp trục giao nhau, mặc dù vậy - đó là những gì ví dụ cho thấy - có vẻ như bạn có thể sắp xếp các hình dạng? Bạn có biết bất kỳ cấu trúc nào của một hình không thể được sắp xếp (ví dụ, một cái gì đó có sự chồng chéo theo chu kỳ) theo các ràng buộc đó không?
Steven Stadnicki

2
@StevenStadnicki Đây là một trường hợp phân loại ngây thơ theo chiều sâu sẽ không hoạt động. Thứ tự vẽ chính xác trong sơ đồ đó sẽ là đỏ, xanh lá cây, xanh dương, nhưng sắp xếp độ sâu dựa trên tâm của mỗi hình chữ nhật (các chấm đen) sẽ cho bạn màu xanh lam, xanh lục, đỏ. (Đường chấm chấm chạy vuông góc với khung nhìn, do đó bạn có thể thấy rõ mối quan hệ giữa độ sâu của các trung tâm.) Loại cấu trúc liên kết của Sam sẽ hoạt động ở đây, đưa ra cách xác định mối quan hệ "phía sau" giữa các hình chữ nhật.
Nathan Reed

2
Dưới đây là một ví dụ về các đối tượng được căn chỉnh theo trục mà bạn không thể sắp xếp: i.stack.imgur.com/jey1e.png
sam hocevar


0

Nói chung, câu trả lời cho câu hỏi của bạn ('có thuật toán có sẵn để sắp xếp các đối tượng theo đúng thứ tự không?') Trong cài đặt 3d tùy ý là không - không có thuật toán nào có thể tồn tại, ngay cả khi các đối tượng đơn giản như hình tam giác. Thật dễ dàng để xây dựng ba hình tam giác với sự chồng chéo theo chu kỳ; ví dụ, hãy tưởng tượng nhìn xuống trục Z ở ba hình tam giác dài và mỏng:

  • A: (2.1, 1.9, 1), (1.9, 2.1, 1), (-1, -1, 0)
  • B: (-2.1, 1.9, 0), (-1.9, 2.1, 0), (1, -1, 1)
  • C: (2.1, 1, 0), (1.9, 1, 0), (-2, 1, 1)

Sau đó, khi A và B trùng nhau trên màn hình (gần điểm XY (0,0)), B sẽ ở trên cùng (có giá trị Z cao hơn): giá trị Z của nó sẽ xấp xỉ 0,66 trong khi A sẽ xấp xỉ 0,33. Tương tự, khi A và C trùng nhau (gần điểm XY (1, 1)), A sẽ ở trên cùng; và trong đó B và C trùng nhau (gần điểm XY (1, -1)), C sẽ ở trên cùng. Không có cách nào để sắp xếp ba hình tam giác này sao cho việc vẽ chúng ra màn hình theo thứ tự được chỉ định sẽ cho kết quả chính xác.

Như Nathan Reed gợi ý, thực tế là bạn đang ở chế độ xem đẳng cự có nghĩa là bạn có thể sẽ tránh được vấn đề đặc biệt này; câu hỏi là liệu có đáng để tránh hay không, và điều đó phụ thuộc nhiều hơn vào môi trường của bạn và chức năng cụ thể mà bạn có sẵn. Mặc dù vậy, hầu hết các nền tảng bạn có thể đang phát triển đều có sẵn ít nhất một số hình thức kết xuất 3d, và thiên hướng đầu tiên của tôi sẽ chỉ là cõng trên đó cho mục đích của bạn.

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.