Làm thế nào để Unity3D hạ thấp số lượng đỉnh .obj đã nhập?


8

Tôi có một câu hỏi liên quan đến cách Unity3D xử lý việc nhập tệp .obj. Tôi đang nhập ấm trà này: http://groups.csail.mit.edu/graphics/groupes/6.837/F03/models/tellow.obj

Số lượng đỉnh của ấm trà này là 3644. Tôi biết rằng lớp Lưới của Unity cần sao chép các đỉnh này cho mỗi mặt được chia sẻ bởi cùng một đỉnh. Tôi đã thử điều này với một Cube được nhập từ .obj và sử dụng Debug.Log () để in số lượng đỉnh tôi phát hiện ra rằng có 24 đỉnh trong mảng đỉnh của lưới.

Tuy nhiên, với ấm trà, tệp gốc có 3644 đỉnh, vì vậy, trong Unity, số đỉnh sẽ là 18960. Thay vào đó, khi tôi in độ dài của mảng đỉnh của lưới, nó sẽ in 3260 (thậm chí ít hơn tệp gốc).

Mục tiêu cuối cùng cho điều này là tôi đang cố gắng sửa đổi tập lệnh Trình nhập OBJ từ Wiki của Unity, để số lượng đỉnh tạo ra từ tập lệnh này giống như trình nhập khẩu gốc của Unity. Tham khảo: http://wiki.unity3d.com/index.php?title=ObjImporter Lưu ý: Tôi đã in số lượng đỉnh bằng cách sử dụng trình nhập này và kết quả là 18960.

Có ai có ý tưởng làm thế nào để giảm đỉnh này có thể đạt được?


Các thuật toán phức tạp, tôi không chắc chắn những gì thống nhất sử dụng nhưng bạn có thể tìm thấy chúng trực tuyến.
MickLH

Câu trả lời:


5

Có một số yếu tố góp phần vào cách lưu và xử lý hình học trong các phương tiện khác nhau (chương trình, định dạng tệp, API). Tôi đã thực hiện một số chương trình phân tích hình học thương mại, vì vậy tôi có một số kinh nghiệm với nó.

Đầu tiên tôi chắc chắn điều này không liên quan gì đến Unity đơn giản hóa mọi thứ. Nhưng trong trường hợp nó đã có một số thuật toán decimation có thể được thực hiện nhưng tôi chắc chắn không phải vậy, vì một công cụ trò chơi không cần phải thay đổi hình dạng (tính chất hình học của lưới) nhưng thường có thể sửa đổi kết nối của nó để phù hợp với cấu trúc tối ưu của mình.

Một số yếu tố này là:

Điều gì làm cho một đỉnh độc đáo?

Điều này có thể thay đổi rất nhiều tùy thuộc vào cách chương trình, api hoặc định dạng tệp xử lý với một đỉnh. Một đỉnh có thể là duy nhất nếu nó có một vị trí duy nhất, nhưng trong các trường hợp khác, nó là duy nhất nếu nó có bất kỳ thuộc tính duy nhất nào. Ví dụ: nếu hai đỉnh chia sẻ cùng một vị trí, nhưng có các quy tắc khác nhau thì chúng sẽ được "nhân đôi" trong trường hợp OpenGL, điều này đặc biệt rõ ràng trong trường hợp khối bạn đã đề cập.

nhập mô tả hình ảnh ở đây Cạnh cứng và mịn.

Các tiêu chuẩn có thể ra lệnh nếu một cạnh được coi là cứng hoặc mịn, nếu một đỉnh đóng góp vào cạnh cứng, thì nó cần phải được nhân đôi để các API kết xuất hiện tại có thể hiểu cách hiển thị (tô bóng) khuôn mặt này một cách chính xác.

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

Chỉ số

Nhiều định dạng tệp cho phép một đỉnh mặt có một số chỉ mục cho vị trí đỉnh / texCoords / quy tắc, đây không phải là trường hợp của API kết xuất hiện tại. Một ví dụ điển hình của việc này là tệp Obj, điều này sẽ buộc Unity xây dựng lại các chỉ mục và thường sao chép nhiều thuộc tính để khớp với các chỉ mục đỉnh.

Kết nối

Rất nhiều đỉnh thực sự được kết nối và là duy nhất được lưu nhiều lần, điều này phải thực hiện cách trình soạn thảo tệp gốc xử lý và lưu lưới. Unity sẽ giảm số lượng đỉnh trùng lặp (hãy nhớ nếu nó có thuộc tính khác thì nó không phải là duy nhất) để làm cho nó hiệu quả hơn cho việc lưu trữ và xử lý mà không làm giảm chất lượng.

Điều này cũng liên quan đến việc có bao nhiêu cạnh đa giác mà tệp gốc cho phép, ví dụ Obj cho phép đa giác phía N, điều mà bất kỳ công cụ trò chơi lành mạnh nào cũng không muốn, vì vậy, nó kết thúc việc tam giác lưới và tính toán lại nhiều thuộc tính thường gặp thay đổi số đỉnh.


Oh tôi hiểu rồi! Trong trình nhập .obj mà tôi đã sử dụng, các đỉnh luôn được sao chép cho mỗi khuôn mặt mà chúng được sử dụng và đó là lý do tại sao tôi luôn gặp khó khăn trên ấm trà của mình (trước đây tôi không đề cập đến vấn đề này vì tôi nghĩ đó là một vấn đề khác). Câu trả lời chính xác!
VitorOliveira

2

Các định dạng Obj đặc biệt lạ vì các vị trí, quy tắc và tọa độ kết cấu được tách biệt và mỗi mặt có thể chọn bất kỳ chỉ mục nào từ mỗi luồng. Khi bạn đề cập đến số lượng đỉnh, bạn nghĩ rằng vị trí đỉnh và số lượng quy tắc không giống nhau và bạn thực sự không thể đề cập đến toàn bộ số lượng.

Trong quá trình tải, cả ba thuộc tính này phải được hợp nhất với nhau để một vị trí đỉnh có thể kết thúc trùng lặp vì mặt được liên kết với vị trí đỉnh đó được liên kết với hai quy tắc . Điều này cũng có thể xảy ra ngược lại vì vậy hầu hết các trình tải đều có một bước để tối ưu hóa obj nhưng trong trường hợp khối của bạn, tối ưu hóa sẽ không hoạt động do khối có các cạnh cứng và mỗi đỉnh có một tọa độ bình thường (hoặc kết cấu khác nhau). Đây là lý do tại sao bạn đếm 6 vị trí đỉnh nhưng thống nhất nhân đôi các vị trí đó dẫn đến 24 đỉnh.

Để tải một lưới, bạn có thể nhân đôi vị trí / quy tắc hoặc tọa độ kết cấu để tối ưu hóa điều này không phải là điều đơn giản. Nó tập trung vào việc chọn số lượng trùng lặp tối thiểu từ ba luồng đó.


Câu trả lời này là một bổ sung tuyệt vời cho những gì concept3d đã nói, và nó đã giúp tôi hiểu vấn đề này. Vì vậy, tôi đoán bây giờ trình nhập .obj của tôi sẽ luôn có các cạnh cứng, nhưng nếu tôi muốn cải thiện nó, tôi nên tìm kiếm các thuật toán để giúp tôi biết các đỉnh nào sẽ được sao chép hay không, để có một mô hình có cạnh mịn với mức tối thiểu ( hoặc ít nhất là tối ưu hóa) số đỉnh.
VitorOliveira
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.