Plane
Плоскость Normal.Dot(point) = D с ориентированной нормалью.
Для метрического DistanceTo и корректного Project нужна нормаль длины 1. Plane(normal,d) не нормализует вход автоматически; Normalized меняет и Normal, и D. Нулевая нормаль не задаёт геометрическую плоскость.
Все величины одной операции должны быть в одном пространстве. IntersectsRay/IntersectsSegment возвращают nullable-точку: проверяйте наличие результата. Эти вычисления не проверяют коллайдеры и слои физического мира. Порядок трёх точек конструктора влияет на направление нормали.
Объявления сверены с C# SDK 1.0.0. Раскройте имя, чтобы увидеть сигнатуры и описание.
Конструкторы5
Plane5 перегрузок
public Plane(Vector3 normal);Сохраняет normal и задаёт D = 0: плоскость проходит через начало координат при ненулевой нормали. Автоматической нормализации нет; нулевая нормаль не определяет плоскость.
| Имя | Тип | По умолчанию |
|---|---|---|
normal | Vector3 | — |
normalНенулевая нормаль в выбранной системе координат; для метрических методов — единичная.
public Plane(Vector3 normal, Vector3 point);Сохраняет normal и вычисляет D = normal.Dot(point). Нормаль автоматически не нормализуется. Для метрических расстояний и ортогональной проекции передайте единичную нормаль либо вызовите Normalized() у результата.
| Имя | Тип | По умолчанию |
|---|---|---|
normal | Vector3 | — |
point | Vector3 | — |
normalНенулевая нормаль в выбранной системе координат; для метрических методов — единичная.
pointТочка на плоскости в той же системе координат.
public Plane(Vector3 v1, Vector3 v2, Vector3 v3);Строит Normal = Normalize((v1 - v3).Cross(v1 - v2)) и D = Normal.Dot(v1). Порядок точек задаёт сторону нормали; обмен двух точек её переворачивает. Для совпавших или коллинеарных точек получается нулевая нормаль, а не корректная геометрическая плоскость.
| Имя | Тип | По умолчанию |
|---|---|---|
v1 | Vector3 | — |
v2 | Vector3 | — |
v3 | Vector3 | — |
v1Первая из трёх неколлинеарных точек.
v2Вторая точка в той же системе координат.
v3Третья точка; порядок влияет на направление нормали.
public Plane(Vector3 normal, float d);Сохраняет коэффициенты уравнения Normal.Dot(x) = D без нормализации. Например, Normal = (0, 1, 0), D = 2 задают y = 2. D может быть отрицательным. Для метрических операций нужна единичная нормаль.
| Имя | Тип | По умолчанию |
|---|---|---|
normal | Vector3 | — |
d | float | — |
normalНенулевая нормаль в выбранной системе координат; для метрических методов — единичная.
dПравая часть Normal.Dot(x) = D. При единичной нормали — знаковое смещение вдоль нормали.
public Plane(float a, float b, float c, float d);Сохраняет коэффициенты уравнения Normal.Dot(x) = D без нормализации. Например, Normal = (0, 1, 0), D = 2 задают y = 2. D может быть отрицательным. Для метрических операций нужна единичная нормаль.
| Имя | Тип | По умолчанию |
|---|---|---|
a | float | — |
b | float | — |
c | float | — |
d | float | — |
aКомпонента X нормали.
bКомпонента Y нормали.
cКомпонента Z нормали.
dПравая часть Normal.Dot(x) = D. При единичной нормали — знаковое смещение вдоль нормали.
Свойства8
DСвойство
public float D { get; set; }Правая часть Normal.Dot(x) = D. При единичной нормали это знаковое смещение от начала координат вдоль Normal; отрицательное значение допустимо. Присваивание меняет только D. Для неединичной нормали D само по себе не является расстоянием.
NormalСвойство
public Vector3 Normal { get; set; }Коэффициенты (a, b, c) уравнения ax + by + cz = D. Присваивание не нормализует вектор и не меняет D. Для изменения одной компоненты используйте свойства X, Y, Z либо присвойте весь вектор Normal. Изменение нормали при прежнем D может изменить геометрическую плоскость.
PlaneXYСвойство
public static Plane PlaneXY { get; }Координатная плоскость z = 0 с Normal = (0, 0, 1) и D = 0. Нормаль направлена вдоль +Z. Возвращает значение Plane: изменение сохранённой в переменной копии не меняет эту статическую плоскость.
PlaneXZСвойство
public static Plane PlaneXZ { get; }Координатная плоскость y = 0 с Normal = (0, 1, 0) и D = 0. Нормаль направлена вдоль +Y. Возвращает значение Plane: изменение сохранённой в переменной копии не меняет эту статическую плоскость.
PlaneYZСвойство
public static Plane PlaneYZ { get; }Координатная плоскость x = 0 с Normal = (1, 0, 0) и D = 0. Нормаль направлена вдоль +X. Возвращает значение Plane: изменение сохранённой в переменной копии не меняет эту статическую плоскость.
XСвойство
public float X { get; set; }Компонента Normal.X. Присваивание меняет только эту компоненту нормали, не нормализует её и не пересчитывает D.
YСвойство
public float Y { get; set; }Компонента Normal.Y. Присваивание меняет только эту компоненту нормали, не нормализует её и не пересчитывает D.
ZСвойство
public float Z { get; set; }Компонента Normal.Z. Присваивание меняет только эту компоненту нормали, не нормализует её и не пересчитывает D.
Методы20
DistanceTofloat
public float DistanceTo(Vector3 point);Возвращает Normal.Dot(point) − D. Это подписанное геометрическое расстояние только при единичной нормали и совпадающем пространстве.
| Имя | Тип | По умолчанию |
|---|---|---|
point | Vector3 | — |
pointТочка в системе координат плоскости.
floatЗначение Normal.Dot(point) - D: положительное со стороны Normal, отрицательное с другой стороны. Метрическое расстояние только при единичной нормали.
Equals2 перегрузки
public bool Equals(Plane other);Сравнивает Normal и D точно, без нормализации и отождествления противоположных нормалей. p, -p и Plane(p.Normal * 2, p.D * 2) могут задавать одно множество точек, но не равны по коэффициентам.
| Имя | Тип | По умолчанию |
|---|---|---|
other | Plane | — |
otherДругая плоскость для точного сравнения коэффициентов.
booltrue при точном равенстве коэффициентов.
public override bool Equals(object? obj);Сравнивает Normal и D точно, без нормализации и отождествления противоположных нормалей. p, -p и Plane(p.Normal * 2, p.D * 2) могут задавать одно множество точек, но не равны по коэффициентам. Для obj допускается только упакованный Plane; null и другой тип дают false.
| Имя | Тип | По умолчанию |
|---|---|---|
obj | object | — |
objОбъект для сравнения; допускается null.
booltrue при точном равенстве коэффициентов.
GetCenterVector3
public Vector3 GetCenter();Возвращает Normal * D. Это ближайшая к началу координат точка плоскости только при единичной нормали. Метод не делит результат на квадрат длины нормали и не нормализует вход. Например, Plane((0, 2, 0), 4) даёт (0, 8, 0), хотя уравнение задаёт y = 2; сначала вызовите Normalized().
Vector3Вектор Normal * D. У бесконечной плоскости нет собственного ограниченного центра.
GetHashCodeint
public override int GetHashCode();Возвращает HashCode.Combine(Normal, D). Точно равные коэффициенты дают одинаковый хеш, но совпадение хешей не доказывает равенство. По умолчанию Dictionary<Plane, T> использует точный Equals(), не геометрическое совпадение плоскостей. Не сохраняйте хеш как постоянный идентификатор между запусками.
intХеш коэффициентов Normal и D.
HasPointbool
public bool HasPoint(Vector3 point, float tolerance = 1E-06f);Проверяет abs(Normal.Dot(point) - D) <= tolerance. Граница допуска включена. Допуск измеряет остаток уравнения и становится расстоянием только при единичной нормали. Отрицательный tolerance не принимает даже точку с нулевым остатком. Нулевая нормаль с D = 0 может принять любую конечную точку и не является корректной плоскостью.
| Имя | Тип | По умолчанию |
|---|---|---|
point | Vector3 | — |
tolerance | float | 1E-06f |
pointКонечная точка в системе координат плоскости.
toleranceНеотрицательный допуск остатка уравнения; в текущей float-SDK по умолчанию 0.000001.
booltrue, если модуль остатка не превышает tolerance.
Intersect3Vector3?
public Vector3? Intersect3(Plane b, Plane c);Ищет единственную общую точку этой плоскости, b и c. Знаменатель — Normal.Cross(b.Normal).Dot(c.Normal); если Mathf.IsZeroApprox считает его нулевым, возвращает null. Так обрабатываются и отсутствие пересечения, и отсутствие единственной точки. Порог абсолютный: малый масштаб коэффициентов может дать null даже для независимых нормалей. Для геометрических вычислений используйте конечные нормализованные плоскости.
| Имя | Тип | По умолчанию |
|---|---|---|
b | Plane | — |
c | Plane | — |
bВторая плоскость в той же системе координат.
cТретья плоскость в той же системе координат.
Vector3?Единственная общая точка либо null при приблизительно нулевом определителе.
IntersectsRayVector3?
public Vector3? IntersectsRay(Vector3 from, Vector3 dir);Возвращает Vector3? — пересечение луча from + dir × t с плоскостью либо null. Почти параллельный луч даёт null, в том числе лежащий в плоскости. Попадание позади начала отбрасывается с допуском Mathf.Epsilon по параметру t.
| Имя | Тип | По умолчанию |
|---|---|---|
from | Vector3 | — |
dir | Vector3 | — |
fromНачало луча в пространстве плоскости.
dirНенулевое направление; используйте единичный вектор, чтобы допуск параметра соответствовал расстоянию.
Vector3?Точка пересечения или null; проверяйте HasValue перед Value. Операция не ищет коллайдеры.
IntersectsSegmentVector3?
public Vector3? IntersectsSegment(Vector3 begin, Vector3 end);Ищет пересечение конечного отрезка begin–end с математической плоскостью. При приблизительно нулевом Normal.Dot(begin - end) возвращает null, в том числе для лежащего в плоскости или нулевого отрезка. Для непараллельного отрезка допускает параметр t от -Mathf.Epsilon до 1 + Mathf.Epsilon. Этот допуск относится к доле длины отрезка; результат не зажимается до концов и может немного выходить за них. Проверяйте HasValue перед Value. Это вычисление не обращается к коллайдерам.
using Reckfell;
public static class PlaneExamples
{
public static bool Validate()
{
var floor = new Plane(Vector3.Up, 2); // y = 2
Vector3? hit = floor.IntersectsRay(new Vector3(0, 10, 0), Vector3.Down);
Vector3? segmentHit = floor.IntersectsSegment(new Vector3(0, 5, 0), Vector3.Zero);
Vector3 projected = floor.Project(new Vector3(3, 9, 4));
return hit.HasValue && hit.Value.IsEqualApprox(new Vector3(0, 2, 0))
&& segmentHit.HasValue && segmentHit.Value.IsEqualApprox(new Vector3(0, 2, 0))
&& projected.IsEqualApprox(new Vector3(3, 2, 4));
}
}| Имя | Тип | По умолчанию |
|---|---|---|
begin | Vector3 | — |
end | Vector3 | — |
beginНачало отрезка в системе координат плоскости.
endКонец отрезка, а не направление.
Vector3?Точка пересечения либо null по правилам знаменателя и диапазона параметра.
IsEqualApproxbool
public bool IsEqualApprox(Plane other);Покомпонентно сравнивает Normal и D через Mathf.IsEqualApprox(). Не нормализует коэффициенты и не считает противоположные нормали равными. В текущей float-SDK точное равенство принимается сразу, иначе требуется abs(a - b) < max(0.000001, 0.000001 * abs(a)), где a — коэффициент этой плоскости. Проверка не задаёт геометрическое равенство плоскостей, не транзитивна и на границе допуска может зависеть от порядка.
| Имя | Тип | По умолчанию |
|---|---|---|
other | Plane | — |
otherПлоскость, коэффициенты которой сравниваются без предварительной нормализации.
booltrue, если все четыре приближённых сравнения проходят.
IsFinitebool
public bool IsFinite();Проверяет Normal и D на NaN и бесконечности. Не проверяет длину нормали: default(Plane) с нулевыми коэффициентами конечен, но не задаёт геометрическую плоскость. Для метрических операций дополнительно нужна ненулевая единичная нормаль.
booltrue, если все четыре коэффициента конечны.
IsPointOverbool
public bool IsPointOver(Vector3 point);Проверяет строгое Normal.Dot(point) > D. Для корректной плоскости true означает сторону, в которую направлена нормаль. Точка на плоскости даёт false; допуска нет. Это направление нормали, а не обязательно верх мира по Y.
| Имя | Тип | По умолчанию |
|---|---|---|
point | Vector3 | — |
pointКонечная точка в той же системе координат.
booltrue при положительном остатке уравнения.
NormalizedPlane
public Plane Normalized();Делит Normal и D на длину ненулевой нормали, сохраняя плоскость. Нормализация только Normal без D изменила бы её положение.
PlaneДля ненулевой нормали делит Normal и D на её длину. При нулевой нормали возвращает Plane с нулевыми Normal и D; это не геометрическая плоскость.
ProjectVector3
public Vector3 Project(Vector3 point);Проецирует точку на известную плоскость с единичной нормалью. Не запрашивает физический мир; точки и плоскость должны иметь одно пространство.
| Имя | Тип | По умолчанию |
|---|---|---|
point | Vector3 | — |
pointКонечная точка в системе координат плоскости; сначала нормализуйте плоскость.
Vector3point - Normal * DistanceTo(point). Лежит на плоскости как ортогональная проекция при единичной нормали.
ToString2 перегрузки
public override string ToString();Формирует строку Normal.ToString(format) + ", " + D.ToString(format, InvariantCulture). Например, с F2: (0.00, 1.00, 0.00), 2.00. Формат применяется ко всем четырём коэффициентам. Это диагностическая строка, не формат сохранения. Эквивалентен ToString(null).
stringСтрока нормали и D с независимым от языка системы форматом чисел.
public string ToString(string? format);Формирует строку Normal.ToString(format) + ", " + D.ToString(format, InvariantCulture). Например, с F2: (0.00, 1.00, 0.00), 2.00. Формат применяется ко всем четырём коэффициентам. Это диагностическая строка, не формат сохранения. Неверный числовой формат может вызвать FormatException.
| Имя | Тип | По умолчанию |
|---|---|---|
format | string | — |
formatЧисловой формат .NET, например "F2"; null выбирает формат по умолчанию.
stringСтрока нормали и D с независимым от языка системы форматом чисел.
op_Equalitybool
public static bool operator ==(Plane left, Plane right);Сравнивает Normal и D точно, без нормализации и отождествления противоположных нормалей. p, -p и Plane(p.Normal * 2, p.D * 2) могут задавать одно множество точек, но не равны по коэффициентам.
| Имя | Тип | По умолчанию |
|---|---|---|
left | Plane | — |
right | Plane | — |
leftЛевая плоскость.
rightПравая плоскость.
booltrue при точном равенстве коэффициентов.
op_Inequalitybool
public static bool operator !=(Plane left, Plane right);Сравнивает Normal и D точно, без нормализации и отождествления противоположных нормалей. p, -p и Plane(p.Normal * 2, p.D * 2) могут задавать одно множество точек, но не равны по коэффициентам. Оператор != отрицает точное равенство.
| Имя | Тип | По умолчанию |
|---|---|---|
left | Plane | — |
right | Plane | — |
leftЛевая плоскость.
rightПравая плоскость.
booltrue при неравенстве коэффициентов.
op_UnaryNegationPlane
public static Plane operator -(Plane plane);Возвращает Plane(-Normal, -D): геометрическое положение сохраняется, направление нормали и знаки DistanceTo меняются на противоположные. Отрицать только Normal при прежнем D — другое преобразование.
| Имя | Тип | По умолчанию |
|---|---|---|
plane | Plane | — |
planeИсходная плоскость.
PlaneНовая копия с противоположными Normal и D.
op_UnaryPlusPlane
public static Plane operator +(Plane plane);Возвращает неизменённое значение Plane. Не нормализует коэффициенты и не меняет их знаки.
| Имя | Тип | По умолчанию |
|---|---|---|
plane | Plane | — |
planeИсходная плоскость.
PlaneНовая копия с прежними коэффициентами.