Краткий ответ: все зависит от вашего приложения.Существует несколько вариаций kd-деревьев.
Как мы справляемся со странными треугольниками, в которых мы не можем сделать простые разбиения?
Я полагаю, вы имеете в виду выбор плоскости расщепления для данного наборатреугольников.Это довольно сложная задача оптимизации, которая обычно решается с помощью эвристики.Например, вы можете отсортировать центроиды треугольников вдоль одной оси и выбрать медиану в качестве плоскости расщепления.Ничто не мешает вам реализовать более разумный критерий.
Если вы обнаружите, что ваша плоскость расщепления проходит через примитив, у вас есть два варианта.Либо разделите примитив, либо добавьте его в оба поддерева.Что вы должны сделать, зависит от вашего приложения.
Разбиваем ли мы даже треугольники или разбиваемые по вершинам?
Это зависит от примитивов, которые вы хотите добавить в свое дерево.Если вы хотите использовать дерево для лучевой передачи, то имеет смысл иметь треугольники в дереве.KD-деревья - это очень общая концепция, которая работает с любыми примитивами.Например, они также широко используются для облаков точек.
Как именно мы проверяем пересечение луча, который мы посылаем из камеры?
Это делается путем обхода дерева.Итак, вы начинаете с корневого узла и проверяете, пересекается ли луч с соответствующим ограничивающим прямоугольником (который является всем пространством).Затем вы проверяете, какое из двух поддеревьев сначала пересекается лучом, и переходите к этому.И затем вы повторяете: вы проверяете на пересечение с AABB узла (который вы строите постепенно из плоскостей расщепления).Если луч не пересекает AABB, то немедленно вернитесь обратно к родительскому узлу.Если это так, переходите к первому ребенку.Когда вы вернетесь к первому дочернему элементу, перейдите ко второму дочернему элементу (если только вы не нашли пересечение).
Для получения более подробной информации я бы посоветовал взглянуть на специфичные для приложения экземпляры kd-деревьев..