1.3.1. Giới thiệu
Potree[16] là một dự án mã nguồn mở render point cloud dựa trên WebGL cho phép biểu diễn mô hình 3D trên các trình duyệt Web phổ thông, nó là nghiên cứu của Markus Schütz trong các dự án của trung tâm nghiên cứu đồ họa máy tính TU Wien Scanopy tại Vienna nước Áo từ năm 2016, được cộng đồng quốc tế đóng góp phát triển qua nhiều phiên bản cho đến nay.
Số lượng lớn các point cloud yêu cầu bộ nhớ RAM rất lớn để render và do đó cần được xử lý bằng các thuật toán ngoài lõi. Một trong các lựa chọn của thuật toán ngoài lõi là chia dữ liệu thành nhiều ô và xử lý một hoặc một vài ô cùng một thời điểm nhưng đối với hình ảnh và các vật thể 3D thì người xem muốn hiển thị toàn bộ cả hình ảnh chứ không phải từng phần. Việc lưu trữ các mức độ chi tiết khác nhau của mô hình gốc vào các vùng phân cấp không gian dữ liệu cho phéprender point cloudnhanh chóng tải và hiển thị các vật thể 3D, cácvùng quan sát trực tiếp sẽ hiện thị mức độ chi tiết cao hơn các vùng ở xa và nằm ngoài chế độ xem sẽ bị loại bỏ hoàn toàn. Hai mô hình biến thể của Octrees(MNO) và kd-treeslà hai cấu trúc phân vùng không gian phổ biến để render số lượng các point cloudlớn. Potree đã sử dụng biến thể MNO để lấy mẫu con cho dữ liêu thô point cloud, nó không tạo ra dữ liệu khiến tăng thêm dung lượng, đồng thời cho phép người sử dụng lựa chon các điểm dữ liệu gốc và tính toán trên dữ liệu gốc, không thay đổi ở các mức zoom(thu phóng) và không cần tải các nút lá.
1.3.2. Cấu trúc MNO (Modifiable Nested Octree)
Cấu trúc MNO lưu trữ các mẫu con của dữ liệu thô point cloudban đầu trong mỗi nút, các nút cấp thấp chứa các mẫu con thưa thớt với kích thước lớn. Với mỗi cấp độ tiếp theo, kích thước của một nút thu nhỏ lại trong khi mật độ các điểm tăng lên và mỗi điểm của dữ liệu gốc sẽ được gắn cho một nút của Octree dẫnđến không có điểm mới hoặc điểm trùng lặp nào được tạo và khi kết hợp tất cả các điểm trong tất cả các nút sẽ trả về tập dữ liệu thô ban đầu.
Cấu trúc MNO ban đầu chia các mẫu con thông qua một lưới ba chiều bao gồm 1283 ô các ô này được tính là nút gốc, ban đầu mỗi điểm sẽ được thêm vào nút gốc và được xác định ở ô đầu tiên nó nằm trong lưới, nếu một điểm rơi vào ô đã chứa các điểm mà dưới một ngưỡng thì điểm đó vẫn được gán cho nút này nhưng thay vì lưu trữ vào lưới thì sẽ được lưu trữ trong một mảng đệm. Mảng đệm giữ các điểm ở xa hơn trong cùng một nút và bổ sung vào lưới để tránh phải tạo thêm nút mới lưu trữ các
điểm này, nút con mới sẽ được tạo thêm khi tích lũy đủ số điểm có khả năng nằm trong nó. Phương pháp lấy mẫu con này dẫn tới mật độ điểm khác nhau ở các nút Octree khác mức độ và nó tránh được hầu hết các nút trống vì các nút mới chỉ được tạo ra khi tích lũy số lượng điểm tối thiểu, tuy nhiên phương pháp này lại không đảm bảo khoảng trống tối thiểu nhất định giữa các điểm, các ô lưới liền kềcó thể chứa các điểm nằm gần nhau.
Hình 2.1 minh họa một Point cloudhìnhcầu được phân vùng trong cấu trúc MNO.
Hình 2. 1. Mô tả các nút cấp thấp chứa các điểm thưa thớt trên một vùng lớn, mỗi mức tiếp theo tăng số điểm theo cấp số nhân.
Cấu trúc phân cấp hoàn chỉnh của MNO được lưu trữ trong một tệp tin duy nhất, mỗi nút được lưu trữ trong một tệp tin và được đặt tên theo mã định danh của nút tương ứng, tạo thành các chỉ số từ gốc cho đến nút đang được truy cập. Thư mục gốc không có chỉ mục nên ký tự r được thay thế. Ví dụ: tệp tin r0446 là viết tắt của nút root.children[0].childreen[4].children[4]. children[6]
Hình 2. 2. Cấu trúc phân cấp hoàn chỉnh của MNO được lưu trữ trong một tệp tin.