Куб - пересечение плоскостей

Куб - пересечение плоскостей

Рассмотрим ещё один способ задания куба - пересечение шести плоскостей, каждая из которых описывается уравнением вида:

$$ A(x - x_0) + B(y - y_0) + C(z - z_0) + D = 0 $$
причём нормали к плоскостям должны смотреть "наружу". Это условие необходимо для корректного вычисления освещённости граней.

Куб

Следует отметить, что самый естественный для школьной геометрии способ задания куба - перечисление координат вершин, можно считать частным случаем обсуждаемого метода, так как по точкам вершин можно с лёгкостью составить уравнения плоскостей, а направление нормалей устанавливать согласно правилу правой руки.

Для каждой плоскости вычислим значение параметра \( t_i \), соответствующее точке пересечения плоскости и луча. Для каждого найденного решения \( t_1, t_2, ... , t_n \ (n \leq 6) \) нужно проверить, что точка лежит внутри пересечения всех полупространств, определяемых плоскостями куба, чтобы убедиться, что полученная точка действительно лежит на грани куба.

Такую проверку можно выполнять различными способами. Например, мы можем выполнять непосредственную подстановку координат полученной точки в уравнение плоскости. Также можно для каждой плоскости получать вектор нормали, проходящий через эту точку, а затем вычислять скалярное произведение исходной нормали и вычисленной и по его знаку определять принадлежность точки полупространству.

В обоих случаях для каждого решения придётся выполнить 6 (в случае оптимизации 4) проверок. Однако, можно обойтись и меньшим числом, если сохранять для куба его центр и половину длины стороны.

Куб

Когда мы получаем какое-то корректное значение параметра \( t \), то в этот момент точно знаем с какой гранью было зарегистрировано пересечение - точка \(P(x_p, y_p, z_p)\). Вычислим координаты точки \(M(x_m, y_m, z_m)\) путём прибавления к координатам центра куба вектора, равного нормали \( \vec{n} \) к этой грани (имеющей единичную длину), умноженной на \(r\):

$$ \begin{cases} x_m = x_0 + r \cdot n_x \\ y_m = y_0 + r \cdot n_y \\ z_m = z_0 + r \cdot n_z \end{cases} $$

Следует отметить, что для ускорения работы программы можно отдельно хранить и центры граней, вычислив их один раз при создании объекта.

Зададим вектор \( \overrightarrow{MP}(x_p - x_m, y_p - y_m, z_p - z_m) \) и спроецируем его на нормали к соседним граням \( \vec{n}_1, \vec{n}_2 \). Тогда мы можем сформулировать критерий: для того, чтобы точка \( P \) лежала на грани куба, необходимо и достаточно, чтобы длины проекций вектора, проведённого из центра грани к этой точке, на нормали соседних граней не превосходили \( r \).

Приняв за \( t \) наименьшее значение из всех \( t_i \), успешно прошедших проверку, получим значение параметра, при котором луч пересекает куб впервые.

Назад Вперёд