Лекция 9::Задача 2 (трудна)
- Forums:
По-бързо пресичане с K-d дърво
Идеята тук е да оптимизираме вътрешната рекурсивна функция Mesh::intersectKD(), като си спестим извикванията на BBox::testIntersect(), когато е възможно.
Да видим какво прави функцията досега:
1) Проверява дали лъча сече едното подпространство (ляво или дясно, в зависимост от order-а). Ако пресича, влиза рекурсивно навътре.
2) Ако все още не е намерена пресечна точка, сече лъча и с другото подпространство. Ако има пресичане, влиза рекурсивно навътре.
Поне едно от тези пресичания е излишно. Тъй като знаем, че лъчът пресича "бащиния" bounding box, то със сигурност ще пресече поне едно от подпространствата. Освен това, можем да приложим и следната идея: ако лъчът пресича общата стена на подпространствата left и right, то със сигурност пресича и двете подпространства. Това ни довежда до следния алгоритъм:
1) Пресичаме лъча с общата стена между left и right. Ако имаме пресичане - лъчът пресича и двете подпространства
2) В противен случай, сечем лъча с едно от двете (примерно left). Ако имаме пресичане с left, то нямаме пресичане с right, и обратно.
Използвайки този алгоритъм можете да постигнете между 20% и 30% подобрение на тежка сцена (дракона, ревизия 711).
Трябва да си реализирате методче intersectWall на BBox, което да ви върши пресичането от точка 1.