Curve3D
Локальная 3D Bezier-кривая с управляющими handles и CPU-кешем длины/ориентации.
Добавьте точки и относительные in/out handles, затем выбирайте способ выборки: Sample(idx,t) — параметр одного сегмента; Samplef — индекс плюс дробь; SampleBaked(offset) — локальное расстояние по аппроксимации. Для движения со скоростью в локальных единицах накапливайте расстояние, а не считайте t временем или долей всей длины.
Запечённые данные пересчитываются лениво после правок. BakeInterval управляет плотностью, но длина остаётся приближённой. SampleBaked ограничивает расстояние, не зацикливает даже Closed. У замкнутой кривой Samplef(PointCount) имеет особое граничное поведение; используйте явный конец последнего сегмента или GetBakedLength для конца петли.
Tilt задаётся в радианах и применяется по флагу. Frame направлен вперёд через −Basis.Z. Все результаты локальны: Path3D transform и масштаб сами в них не применяются. _Data — внутренний контейнер с обязательными согласованными длинами, не пользовательский формат ввода.
Проверены невырожденные малые кривые, cache/handles, closure, ориентация и valid data roundtrip в Windows headless. Вырожденная геометрия, malformed data, точная аналитическая длина, допуски всех tessellation и графика не доказаны.
Объявления сверены с C# SDK 1.0.0. Раскройте имя, чтобы увидеть сигнатуры и описание.
Конструкторы1
Curve3DКонструктор
public Curve3D();Создаёт собственный пустой ресурс кривой: Closed=false, BakeInterval=0.2, UpVectorEnabled=true. Добавьте управляющие точки до выборки. Кривая хранит локальные данные, не двигает Entity и не строит коллизии. Dispose ресурс после использования.
Свойства5
BakeIntervalСвойство
public float BakeInterval { get; set; }Положительный конечный масштаб плотности CPU-кеша, default 0.2 в локальных единицах. Меньше обычно даёт больше samples и расход памяти/CPU. Это не обещание абсолютно равного шага или точной аналитической длины: подразделение ограничено глубиной. Setter не проверяет положительность/конечность за вас.
ClosedСвойство
public bool Closed { get; set; }Добавляет сегмент от последней управляющей точки к первой, не дублируя точку в PointCount. Нужны хотя бы две осмысленные точки. Не включает автоматическое зацикливание SampleBaked: расстояние по-прежнему ограничивается концами. RemovePoint при числе <2 снимает Closed, а PointCount/ClearPoints могут сохранить флаг.
PointCountСвойство
public int PointCount { get; set; }Количество управляющих точек, не baked-сэмплов. Рост добавляет нулевые позиции/handles/tilt, уменьшение отбрасывает конец. По одной новой точке может приходить Changed; это не атомарная замена готового пути. Уменьшение через PointCount не снимает Closed автоматически — проверьте конфигурацию сами.
UpVectorEnabledСвойство
public bool UpVectorEnabled { get; set; }Включает вычисление up-векторов в baked-кеше, default true. Нужен для устойчивого направления «вверх» вдоль пути и SampleBakedUpVector. Выключение экономит часть кеша; frame sampling использует запасной Vector3.Up, что не гарантирует устойчивость вертикальных/вырожденных кривых. Не управляет гравитацией.
_DataСвойство
public Reckfell.Collections.Dictionary _Data { get; set; }Внутренний контейнер данных: points — Vector3[] тройками in/out/position, tilts — float[] по одной записи на точку. Getter создаёт Dictionary-снимок; setter требует согласованных длин. Недостаточная длина tilts не является безопасно проверенным вводом. Для обычного кода используйте методы точек, для сохранения — ресурсы; это не стабильный внешний формат. Собственный Dictionary wrapper Dispose после чтения.
Методы32
AddPointvoid
public void AddPoint(Vector3 position, Vector3? @in = default, Vector3? @out = default, int index = -1);Добавляет управляющую точку с локальной позицией и относительными handles in/out. Nullable handles default дают Vector3.Zero. index в [0,PointCount) вставляет перед точкой; отрицательный или вне диапазона добавляет в конец. Изменяет индексы следующих точек, помечает кеш dirty и испускает Changed.
| Имя | Тип | По умолчанию |
|---|---|---|
position | Vector3 | — |
in | Vector3? | default |
out | Vector3? | default |
index | int | -1 |
positionКонечная локальная позиция; у SetPointIn/Out это относительный handle, а не endpoint.
inОтносительный входящий handle; null/default означает Vector3.Zero.
outОтносительный исходящий handle; null/default означает Vector3.Zero.
indexИндекс вставки перед существующей точкой; вне диапазона добавляет в конец.
ClearPointsvoid
public void ClearPoints();Удаляет все управляющие точки; следующий baked-запрос пересчитает пустой кеш. Сохраняет настройки, включая Closed. Не вызывайте Sample/ориентацию пустой кривой; GetBakedLength возвращает 0.
GetBakeIntervalfloat
public float GetBakeInterval();Читает BakeInterval. Положительный конечный масштаб плотности CPU-кеша, default 0.2 в локальных единицах. Меньше обычно даёт больше samples и расход памяти/CPU. Это не обещание абсолютно равного шага или точной аналитической длины: подразделение ограничено глубиной. Setter не проверяет положительность/конечность за вас.
floatСохранённая настройка указанного метода; единицы приведены в описании.
GetBakedLengthfloat
public float GetBakedLength();Лениво обновляет CPU-кеш и возвращает приближённую длину baked-полилинии в локальных единицах. Для пустой/одноточечной кривой 0; Closed включает замыкание. Масштаб Path3D автоматически в эту длину не входит.
floatПриближённая локальная длина CPU-кеша, 0 для пустой/одноточечной кривой.
GetBakedPointsVector3[]
public Vector3[] GetBakedPoints();Возвращает независимый C# массив локальных позиций кеша, при необходимости сначала пересчитывая его. Индекс массива не является индексом управляющей точки. Это выборка аппроксимации, не исходные handles.
Vector3[]Новый независимый C# массив указанных baked/полилинейных данных.
GetBakedTiltsfloat[]
public float[] GetBakedTilts();Возвращает массив tilt в радианах, согласованный с baked-позициями. Не список только управляющих tilt и не автоматическое применение roll к Entity.
float[]Новый независимый C# массив указанных baked/полилинейных данных.
GetBakedUpVectorsVector3[]
public Vector3[] GetBakedUpVectors();Возвращает массив up-векторов baked-кеша; при UpVectorEnabled=false пустой. Это данные ориентации, не нормали поверхности terrain. Изменение массива не редактирует кривую.
Vector3[]Новый независимый C# массив указанных baked/полилинейных данных.
GetClosestOffsetfloat
public float GetClosestOffset(Vector3 toPoint);Возвращает локальное расстояние вдоль baked-полилинии до ближайшей проекции toPoint. Это не поперечная дистанция до кривой и не сегментный t. Может потребовать полного перебора кеша.
| Имя | Тип | По умолчанию |
|---|---|---|
toPoint | Vector3 | — |
toPointКонечная точка в локальной системе координат кривой.
floatРасстояние вдоль baked-пути до ближайшей проекции.
GetClosestPointVector3
public Vector3 GetClosestPoint(Vector3 toPoint);Проецирует локальную toPoint на baked-полилинию перебором её сегментов. Это приближение к кривой, не физический raycast и не гарантированное решение для вырожденных сегментов. Для world-точки сначала используйте Path3D.ToLocal; результат при необходимости переведите ToGlobal.
| Имя | Тип | По умолчанию |
|---|---|---|
toPoint | Vector3 | — |
toPointКонечная точка в локальной системе координат кривой.
Vector3Локальный вектор/позиция указанной выборки; диагностику ошибки не игнорируйте.
GetPointCountint
public int GetPointCount();Читает число управляющих точек, включая обе крайние у открытой кривой. Это не число сегментов или baked-сэмплов.
intКоличество управляющих точек, не baked samples.
GetPointInVector3
public Vector3 GetPointIn(int idx);Читает входящий handle как вектор относительно позиции этой точки. Абсолютная контрольная позиция Bezier = GetPointPosition(idx)+GetPointIn(idx).
| Имя | Тип | По умолчанию |
|---|---|---|
idx | int | — |
idxСуществующий индекс управляющей точки; у Sample — индекс сегмента.
Vector3Локальный вектор/позиция указанной выборки; диагностику ошибки не игнорируйте.
GetPointOutVector3
public Vector3 GetPointOut(int idx);Читает исходящий handle относительно позиции точки. Это не следующий endpoint и не world-координата.
| Имя | Тип | По умолчанию |
|---|---|---|
idx | int | — |
idxСуществующий индекс управляющей точки; у Sample — индекс сегмента.
Vector3Локальный вектор/позиция указанной выборки; диагностику ошибки не игнорируйте.
GetPointPositionVector3
public Vector3 GetPointPosition(int idx);Читает локальную позицию существующей управляющей точки. Не возвращает её world-позицию или ближайший baked sample.
| Имя | Тип | По умолчанию |
|---|---|---|
idx | int | — |
idxСуществующий индекс управляющей точки; у Sample — индекс сегмента.
Vector3Локальный вектор/позиция указанной выборки; диагностику ошибки не игнорируйте.
GetPointTiltfloat
public float GetPointTilt(int idx);Читает наклон управляющей точки в радианах. Это roll вокруг направления пути, а не градусы Euler для Entity.
| Имя | Тип | По умолчанию |
|---|---|---|
idx | int | — |
idxСуществующий индекс управляющей точки; у Sample — индекс сегмента.
floatСохранённый tilt в радианах.
IsClosedbool
public bool IsClosed();Читает Closed. Добавляет сегмент от последней управляющей точки к первой, не дублируя точку в PointCount. Нужны хотя бы две осмысленные точки. Не включает автоматическое зацикливание SampleBaked: расстояние по-прежнему ограничивается концами. RemovePoint при числе <2 снимает Closed, а PointCount/ClearPoints могут сохранить флаг.
boolТекущее значение указанного флага, не гарантия пригодности геометрии.
IsUpVectorEnabledbool
public bool IsUpVectorEnabled();Читает UpVectorEnabled. Включает вычисление up-векторов в baked-кеше, default true. Нужен для устойчивого направления «вверх» вдоль пути и SampleBakedUpVector. Выключение экономит часть кеша; frame sampling использует запасной Vector3.Up, что не гарантирует устойчивость вертикальных/вырожденных кривых. Не управляет гравитацией.
boolТекущее значение указанного флага, не гарантия пригодности геометрии.
RemovePointvoid
public void RemovePoint(int idx);Удаляет существующий индекс и сдвигает следующие. При Closed и остатке <2 точек открывает кривую. Это отличается от уменьшения PointCount; кеш инвалидируется и приходит Changed.
| Имя | Тип | По умолчанию |
|---|---|---|
idx | int | — |
idxСуществующий индекс управляющей точки; у Sample — индекс сегмента.
SampleVector3
public Vector3 Sample(int idx, float t);Вычисляет Bezier-позицию сегмента idx по параметру t, обычно 0..1. Это не расстояние и не постоянная скорость: даже с нулевыми handles t=0.25 не означает четверть длины. У открытой кривой сегменты 0..PointCount−2, у Closed добавлен последний→первый. Крайние вне-сегментные индексы могут вернуть endpoint, но используйте корректный индекс; t не следует считать автоматически ограниченным.
| Имя | Тип | По умолчанию |
|---|---|---|
idx | int | — |
t | float | — |
idxСуществующий индекс управляющей точки; у Sample — индекс сегмента.
tПараметр Bezier-сегмента, обычно 0..1; не расстояние и не elapsed time.
Vector3Локальный вектор/позиция указанной выборки; диагностику ошибки не игнорируйте.
SampleBakedVector3
public Vector3 SampleBaked(float offset = 0f, bool cubic = false);Выбирает позицию по конечному расстоянию offset вдоль baked-кеша. Ограничивает его 0..GetBakedLength(), не зацикливает даже Closed. cubic=true интерполирует кеш кубически; это не точная исходная Bezier-выборка и может отличаться от линейной. Сначала добавьте точки.
| Имя | Тип | По умолчанию |
|---|---|---|
offset | float | 0f |
cubic | bool | false |
offsetКонечное расстояние в локальных единицах вдоль baked-кеша, не normalized ratio.
cubictrue включает кубическую интерполяцию кеша, default false; исходный Bezier не восстанавливает точно.
Vector3Локальный вектор/позиция указанной выборки; диагностику ошибки не игнорируйте.
SampleBakedUpVectorVector3
public Vector3 SampleBakedUpVector(float offset, bool applyTilt = false);Выбирает локальный up-вектор на расстоянии offset; требуется UpVectorEnabled и пригодный кеш. applyTilt по умолчанию false. Не используйте для пустой/вырожденной кривой и не считайте fallback Vector3.Up доказательством успешной выборки при диагностике.
| Имя | Тип | По умолчанию |
|---|---|---|
offset | float | — |
applyTilt | bool | false |
offsetКонечное расстояние в локальных единицах вдоль baked-кеша, не normalized ratio.
applyTilttrue применяет tilt в радианах к frame/up-vector; default false.
Vector3Локальный вектор/позиция указанной выборки; диагностику ошибки не игнорируйте.
SampleBakedWithRotationTransform3D
public Transform3D SampleBakedWithRotation(float offset = 0f, bool cubic = false, bool applyTilt = false);Возвращает локальный Transform3D: Origin — baked-позиция, Basis — frame ориентации; направление вперёд соответствует −Basis.Z. applyTilt включает roll в радианах. Для осмысленной ориентации нужны минимум две невырожденные точки; одна точка даёт диагностику. Не присваивает transform Entity автоматически.
| Имя | Тип | По умолчанию |
|---|---|---|
offset | float | 0f |
cubic | bool | false |
applyTilt | bool | false |
offsetКонечное расстояние в локальных единицах вдоль baked-кеша, не normalized ratio.
cubictrue включает кубическую интерполяцию кеша, default false; исходный Bezier не восстанавливает точно.
applyTilttrue применяет tilt в радианах к frame/up-vector; default false.
Transform3DЛокальный Transform3D с forward=−Basis.Z; не world transform.
SamplefVector3
public Vector3 Samplef(float fofs);Использует целую часть fofs как индекс сегмента, дробную — как t. Это не нормализованная длина всей кривой. В 1.0.0 у Closed Samplef(PointCount) даёт начало последнего сегмента, не конец петли. Для конца замыкания используйте Sample(PointCount−1,1) или SampleBaked(GetBakedLength()).
| Имя | Тип | По умолчанию |
|---|---|---|
fofs | float | — |
fofsИндекс сегмента плюс дробный t; для Closed избегайте целой верхней границы PointCount.
Vector3Локальный вектор/позиция указанной выборки; диагностику ошибки не игнорируйте.
SetBakeIntervalvoid
public void SetBakeInterval(float distance);Устанавливает BakeInterval. Положительный конечный масштаб плотности CPU-кеша, default 0.2 в локальных единицах. Меньше обычно даёт больше samples и расход памяти/CPU. Это не обещание абсолютно равного шага или точной аналитической длины: подразделение ограничено глубиной. Setter не проверяет положительность/конечность за вас.
| Имя | Тип | По умолчанию |
|---|---|---|
distance | float | — |
distanceПоложительный конечный BakeInterval; setter не валидирует за вас.
SetClosedvoid
public void SetClosed(bool closed);Устанавливает Closed. Добавляет сегмент от последней управляющей точки к первой, не дублируя точку в PointCount. Нужны хотя бы две осмысленные точки. Не включает автоматическое зацикливание SampleBaked: расстояние по-прежнему ограничивается концами. RemovePoint при числе <2 снимает Closed, а PointCount/ClearPoints могут сохранить флаг.
| Имя | Тип | По умолчанию |
|---|---|---|
closed | bool | — |
closedtrue добавляет последний→первый сегмент; не включает wrapping расстояния.
SetPointCountvoid
public void SetPointCount(int count);Устанавливает PointCount. Количество управляющих точек, не baked-сэмплов. Рост добавляет нулевые позиции/handles/tilt, уменьшение отбрасывает конец. По одной новой точке может приходить Changed; это не атомарная замена готового пути. Уменьшение через PointCount не снимает Closed автоматически — проверьте конфигурацию сами.
| Имя | Тип | По умолчанию |
|---|---|---|
count | int | — |
countНеотрицательное количество управляющих точек; рост добавляет нулевые данные.
SetPointInvoid
public void SetPointIn(int idx, Vector3 position);Задаёт относительный входящий handle существующей точки. У первой точки открытой кривой он не формирует предыдущий сегмент; для Closed используется замыкающим сегментом. Инвалидирует кеш.
| Имя | Тип | По умолчанию |
|---|---|---|
idx | int | — |
position | Vector3 | — |
idxСуществующий индекс управляющей точки; у Sample — индекс сегмента.
positionКонечная локальная позиция; у SetPointIn/Out это относительный handle, а не endpoint.
SetPointOutvoid
public void SetPointOut(int idx, Vector3 position);Задаёт относительный исходящий handle существующей точки. У последней точки открытой кривой он не создаёт дополнительный сегмент; Closed использует его для возврата к первой. Инвалидирует кеш.
| Имя | Тип | По умолчанию |
|---|---|---|
idx | int | — |
position | Vector3 | — |
idxСуществующий индекс управляющей точки; у Sample — индекс сегмента.
positionКонечная локальная позиция; у SetPointIn/Out это относительный handle, а не endpoint.
SetPointPositionvoid
public void SetPointPosition(int idx, Vector3 position);Меняет локальную позицию существующей точки, сохраняя относительные handles/tilt. Инвалидирует CPU-кеш и испускает Changed. Если ресурс общий, изменение увидят все владельцы.
| Имя | Тип | По умолчанию |
|---|---|---|
idx | int | — |
position | Vector3 | — |
idxСуществующий индекс управляющей точки; у Sample — индекс сегмента.
positionКонечная локальная позиция; у SetPointIn/Out это относительный handle, а не endpoint.
SetPointTiltvoid
public void SetPointTilt(int idx, float tilt);Задаёт конечный tilt в радианах и инвалидирует кеш. В выборке ориентации наклон учитывается только при applyTilt=true; сама позиция от него не меняется.
| Имя | Тип | По умолчанию |
|---|---|---|
idx | int | — |
tilt | float | — |
idxСуществующий индекс управляющей точки; у Sample — индекс сегмента.
tiltКонечный roll в радианах, не градусах.
SetUpVectorEnabledvoid
public void SetUpVectorEnabled(bool enable);Устанавливает UpVectorEnabled. Включает вычисление up-векторов в baked-кеше, default true. Нужен для устойчивого направления «вверх» вдоль пути и SampleBakedUpVector. Выключение экономит часть кеша; frame sampling использует запасной Vector3.Up, что не гарантирует устойчивость вертикальных/вырожденных кривых. Не управляет гравитацией.
| Имя | Тип | По умолчанию |
|---|---|---|
enable | bool | — |
enableВключает baked up-векторы; не управляет world-up или гравитацией.
TessellateVector3[]
public Vector3[] Tessellate(int maxStages = 5, float toleranceDegrees = 4f);Возвращает локальную полилинию адаптивного подразделения по угловому критерию toleranceDegrees. maxStages ограничивает глубину, не точное число точек. Не меняет управляющие точки и не обещает равные интервалы/точную длину. Для closed результат содержит возврат к первой.
| Имя | Тип | По умолчанию |
|---|---|---|
maxStages | int | 5 |
toleranceDegrees | float | 4f |
maxStagesРазумная неотрицательная глубина подразделения; больше означает больше работы/памяти.
toleranceDegreesПоложительный конечный угловой допуск в градусах; ограничен maxStages.
Vector3[]Новый независимый C# массив указанных baked/полилинейных данных.
TessellateEvenLengthVector3[]
public Vector3[] TessellateEvenLength(int maxStages = 5, float toleranceLength = 0.2f);Возвращает локальную полилинию подразделения по длине toleranceLength с ограничением maxStages. «Even» не является гарантией строго одинакового шага или соблюдения допуска после достижения предела глубины. Минимум две точки; исходные данные не меняет.
| Имя | Тип | По умолчанию |
|---|---|---|
maxStages | int | 5 |
toleranceLength | float | 0.2f |
maxStagesРазумная неотрицательная глубина подразделения; больше означает больше работы/памяти.
toleranceLengthПоложительный конечный критерий длины в локальных единицах; ограничен maxStages.
Vector3[]Новый независимый C# массив указанных baked/полилинейных данных.