2016-11-07 16 views
5

Trong ứng dụng iOS của tôi, tôi có một bộ bản đồ hành tinh dưới dạng hình ảnh, một số bản đồ có độ phân giải 14k. Tôi có thể áp dụng các phiên bản thu hẹp cho các hình cầu để tạo ra các mô hình của các hành tinh trong SceneKit. Tuy nhiên, tôi muốn người dùng có thể phóng to để xem chi tiết về hình ảnh có độ phân giải đầy đủ. Tôi cũng muốn có thể làm điều này mà không cần ứng dụng của tôi hết bộ nhớ. Có cách nào để tự động dán họa tiết vào hình cầu như Google Maps không và chỉ tải các phần và độ phân giải khi cần thiết?Ánh xạ độ phân giải cực cao tới hình cầu trong SceneKit

Trả lời

1

Hai kỹ thuật tối ưu hóa mà bạn có thể áp dụng bằng cách sử dụng rất ít nỗ lực lập trình là mipmaps và mức độ chi tiết.

Nếu bạn đặt thuộc tính mipFilter của SCNMaterial đại diện cho bản đồ hành tinh của mình, bạn sẽ nhận được một mipmap được tạo tự động.

Nếu bạn cung cấp một số SCNLevelOfDetail trường hợp cho hành tinh của bạn SCNGeometry, bạn sẽ nhận được các phiên bản có số lượng đa giác được giảm cao sẽ tiết kiệm bộ nhớ.

Cả hai đều được đề cập trong cuộc trò chuyện về WWDC SceneKit 2013. SCNLevelOfDetail được đề cập lại vào năm 2014. Mã mẫu 2014 có ví dụ về cả hai: tạo mipmap trong AAPLPresentationViewController và LOD trong trang 58.

+0

Từ các thử nghiệm không khoa học của tôi với mipFilter, việc sử dụng bộ nhớ vôi vẫn không đổi dựa trên mức thu phóng. Một kết cấu 8k trên một đối tượng đang hogging ~ 400MB bộ nhớ không có vấn đề nếu đối tượng là siêu nhỏ và xa hoặc cách lên gần. Tôi đang sử dụng chế độ lọc tuyến tính. Có điều gì khác tôi phải thực hiện cho nó không? – Timestretch

1

Những gì bạn cần làm là chia các họa tiết thành các phần nhỏ hơn và cung cấp các kích thước khác nhau về mức độ chi tiết. Khi máy ảnh của bạn được phóng to đủ sâu, bạn có thể sử dụng các họa tiết có độ phân giải cao nhất, nhưng bạn cũng sẽ cần phải hạn chế số lượng họa tiết được hiển thị. Khi bạn hiển thị một bề mặt của hành tinh phóng to chỉ trong một phần nhỏ của nó có thể được nhìn thấy trên màn hình, nhưng thu nhỏ toàn bộ bề mặt phía trước được hiển thị. Vì vậy, chia kết cấu của bạn thành những miếng nhỏ và cũng tạo ra kết cấu có độ phân giải thấp hơn cho các mức thu phóng khác. Bạn cũng sẽ cần phải tạo hình học tùy chỉnh và gán các mảnh kết cấu có độ phân giải cao nhỏ trên đó. Cuối cùng, bạn sẽ cần phải quyết định hình dạng kết cấu nào để hiển thị chế độ xem máy ảnh nào tùy thuộc vào khoảng cách hoặc góc nhìn. Khi sử dụng chế độ xem, bạn cũng cần phải quyết định phần nào được nhìn thấy trong cảnh hiện tại. Tôi hiện đang đối mặt với cùng một vấn đề. Tôi đã tạo tất cả các lưới con và tất cả các kết cấu nhỏ hơn bằng cách sử dụng SCNNode (không tải các kết cấu ở đây - chúng chỉ cần được nạp theo yêu cầu!), Tuy nhiên tôi không có giải pháp làm việc cho thử nghiệm mà các nút con là có thể nhìn thấy. Phương thức thất bại bên trong không có gì ở đây, bởi vì nó chỉ thực hiện kiểm tra hộp giới hạn và các hộp giới hạn là lớn, hầu hết trong số chúng sẽ luôn ở bên trong khung nhìn (vì vậy hiện tại tôi đang cố gắng thực hiện kiểm tra riêng). Và bạn cũng sẽ cần một số tiêu chuẩn bề mặt để kiểm tra xem mặt trước của mặt có trỏ theo hướng camera hay không. Thật không may, bởi vì tôi vẫn không có giải pháp làm việc, tôi không thể đăng bất kỳ mã nào ở đây - tôi chỉ có thể mô tả "kế hoạch mã hóa" của tôi sẽ hoạt động (ít nhất là sử dụng OpenGL tôi đã triển khai những thứ như năm trước). Có lẽ ý tưởng cơ bản đằng sau giải pháp đã hữu ích cho bạn? Nếu không, có lẽ chúng ta có thể tìm ra phần còn lại cùng nhau ... :-)

Các vấn đề liên quan