reckfellENGINE

Plane

Плоскость Normal.Dot(point) = D с ориентированной нормалью.

На этой странице
struct PlaneReckfellSharpНаследует ValueType

Для метрического DistanceTo и корректного Project нужна нормаль длины 1. Plane(normal,d) не нормализует вход автоматически; Normalized меняет и Normal, и D. Нулевая нормаль не задаёт геометрическую плоскость.

Все величины одной операции должны быть в одном пространстве. IntersectsRay/IntersectsSegment возвращают nullable-точку: проверяйте наличие результата. Эти вычисления не проверяют коллайдеры и слои физического мира. Порядок трёх точек конструктора влияет на направление нормали.

Практическое руководство.

Объявления сверены с C# SDK 1.0.0. Раскройте имя, чтобы увидеть сигнатуры и описание.

Конструкторы5

Plane5 перегрузок
# Plane · 1/5
C#
public Plane(Vector3 normal);

Сохраняет normal и задаёт D = 0: плоскость проходит через начало координат при ненулевой нормали. Автоматической нормализации нет; нулевая нормаль не определяет плоскость.

Параметры
ИмяТипПо умолчанию
normalVector3—
normal

Ненулевая нормаль в выбранной системе координат; для метрических методов — единичная.

# Plane · 2/5
C#
public Plane(Vector3 normal, Vector3 point);

Сохраняет normal и вычисляет D = normal.Dot(point). Нормаль автоматически не нормализуется. Для метрических расстояний и ортогональной проекции передайте единичную нормаль либо вызовите Normalized() у результата.

Параметры
ИмяТипПо умолчанию
normalVector3—
pointVector3—
normal

Ненулевая нормаль в выбранной системе координат; для метрических методов — единичная.

point

Точка на плоскости в той же системе координат.

# Plane · 3/5
C#
public Plane(Vector3 v1, Vector3 v2, Vector3 v3);

Строит Normal = Normalize((v1 - v3).Cross(v1 - v2)) и D = Normal.Dot(v1). Порядок точек задаёт сторону нормали; обмен двух точек её переворачивает. Для совпавших или коллинеарных точек получается нулевая нормаль, а не корректная геометрическая плоскость.

Параметры
ИмяТипПо умолчанию
v1Vector3—
v2Vector3—
v3Vector3—
v1

Первая из трёх неколлинеарных точек.

v2

Вторая точка в той же системе координат.

v3

Третья точка; порядок влияет на направление нормали.

# Plane · 4/5
C#
public Plane(Vector3 normal, float d);

Сохраняет коэффициенты уравнения Normal.Dot(x) = D без нормализации. Например, Normal = (0, 1, 0), D = 2 задают y = 2. D может быть отрицательным. Для метрических операций нужна единичная нормаль.

Параметры
ИмяТипПо умолчанию
normalVector3—
dfloat—
normal

Ненулевая нормаль в выбранной системе координат; для метрических методов — единичная.

d

Правая часть Normal.Dot(x) = D. При единичной нормали — знаковое смещение вдоль нормали.

# Plane · 5/5
C#
public Plane(float a, float b, float c, float d);

Сохраняет коэффициенты уравнения Normal.Dot(x) = D без нормализации. Например, Normal = (0, 1, 0), D = 2 задают y = 2. D может быть отрицательным. Для метрических операций нужна единичная нормаль.

Параметры
ИмяТипПо умолчанию
afloat—
bfloat—
cfloat—
dfloat—
a

Компонента X нормали.

b

Компонента Y нормали.

c

Компонента Z нормали.

d

Правая часть Normal.Dot(x) = D. При единичной нормали — знаковое смещение вдоль нормали.

Свойства8

DСвойство
# D
C#
public float D { get; set; }

Правая часть Normal.Dot(x) = D. При единичной нормали это знаковое смещение от начала координат вдоль Normal; отрицательное значение допустимо. Присваивание меняет только D. Для неединичной нормали D само по себе не является расстоянием.

NormalСвойство
# Normal
C#
public Vector3 Normal { get; set; }

Коэффициенты (a, b, c) уравнения ax + by + cz = D. Присваивание не нормализует вектор и не меняет D. Для изменения одной компоненты используйте свойства X, Y, Z либо присвойте весь вектор Normal. Изменение нормали при прежнем D может изменить геометрическую плоскость.

PlaneXYСвойство
# PlaneXY
C#
public static Plane PlaneXY { get; }

Координатная плоскость z = 0 с Normal = (0, 0, 1) и D = 0. Нормаль направлена вдоль +Z. Возвращает значение Plane: изменение сохранённой в переменной копии не меняет эту статическую плоскость.

PlaneXZСвойство
# PlaneXZ
C#
public static Plane PlaneXZ { get; }

Координатная плоскость y = 0 с Normal = (0, 1, 0) и D = 0. Нормаль направлена вдоль +Y. Возвращает значение Plane: изменение сохранённой в переменной копии не меняет эту статическую плоскость.

PlaneYZСвойство
# PlaneYZ
C#
public static Plane PlaneYZ { get; }

Координатная плоскость x = 0 с Normal = (1, 0, 0) и D = 0. Нормаль направлена вдоль +X. Возвращает значение Plane: изменение сохранённой в переменной копии не меняет эту статическую плоскость.

XСвойство
# X
C#
public float X { get; set; }

Компонента Normal.X. Присваивание меняет только эту компоненту нормали, не нормализует её и не пересчитывает D.

YСвойство
# Y
C#
public float Y { get; set; }

Компонента Normal.Y. Присваивание меняет только эту компоненту нормали, не нормализует её и не пересчитывает D.

ZСвойство
# Z
C#
public float Z { get; set; }

Компонента Normal.Z. Присваивание меняет только эту компоненту нормали, не нормализует её и не пересчитывает D.

Методы20

DistanceTofloat
# DistanceTo
C#
public float DistanceTo(Vector3 point);

Возвращает Normal.Dot(point) − D. Это подписанное геометрическое расстояние только при единичной нормали и совпадающем пространстве.

Параметры
ИмяТипПо умолчанию
pointVector3—
point

Точка в системе координат плоскости.

Возвращает float

Значение Normal.Dot(point) - D: положительное со стороны Normal, отрицательное с другой стороны. Метрическое расстояние только при единичной нормали.

Equals2 перегрузки
# Equals · 1/2
C#
public bool Equals(Plane other);

Сравнивает Normal и D точно, без нормализации и отождествления противоположных нормалей. p, -p и Plane(p.Normal * 2, p.D * 2) могут задавать одно множество точек, но не равны по коэффициентам.

Параметры
ИмяТипПо умолчанию
otherPlane—
other

Другая плоскость для точного сравнения коэффициентов.

Возвращает bool

true при точном равенстве коэффициентов.

# Equals · 2/2
C#
public override bool Equals(object? obj);

Сравнивает Normal и D точно, без нормализации и отождествления противоположных нормалей. p, -p и Plane(p.Normal * 2, p.D * 2) могут задавать одно множество точек, но не равны по коэффициентам. Для obj допускается только упакованный Plane; null и другой тип дают false.

Параметры
ИмяТипПо умолчанию
objobject—
obj

Объект для сравнения; допускается null.

Возвращает bool

true при точном равенстве коэффициентов.

GetCenterVector3
# GetCenter
C#
public Vector3 GetCenter();

Возвращает Normal * D. Это ближайшая к началу координат точка плоскости только при единичной нормали. Метод не делит результат на квадрат длины нормали и не нормализует вход. Например, Plane((0, 2, 0), 4) даёт (0, 8, 0), хотя уравнение задаёт y = 2; сначала вызовите Normalized().

Возвращает Vector3

Вектор Normal * D. У бесконечной плоскости нет собственного ограниченного центра.

GetHashCodeint
# GetHashCode
C#
public override int GetHashCode();

Возвращает HashCode.Combine(Normal, D). Точно равные коэффициенты дают одинаковый хеш, но совпадение хешей не доказывает равенство. По умолчанию Dictionary<Plane, T> использует точный Equals(), не геометрическое совпадение плоскостей. Не сохраняйте хеш как постоянный идентификатор между запусками.

Возвращает int

Хеш коэффициентов Normal и D.

HasPointbool
# HasPoint
C#
public bool HasPoint(Vector3 point, float tolerance = 1E-06f);

Проверяет abs(Normal.Dot(point) - D) <= tolerance. Граница допуска включена. Допуск измеряет остаток уравнения и становится расстоянием только при единичной нормали. Отрицательный tolerance не принимает даже точку с нулевым остатком. Нулевая нормаль с D = 0 может принять любую конечную точку и не является корректной плоскостью.

Параметры
ИмяТипПо умолчанию
pointVector3—
tolerancefloat1E-06f
point

Конечная точка в системе координат плоскости.

tolerance

Неотрицательный допуск остатка уравнения; в текущей float-SDK по умолчанию 0.000001.

Возвращает bool

true, если модуль остатка не превышает tolerance.

Intersect3Vector3?
# Intersect3
C#
public Vector3? Intersect3(Plane b, Plane c);

Ищет единственную общую точку этой плоскости, b и c. Знаменатель — Normal.Cross(b.Normal).Dot(c.Normal); если Mathf.IsZeroApprox считает его нулевым, возвращает null. Так обрабатываются и отсутствие пересечения, и отсутствие единственной точки. Порог абсолютный: малый масштаб коэффициентов может дать null даже для независимых нормалей. Для геометрических вычислений используйте конечные нормализованные плоскости.

Параметры
ИмяТипПо умолчанию
bPlane—
cPlane—
b

Вторая плоскость в той же системе координат.

c

Третья плоскость в той же системе координат.

Возвращает Vector3?

Единственная общая точка либо null при приблизительно нулевом определителе.

IntersectsRayVector3?
# IntersectsRay
C#
public Vector3? IntersectsRay(Vector3 from, Vector3 dir);

Возвращает Vector3? — пересечение луча from + dir × t с плоскостью либо null. Почти параллельный луч даёт null, в том числе лежащий в плоскости. Попадание позади начала отбрасывается с допуском Mathf.Epsilon по параметру t.

Параметры
ИмяТипПо умолчанию
fromVector3—
dirVector3—
from

Начало луча в пространстве плоскости.

dir

Ненулевое направление; используйте единичный вектор, чтобы допуск параметра соответствовал расстоянию.

Возвращает Vector3?

Точка пересечения или null; проверяйте HasValue перед Value. Операция не ищет коллайдеры.

IntersectsSegmentVector3?
# IntersectsSegment
C#
public Vector3? IntersectsSegment(Vector3 begin, Vector3 end);

Ищет пересечение конечного отрезка begin–end с математической плоскостью. При приблизительно нулевом Normal.Dot(begin - end) возвращает null, в том числе для лежащего в плоскости или нулевого отрезка. Для непараллельного отрезка допускает параметр t от -Mathf.Epsilon до 1 + Mathf.Epsilon. Этот допуск относится к доле длины отрезка; результат не зажимается до концов и может немного выходить за них. Проверяйте HasValue перед Value. Это вычисление не обращается к коллайдерам.

C#
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));
    }
}
Параметры
ИмяТипПо умолчанию
beginVector3—
endVector3—
begin

Начало отрезка в системе координат плоскости.

end

Конец отрезка, а не направление.

Возвращает Vector3?

Точка пересечения либо null по правилам знаменателя и диапазона параметра.

IsEqualApproxbool
# IsEqualApprox
C#
public bool IsEqualApprox(Plane other);

Покомпонентно сравнивает Normal и D через Mathf.IsEqualApprox(). Не нормализует коэффициенты и не считает противоположные нормали равными. В текущей float-SDK точное равенство принимается сразу, иначе требуется abs(a - b) < max(0.000001, 0.000001 * abs(a)), где a — коэффициент этой плоскости. Проверка не задаёт геометрическое равенство плоскостей, не транзитивна и на границе допуска может зависеть от порядка.

Параметры
ИмяТипПо умолчанию
otherPlane—
other

Плоскость, коэффициенты которой сравниваются без предварительной нормализации.

Возвращает bool

true, если все четыре приближённых сравнения проходят.

IsFinitebool
# IsFinite
C#
public bool IsFinite();

Проверяет Normal и D на NaN и бесконечности. Не проверяет длину нормали: default(Plane) с нулевыми коэффициентами конечен, но не задаёт геометрическую плоскость. Для метрических операций дополнительно нужна ненулевая единичная нормаль.

Возвращает bool

true, если все четыре коэффициента конечны.

IsPointOverbool
# IsPointOver
C#
public bool IsPointOver(Vector3 point);

Проверяет строгое Normal.Dot(point) > D. Для корректной плоскости true означает сторону, в которую направлена нормаль. Точка на плоскости даёт false; допуска нет. Это направление нормали, а не обязательно верх мира по Y.

Параметры
ИмяТипПо умолчанию
pointVector3—
point

Конечная точка в той же системе координат.

Возвращает bool

true при положительном остатке уравнения.

NormalizedPlane
# Normalized
C#
public Plane Normalized();

Делит Normal и D на длину ненулевой нормали, сохраняя плоскость. Нормализация только Normal без D изменила бы её положение.

Возвращает Plane

Для ненулевой нормали делит Normal и D на её длину. При нулевой нормали возвращает Plane с нулевыми Normal и D; это не геометрическая плоскость.

ProjectVector3
# Project
C#
public Vector3 Project(Vector3 point);

Проецирует точку на известную плоскость с единичной нормалью. Не запрашивает физический мир; точки и плоскость должны иметь одно пространство.

Параметры
ИмяТипПо умолчанию
pointVector3—
point

Конечная точка в системе координат плоскости; сначала нормализуйте плоскость.

Возвращает Vector3

point - Normal * DistanceTo(point). Лежит на плоскости как ортогональная проекция при единичной нормали.

ToString2 перегрузки
# ToString · 1/2
C#
public override string ToString();

Формирует строку Normal.ToString(format) + ", " + D.ToString(format, InvariantCulture). Например, с F2: (0.00, 1.00, 0.00), 2.00. Формат применяется ко всем четырём коэффициентам. Это диагностическая строка, не формат сохранения. Эквивалентен ToString(null).

Возвращает string

Строка нормали и D с независимым от языка системы форматом чисел.

# ToString · 2/2
C#
public string ToString(string? format);

Формирует строку Normal.ToString(format) + ", " + D.ToString(format, InvariantCulture). Например, с F2: (0.00, 1.00, 0.00), 2.00. Формат применяется ко всем четырём коэффициентам. Это диагностическая строка, не формат сохранения. Неверный числовой формат может вызвать FormatException.

Параметры
ИмяТипПо умолчанию
formatstring—
format

Числовой формат .NET, например "F2"; null выбирает формат по умолчанию.

Возвращает string

Строка нормали и D с независимым от языка системы форматом чисел.

op_Equalitybool
# op_Equality
C#
public static bool operator ==(Plane left, Plane right);

Сравнивает Normal и D точно, без нормализации и отождествления противоположных нормалей. p, -p и Plane(p.Normal * 2, p.D * 2) могут задавать одно множество точек, но не равны по коэффициентам.

Параметры
ИмяТипПо умолчанию
leftPlane—
rightPlane—
left

Левая плоскость.

right

Правая плоскость.

Возвращает bool

true при точном равенстве коэффициентов.

op_Inequalitybool
# op_Inequality
C#
public static bool operator !=(Plane left, Plane right);

Сравнивает Normal и D точно, без нормализации и отождествления противоположных нормалей. p, -p и Plane(p.Normal * 2, p.D * 2) могут задавать одно множество точек, но не равны по коэффициентам. Оператор != отрицает точное равенство.

Параметры
ИмяТипПо умолчанию
leftPlane—
rightPlane—
left

Левая плоскость.

right

Правая плоскость.

Возвращает bool

true при неравенстве коэффициентов.

op_UnaryNegationPlane
# op_UnaryNegation
C#
public static Plane operator -(Plane plane);

Возвращает Plane(-Normal, -D): геометрическое положение сохраняется, направление нормали и знаки DistanceTo меняются на противоположные. Отрицать только Normal при прежнем D — другое преобразование.

Параметры
ИмяТипПо умолчанию
planePlane—
plane

Исходная плоскость.

Возвращает Plane

Новая копия с противоположными Normal и D.

op_UnaryPlusPlane
# op_UnaryPlus
C#
public static Plane operator +(Plane plane);

Возвращает неизменённое значение Plane. Не нормализует коэффициенты и не меняет их знаки.

Параметры
ИмяТипПо умолчанию
planePlane—
plane

Исходная плоскость.

Возвращает Plane

Новая копия с прежними коэффициентами.

Документация Reckfell EngineНаверх ↑
БЫСТРЫЙ ПЕРЕХОДНачало работыEntity и иерархияC# & .NET 10Сцены и префабы
Руководства и полный API Reckfell K
reckfellENGINE
RECKFELL ACCOUNT

Вход в аккаунт

Войдите в аккаунт Reckfell.

Один аккаунт для всей платформы Reckfell.