Làm cách nào tôi có thể đùn hình dạng 2D dựa trên lưới thông thường sang 3D?


7

Tôi có một danh sách các tọa độ đỉnh bao quanh một số khu vực 2D. Chỉ các đường trực giao, nhưng không nhất thiết là các vùng lồi ... tương tự như dấu vết PCB của các vùng đồng dẫn điện. Tôi muốn vẽ chúng như những vật thể rắn trong 3D bằng OpenGL, nhưng tôi vẫn còn rất mới với 3D và đang vật lộn.

Xin chỉ cho tôi cách làm điều này. Tôi đã quản lý để vẽ phác thảo chỉ bằng cách sử dụng GL_LINE_STRIP, nhưng khi tôi thử GL_QUAD_STRIPhoặc GL_TRIANGLE_STRIP, danh sách tọa độ không được sắp xếp đúng cho dải tam giác và thực tế các khu vực không lồi ngăn tôi thực hiện một phép tính tam giác đơn giản.

Đây là các hình dạng 2D:

Hình minh họa

Tôi muốn kết xuất chúng như thế này:

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


Bạn nói đúng, tiêu đề của tôi là một chút sai lầm, tôi xin lỗi. Về cơ bản, tôi đang cố gắng thêm chiều thứ ba vào phác thảo khu vực 2D. Tôi có tọa độ 2D cho phác thảo và muốn nó giống như thế này: img4.yeggi.com/images_q/414287/tetris-blocks
Hrvoje

Câu trả lời:


1

Có ba phần để giải quyết điều này;

  1. chia các đa giác lõm thành hình tam giác (opengl không thể vẽ các polys lõm). Đây sẽ là bề mặt 'trên cùng'

  2. thay thế (đùn) tập hợp các hình tam giác dọc theo một vectơ thích hợp, điều này sẽ trở thành bề mặt 'dưới cùng'

  3. tạo ra các 'cạnh' của âm lượng, bằng cách nối các cạnh bên ngoài của các bề mặt trên cùng và dưới cùng

Phần 1 - Tessname của bề mặt trên cùng

Câu trả lời đơn giản nhất cho việc xử lý đa giác lõm không có lỗ là cắt EAR.

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

{v3, v0, v1} & {v1, v2, v3} là tai, {v0, v1, v2} không phải là tai (v3 nằm bên trong {v0, v1, v2}), {v2, v3, v0) là không phải là tai (góc trong tại v3 là> π). EAR của đa giác là một tam giác được hình thành bởi ba đỉnh V0, V1 và V2 liên tiếp, trong đó V1 là một đỉnh lồi (góc trong của đỉnh nhỏ hơn rad rad), đoạn thẳng từ Vi0 đến Vi2 nằm hoàn toàn bên trong đa giác, và không có đỉnh nào của đa giác được chứa trong tam giác ngoài ba đỉnh của tam giác. Một đa giác có 4 đỉnh trở lên luôn có tai. Vì vậy, cách tiếp cận của chúng tôi là tìm một tai, cắt nó ra, lặp lại cho đến khi chỉ còn một tai (hình tam giác);

do until num vertices of P is 3
    find an ear vq,vr,vs
    add vq,vr,vs to list of triangles
    remove vr from polygon
end do
add last 3 vertices to triangle list

Vẽ danh sách này dưới dạng GL_TRIANGLE_LIST

Có nhiều cách tiếp cận hiệu quả hơn đối với tam giác đa giác ( https://en.wikipedia.org/wiki/Polygon_triangulation ), nhưng phương pháp tai là đơn giản nhất.

Phần 2 - Tạo bề mặt đáy

Sao chép tất cả các đỉnh được tìm thấy trong phần một và thêm vectơ đùn của bạn vào từng đỉnh. Điều này trở thành bề mặt 'dưới cùng' của bạn. Vectơ đùn là một vectơ (thường) ở góc vuông với đa giác ban đầu của bạn. Độ dài của vectơ đùn phụ thuộc vào thời gian đùn của bạn cần.

Phần 3 - Tạo các mặt đùn

Lấy mỗi cạnh của đa giác lõm ban đầu của bạn. Thêm vectơ đùn vào hai điểm cuối của cạnh. Điều này tạo ra 4 điểm (2 điểm kết thúc ban đầu và 2 điểm cuối 'đùn') Đây tạo thành một hình chữ nhật *, đây sẽ là một trong những cạnh của hình đùn. Chúng có thể được vẽ dưới dạng GL_QUADS hoặc GL_TRIANGLE_STRIP tùy theo đơn đặt hàng.

* giả sử một vector đùn góc phải.


Tôi nghĩ bạn đang hiểu sai câu hỏi hoặc đa giác lồi là gì. Nhưng anh ấy nói trong câu hỏi của mình rằng các khu vực không nhất thiết phải lồi, cũng có thể được nhìn thấy từ các ví dụ của anh ấy. Ngay cả hình dạng ví dụ của bạn không lồi, nó lõm. Vui lòng hoàn nguyên các thay đổi của bạn cho câu hỏi và cập nhật câu trả lời của bạn.
Christer

@Christer Tôi gõ lồi, khi tôi có nghĩa là lõm, cảm ơn vì đã chỉ ra điều đó.
Ken

Nếu tất cả các hình dạng của OP được cấu tạo đơn giản từ các hình vuông, một tùy chọn khác là chỉ phát ra 2 hình tam giác trên mỗi hình vuông cho đỉnh / đáy thay vì thực hiện cắt tai.
HolyBlackCat

Có, nếu các hình được dựa trên một lưới, sẽ khá dễ dàng để tạo danh sách các hình vuông
Ken
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.