Геометрия
Пространственная геометрия
Frustum culling, ray-plane intersection, backface culling-без знания уравнений плоскостей в 3D невозможно написать ни один производительный 3D движок. Unity и Unreal делают тысячи таких проверок каждый кадр.
- **Frustum culling:** 6 plane-AABB тестов для каждого объекта в сцене
- **Рейтрейсинг:** ray-plane пересечение-основа трассировки лучей
- **Robotics:** уравнения плоскостей описывают рабочее пространство манипулятора
- **Point cloud processing:** RANSAC plane fitting для выделения поверхностей из LiDAR
Предварительные знания
Плоскости в 3D
Плоскость в 3D определяется нормальным вектором и одной точкой. Уравнение плоскости-обобщение уравнения прямой в 2D.
**Уравнение плоскости:** ax + by + cz + d = 0 где n = (a, b, c)-нормальный вектор (перпендикуляр к плоскости). **Через точку P₀ и нормаль n:** n·(P − P₀) = 0 **Через три точки:** n = (B−A) × (C−A), d = −n·A
Нормальный вектор плоскости 2x − 3y + z − 5 = 0 равен:
Расстояние от точки до плоскости
Расстояние от точки до плоскости-прямое обобщение расстояния от точки до прямой в 2D. Знаковое расстояние показывает, с какой стороны плоскости находится точка.
**Расстояние от точки (x₀, y₀, z₀) до плоскости ax+by+cz+d=0:** dist = |ax₀+by₀+cz₀+d| / √(a²+b²+c²) **Знаковое расстояние:** signed_dist = (ax₀+by₀+cz₀+d) / |n| Положительное-по стороне нормали, отрицательное-против.
Frustum culling в 3D движках: для каждого объекта проверяем его AABB против 6 плоскостей frustum. Каждая проверка-знаковое расстояние.
Расстояние от точки (1, 2, 3) до плоскости x + 2y + 2z − 9 = 0 равно:
Пересечение прямой и плоскости
Пересечение луча с плоскостью-основная операция рейтрейсинга и frustum culling. Параметрическая запись луча позволяет получить точку пересечения напрямую.
**Луч:** P(t) = O + t·D (O-начало, D-направление) **Пересечение с плоскостью n·P + d = 0:** t = −(n·O + d) / (n·D) Если n·D ≈ 0-луч параллелен плоскости (нет пересечения или луч в плоскости).
Луч O=(0,0,0), D=(0,0,1) пересекает плоскость z=5 (нормаль (0,0,1), d=−5). При каком t?
Двугранные углы и направляющие косинусы
Двугранный угол между двумя плоскостями равен углу между их нормалями (или дополнению до 180°). Направляющие косинусы задают ориентацию прямой в пространстве.
**Угол между плоскостями n₁·x+d₁=0 и n₂·x+d₂=0:** cos α = |n₁·n₂| / (|n₁|·|n₂|) **Направляющие косинусы** прямой с вектором (l, m, n): cos α = l/r, cos β = m/r, cos γ = n/r, где r = √(l²+m²+n²) cos²α + cos²β + cos²γ = 1
Угол между плоскостями с нормалями n₁=(1,0,0) и n₂=(0,1,0) равен:
Ключевые идеи
- **Плоскость** ax+by+cz+d=0: нормаль n=(a,b,c) перпендикулярна плоскости
- **Расстояние** от точки = |n·P+d|/|n|-знак определяет сторону плоскости
- **Ray-plane:** t = −(n·O+d)/(n·D)-основа рейтрейсинга
- **Двугранный угол** = arccos(|n₁·n₂|/(|n₁||n₂|))-угол между плоскостями
Связанные темы
3D плоскости-основа для многогранников и всей компьютерной графики:
- Многогранники — Грань многогранника-ограниченная часть плоскости
- Векторная геометрия — Нормаль плоскости = векторное произведение двух сторон
- Проективная геометрия — Матрица камеры проецирует 3D точки на плоскость изображения
Вопросы для размышления
- Как определить, лежат ли 4 точки в пространстве в одной плоскости?
- Что означает знаковое расстояние в контексте backface culling?
- Как быстро найти пересечение трёх плоскостей (вершину тетраэдра)?