Яка логіка перетину дерева kd?


12

Я намагаюся розібратися, як реалізувати дерево KD.

На сторінці 322 розділу "Виявлення зіткнень у реальному часі" Еріксон

Текстовий розділ включений нижче, якщо попередній перегляд книг Google не дозволяє вам бачити його час натискання на посилання

текстовий розділ

Відповідний розділ:

Основна ідея, що перетинає відрізок променя або спрямованої лінії з деревом kd, є простою. Лінія перетинається проти площини розщеплення вузла і обчислюється значення t перетину. Якщо t знаходиться в межах інтервалу лінії, 0 <= t <= tmax, лінія стримує площину і обидва дітей дерева рекурсивно спускаються. Якщо ні, то рекурсивно відвідується лише сторона, що містить початок сегмента.

Тож ось що я маю: ( відкрийте зображення на новій вкладці, якщо ви не бачите буквене позначення)

зображення

Логічне дерево

діви

Тут помаранчевий промінь проходить через 3d сцену. Х являють собою перетин з площиною. З Ліворуч промінь потрапляє:

  • Передня частина окулюючого куба сцени,
  • Площина розщеплення (1)
  • (2.2) площина розщеплення
  • Права частина окулюючого куба сцени

Але ось що б сталося, наївно слідуючи основним описом Еріксона вище:

  • Випробування на площину розщеплення (1). Рей потрапляє в площину розщеплення (1), тому ліва і права діти площини розщеплення (1) включаються в наступний тест.
  • Тест на площину розщеплення (2.1). Рей насправді вражає цю площину (далеко вправо), тому обох дітей включають у наступний рівень тестів. (Це протиінтуїтивно - не слід включати лише нижній вузол у наступні тести)

Чи може хтось описати, що відбувається, коли помаранчевий промінь пройде крізь сцену правильно?

Відповіді:


14

Це дуже просто насправді; випробування на площину розщеплення (2.1) має бути невдалим через:

Коли промінь потрапляє на площину розщеплення (1), ви "розділяєте промінь", або; Ви встановлюєте t-ранжар, для якого він дійсний, і продовжуєте вниз по дереву з отриманими частинами.

Таким чином, перевіряючи площину (2.1), ви повинні перевірити, чи перетинається лише частина променя, ліва від площини (1), з площиною (2.1), якої вона не відповідає. Перетин "далеко вправо", про який ви говорите, має значення t>, tде ви розділили промінь на площину (1).

Я сподіваюся, що це досить зрозуміло.

Підсумок: Подальші перетинання променів / площин слід проводити лише з тією частиною, що залишилася після розбиття її на відповідну площину.


1
Grr !! (коротко для великої відповіді)
bobobobo

Приємна відповідь Серйозний! Ласкаво просимо на GDSE.
MichaelHouse
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.