Tôi đang viết 3D raytracer như một dự án học tập cá nhân (Enlight) và đã gặp phải một vấn đề thú vị liên quan đến kiểm tra giao cắt giữa tia và cảnh vật thể.Cấu trúc dữ liệu/phương pháp tiếp cận hiệu quả raytracing
Tình hình là:
- Tôi có một số nguyên thủy mà tia có thể giao nhau với (hình cầu, hộp, máy bay, vv) và các nhóm đó. Nói chung tôi gọi những vật thể này.
- Tôi muốn có thể cảnh đối tượng nguyên thủy với biến đổi affrary tùy ý bằng cách gói chúng trong một đối tượng
Transform
(quan trọng, điều này sẽ cho phép nhiều trường hợp cùng nguyên thủy) được sử dụng ở các vị trí khác nhau trong cảnh. không thay đổi) - Đối tượng cảnh có thể được lưu trữ trong hệ thống phân cấp khối giới hạn (tức là tôi đang làm phân vùng không gian)
- Bài kiểm tra giao điểm của tôi hoạt động với
Ray
đối tượng đại diện cho phân đoạn một phần (vector bắt đầu, vector hướng chuẩn hóa, khoảng cách bắt đầu , khoảng cách kết thúc)
Vấn đề là khi một tia chạm vào hộp giới hạn của một đối tượng Transform, có vẻ như cách duy nhất để thực hiện kiểm tra giao cắt với các nguyên thủy được biến đổi chứa bên trong là biến đổi Ray
thành không gian phối hợp được biến đổi. Điều này là dễ dàng đủ, nhưng sau đó nếu tia không trúng bất kỳ đối tượng chuyển đổi tôi cần phải quay trở lại ban đầu Ray
để tiếp tục theo dõi. Kể từ khi chuyển đổi có thể được lồng nhau, điều này có nghĩa là tôi phải duy trì một ngăn xếp toàn bộ Ray
s cho mỗi lần giao lộ được thực hiện.
Đây là khóa học trong vòng lặp bên trong của toàn bộ ứng dụng và nút cổ chai hiệu suất chính. Nó sẽ được gọi là hàng triệu lần một giây vì vậy tôi muốn giảm thiểu sự phức tạp/tránh phân bổ bộ nhớ không cần thiết.
Có cách nào thông minh để tránh phải phân bổ mới Ray
s/giữ ngăn xếp Ray
không?
Hoặc có cách nào thông minh hơn để làm điều này hoàn toàn không?
Tôi không chắc chắn điều này sẽ nhanh hơn phân bổ bộ nhớ, nhưng bạn có thể cố gắng đưa ra thuật toán đảo ngược biến đổi hiệu quả và sau đó nhân phép chiếu hiện tại với phép biến đổi nghịch đảo khi lùi ra khỏi đối tượng hiện tại. –
@Ivan - ý tưởng thú vị. Tôi đoán nó có thể nhanh hơn một chút, mặc dù tôi sẽ lo lắng về vấn đề độ chính xác số ..... – mikera
Bạn có thể tính toán trước và bộ nhớ cache biến đổi và nghịch đảo biến đổi (Tức là đối tượng ma trận) cho từng đối tượng (cũng như các đối tượng trong nhóm) sẽ chuyển đổi thành và từ khung chung. Bằng cách này, bạn không cần một hệ thống phân cấp lồng nhau vì bạn có thể thực hiện kiểm tra lần lượt trên từng đối tượng một cách trực tiếp. I E. chuyển đổi tia thành khung của đối tượng, sau đó chuyển đổi trở lại để có được điểm nhấn trong khung toàn cầu. Tôi làm điều này trong dấu vết của tôi: http://github.com/danieljfarrell/pvtrace –