reckfellENGINE

Curve3D

Локальная 3D Bezier-кривая с управляющими handles и CPU-кешем длины/ориентации.

На этой странице
class Curve3DReckfellSharpНаследует Resource

Добавьте точки и относительные 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Конструктор
# Curve3D
C#
public Curve3D();

Создаёт собственный пустой ресурс кривой: Closed=false, BakeInterval=0.2, UpVectorEnabled=true. Добавьте управляющие точки до выборки. Кривая хранит локальные данные, не двигает Entity и не строит коллизии. Dispose ресурс после использования.

Свойства5

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

Положительный конечный масштаб плотности CPU-кеша, default 0.2 в локальных единицах. Меньше обычно даёт больше samples и расход памяти/CPU. Это не обещание абсолютно равного шага или точной аналитической длины: подразделение ограничено глубиной. Setter не проверяет положительность/конечность за вас.

ClosedСвойство
# Closed
C#
public bool Closed { get; set; }

Добавляет сегмент от последней управляющей точки к первой, не дублируя точку в PointCount. Нужны хотя бы две осмысленные точки. Не включает автоматическое зацикливание SampleBaked: расстояние по-прежнему ограничивается концами. RemovePoint при числе <2 снимает Closed, а PointCount/ClearPoints могут сохранить флаг.

PointCountСвойство
# PointCount
C#
public int PointCount { get; set; }

Количество управляющих точек, не baked-сэмплов. Рост добавляет нулевые позиции/handles/tilt, уменьшение отбрасывает конец. По одной новой точке может приходить Changed; это не атомарная замена готового пути. Уменьшение через PointCount не снимает Closed автоматически — проверьте конфигурацию сами.

UpVectorEnabledСвойство
# UpVectorEnabled
C#
public bool UpVectorEnabled { get; set; }

Включает вычисление up-векторов в baked-кеше, default true. Нужен для устойчивого направления «вверх» вдоль пути и SampleBakedUpVector. Выключение экономит часть кеша; frame sampling использует запасной Vector3.Up, что не гарантирует устойчивость вертикальных/вырожденных кривых. Не управляет гравитацией.

_DataСвойство
# _Data
C#
public Reckfell.Collections.Dictionary _Data { get; set; }

Внутренний контейнер данных: points — Vector3[] тройками in/out/position, tilts — float[] по одной записи на точку. Getter создаёт Dictionary-снимок; setter требует согласованных длин. Недостаточная длина tilts не является безопасно проверенным вводом. Для обычного кода используйте методы точек, для сохранения — ресурсы; это не стабильный внешний формат. Собственный Dictionary wrapper Dispose после чтения.

Методы32

AddPointvoid
# AddPoint
C#
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.

Параметры
ИмяТипПо умолчанию
positionVector3—
inVector3?default
outVector3?default
indexint-1
position

Конечная локальная позиция; у SetPointIn/Out это относительный handle, а не endpoint.

in

Относительный входящий handle; null/default означает Vector3.Zero.

out

Относительный исходящий handle; null/default означает Vector3.Zero.

index

Индекс вставки перед существующей точкой; вне диапазона добавляет в конец.

ClearPointsvoid
# ClearPoints
C#
public void ClearPoints();

Удаляет все управляющие точки; следующий baked-запрос пересчитает пустой кеш. Сохраняет настройки, включая Closed. Не вызывайте Sample/ориентацию пустой кривой; GetBakedLength возвращает 0.

GetBakeIntervalfloat
# GetBakeInterval
C#
public float GetBakeInterval();

Читает BakeInterval. Положительный конечный масштаб плотности CPU-кеша, default 0.2 в локальных единицах. Меньше обычно даёт больше samples и расход памяти/CPU. Это не обещание абсолютно равного шага или точной аналитической длины: подразделение ограничено глубиной. Setter не проверяет положительность/конечность за вас.

Возвращает float

Сохранённая настройка указанного метода; единицы приведены в описании.

GetBakedLengthfloat
# GetBakedLength
C#
public float GetBakedLength();

Лениво обновляет CPU-кеш и возвращает приближённую длину baked-полилинии в локальных единицах. Для пустой/одноточечной кривой 0; Closed включает замыкание. Масштаб Path3D автоматически в эту длину не входит.

Возвращает float

Приближённая локальная длина CPU-кеша, 0 для пустой/одноточечной кривой.

GetBakedPointsVector3[]
# GetBakedPoints
C#
public Vector3[] GetBakedPoints();

Возвращает независимый C# массив локальных позиций кеша, при необходимости сначала пересчитывая его. Индекс массива не является индексом управляющей точки. Это выборка аппроксимации, не исходные handles.

Возвращает Vector3[]

Новый независимый C# массив указанных baked/полилинейных данных.

GetBakedTiltsfloat[]
# GetBakedTilts
C#
public float[] GetBakedTilts();

Возвращает массив tilt в радианах, согласованный с baked-позициями. Не список только управляющих tilt и не автоматическое применение roll к Entity.

Возвращает float[]

Новый независимый C# массив указанных baked/полилинейных данных.

GetBakedUpVectorsVector3[]
# GetBakedUpVectors
C#
public Vector3[] GetBakedUpVectors();

Возвращает массив up-векторов baked-кеша; при UpVectorEnabled=false пустой. Это данные ориентации, не нормали поверхности terrain. Изменение массива не редактирует кривую.

Возвращает Vector3[]

Новый независимый C# массив указанных baked/полилинейных данных.

GetClosestOffsetfloat
# GetClosestOffset
C#
public float GetClosestOffset(Vector3 toPoint);

Возвращает локальное расстояние вдоль baked-полилинии до ближайшей проекции toPoint. Это не поперечная дистанция до кривой и не сегментный t. Может потребовать полного перебора кеша.

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

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

Возвращает float

Расстояние вдоль baked-пути до ближайшей проекции.

GetClosestPointVector3
# GetClosestPoint
C#
public Vector3 GetClosestPoint(Vector3 toPoint);

Проецирует локальную toPoint на baked-полилинию перебором её сегментов. Это приближение к кривой, не физический raycast и не гарантированное решение для вырожденных сегментов. Для world-точки сначала используйте Path3D.ToLocal; результат при необходимости переведите ToGlobal.

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

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

Возвращает Vector3

Локальный вектор/позиция указанной выборки; диагностику ошибки не игнорируйте.

GetPointCountint
# GetPointCount
C#
public int GetPointCount();

Читает число управляющих точек, включая обе крайние у открытой кривой. Это не число сегментов или baked-сэмплов.

Возвращает int

Количество управляющих точек, не baked samples.

GetPointInVector3
# GetPointIn
C#
public Vector3 GetPointIn(int idx);

Читает входящий handle как вектор относительно позиции этой точки. Абсолютная контрольная позиция Bezier = GetPointPosition(idx)+GetPointIn(idx).

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

Существующий индекс управляющей точки; у Sample — индекс сегмента.

Возвращает Vector3

Локальный вектор/позиция указанной выборки; диагностику ошибки не игнорируйте.

GetPointOutVector3
# GetPointOut
C#
public Vector3 GetPointOut(int idx);

Читает исходящий handle относительно позиции точки. Это не следующий endpoint и не world-координата.

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

Существующий индекс управляющей точки; у Sample — индекс сегмента.

Возвращает Vector3

Локальный вектор/позиция указанной выборки; диагностику ошибки не игнорируйте.

GetPointPositionVector3
# GetPointPosition
C#
public Vector3 GetPointPosition(int idx);

Читает локальную позицию существующей управляющей точки. Не возвращает её world-позицию или ближайший baked sample.

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

Существующий индекс управляющей точки; у Sample — индекс сегмента.

Возвращает Vector3

Локальный вектор/позиция указанной выборки; диагностику ошибки не игнорируйте.

GetPointTiltfloat
# GetPointTilt
C#
public float GetPointTilt(int idx);

Читает наклон управляющей точки в радианах. Это roll вокруг направления пути, а не градусы Euler для Entity.

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

Существующий индекс управляющей точки; у Sample — индекс сегмента.

Возвращает float

Сохранённый tilt в радианах.

IsClosedbool
# IsClosed
C#
public bool IsClosed();

Читает Closed. Добавляет сегмент от последней управляющей точки к первой, не дублируя точку в PointCount. Нужны хотя бы две осмысленные точки. Не включает автоматическое зацикливание SampleBaked: расстояние по-прежнему ограничивается концами. RemovePoint при числе <2 снимает Closed, а PointCount/ClearPoints могут сохранить флаг.

Возвращает bool

Текущее значение указанного флага, не гарантия пригодности геометрии.

IsUpVectorEnabledbool
# IsUpVectorEnabled
C#
public bool IsUpVectorEnabled();

Читает UpVectorEnabled. Включает вычисление up-векторов в baked-кеше, default true. Нужен для устойчивого направления «вверх» вдоль пути и SampleBakedUpVector. Выключение экономит часть кеша; frame sampling использует запасной Vector3.Up, что не гарантирует устойчивость вертикальных/вырожденных кривых. Не управляет гравитацией.

Возвращает bool

Текущее значение указанного флага, не гарантия пригодности геометрии.

RemovePointvoid
# RemovePoint
C#
public void RemovePoint(int idx);

Удаляет существующий индекс и сдвигает следующие. При Closed и остатке <2 точек открывает кривую. Это отличается от уменьшения PointCount; кеш инвалидируется и приходит Changed.

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

Существующий индекс управляющей точки; у Sample — индекс сегмента.

SampleVector3
# Sample
C#
public Vector3 Sample(int idx, float t);

Вычисляет Bezier-позицию сегмента idx по параметру t, обычно 0..1. Это не расстояние и не постоянная скорость: даже с нулевыми handles t=0.25 не означает четверть длины. У открытой кривой сегменты 0..PointCount−2, у Closed добавлен последний→первый. Крайние вне-сегментные индексы могут вернуть endpoint, но используйте корректный индекс; t не следует считать автоматически ограниченным.

Параметры
ИмяТипПо умолчанию
idxint—
tfloat—
idx

Существующий индекс управляющей точки; у Sample — индекс сегмента.

t

Параметр Bezier-сегмента, обычно 0..1; не расстояние и не elapsed time.

Возвращает Vector3

Локальный вектор/позиция указанной выборки; диагностику ошибки не игнорируйте.

SampleBakedVector3
# SampleBaked
C#
public Vector3 SampleBaked(float offset = 0f, bool cubic = false);

Выбирает позицию по конечному расстоянию offset вдоль baked-кеша. Ограничивает его 0..GetBakedLength(), не зацикливает даже Closed. cubic=true интерполирует кеш кубически; это не точная исходная Bezier-выборка и может отличаться от линейной. Сначала добавьте точки.

Параметры
ИмяТипПо умолчанию
offsetfloat0f
cubicboolfalse
offset

Конечное расстояние в локальных единицах вдоль baked-кеша, не normalized ratio.

cubic

true включает кубическую интерполяцию кеша, default false; исходный Bezier не восстанавливает точно.

Возвращает Vector3

Локальный вектор/позиция указанной выборки; диагностику ошибки не игнорируйте.

SampleBakedUpVectorVector3
# SampleBakedUpVector
C#
public Vector3 SampleBakedUpVector(float offset, bool applyTilt = false);

Выбирает локальный up-вектор на расстоянии offset; требуется UpVectorEnabled и пригодный кеш. applyTilt по умолчанию false. Не используйте для пустой/вырожденной кривой и не считайте fallback Vector3.Up доказательством успешной выборки при диагностике.

Параметры
ИмяТипПо умолчанию
offsetfloat—
applyTiltboolfalse
offset

Конечное расстояние в локальных единицах вдоль baked-кеша, не normalized ratio.

applyTilt

true применяет tilt в радианах к frame/up-vector; default false.

Возвращает Vector3

Локальный вектор/позиция указанной выборки; диагностику ошибки не игнорируйте.

SampleBakedWithRotationTransform3D
# SampleBakedWithRotation
C#
public Transform3D SampleBakedWithRotation(float offset = 0f, bool cubic = false, bool applyTilt = false);

Возвращает локальный Transform3D: Origin — baked-позиция, Basis — frame ориентации; направление вперёд соответствует −Basis.Z. applyTilt включает roll в радианах. Для осмысленной ориентации нужны минимум две невырожденные точки; одна точка даёт диагностику. Не присваивает transform Entity автоматически.

Параметры
ИмяТипПо умолчанию
offsetfloat0f
cubicboolfalse
applyTiltboolfalse
offset

Конечное расстояние в локальных единицах вдоль baked-кеша, не normalized ratio.

cubic

true включает кубическую интерполяцию кеша, default false; исходный Bezier не восстанавливает точно.

applyTilt

true применяет tilt в радианах к frame/up-vector; default false.

Возвращает Transform3D

Локальный Transform3D с forward=−Basis.Z; не world transform.

SamplefVector3
# Samplef
C#
public Vector3 Samplef(float fofs);

Использует целую часть fofs как индекс сегмента, дробную — как t. Это не нормализованная длина всей кривой. В 1.0.0 у Closed Samplef(PointCount) даёт начало последнего сегмента, не конец петли. Для конца замыкания используйте Sample(PointCount−1,1) или SampleBaked(GetBakedLength()).

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

Индекс сегмента плюс дробный t; для Closed избегайте целой верхней границы PointCount.

Возвращает Vector3

Локальный вектор/позиция указанной выборки; диагностику ошибки не игнорируйте.

SetBakeIntervalvoid
# SetBakeInterval
C#
public void SetBakeInterval(float distance);

Устанавливает BakeInterval. Положительный конечный масштаб плотности CPU-кеша, default 0.2 в локальных единицах. Меньше обычно даёт больше samples и расход памяти/CPU. Это не обещание абсолютно равного шага или точной аналитической длины: подразделение ограничено глубиной. Setter не проверяет положительность/конечность за вас.

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

Положительный конечный BakeInterval; setter не валидирует за вас.

SetClosedvoid
# SetClosed
C#
public void SetClosed(bool closed);

Устанавливает Closed. Добавляет сегмент от последней управляющей точки к первой, не дублируя точку в PointCount. Нужны хотя бы две осмысленные точки. Не включает автоматическое зацикливание SampleBaked: расстояние по-прежнему ограничивается концами. RemovePoint при числе <2 снимает Closed, а PointCount/ClearPoints могут сохранить флаг.

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

true добавляет последний→первый сегмент; не включает wrapping расстояния.

SetPointCountvoid
# SetPointCount
C#
public void SetPointCount(int count);

Устанавливает PointCount. Количество управляющих точек, не baked-сэмплов. Рост добавляет нулевые позиции/handles/tilt, уменьшение отбрасывает конец. По одной новой точке может приходить Changed; это не атомарная замена готового пути. Уменьшение через PointCount не снимает Closed автоматически — проверьте конфигурацию сами.

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

Неотрицательное количество управляющих точек; рост добавляет нулевые данные.

SetPointInvoid
# SetPointIn
C#
public void SetPointIn(int idx, Vector3 position);

Задаёт относительный входящий handle существующей точки. У первой точки открытой кривой он не формирует предыдущий сегмент; для Closed используется замыкающим сегментом. Инвалидирует кеш.

Параметры
ИмяТипПо умолчанию
idxint—
positionVector3—
idx

Существующий индекс управляющей точки; у Sample — индекс сегмента.

position

Конечная локальная позиция; у SetPointIn/Out это относительный handle, а не endpoint.

SetPointOutvoid
# SetPointOut
C#
public void SetPointOut(int idx, Vector3 position);

Задаёт относительный исходящий handle существующей точки. У последней точки открытой кривой он не создаёт дополнительный сегмент; Closed использует его для возврата к первой. Инвалидирует кеш.

Параметры
ИмяТипПо умолчанию
idxint—
positionVector3—
idx

Существующий индекс управляющей точки; у Sample — индекс сегмента.

position

Конечная локальная позиция; у SetPointIn/Out это относительный handle, а не endpoint.

SetPointPositionvoid
# SetPointPosition
C#
public void SetPointPosition(int idx, Vector3 position);

Меняет локальную позицию существующей точки, сохраняя относительные handles/tilt. Инвалидирует CPU-кеш и испускает Changed. Если ресурс общий, изменение увидят все владельцы.

Параметры
ИмяТипПо умолчанию
idxint—
positionVector3—
idx

Существующий индекс управляющей точки; у Sample — индекс сегмента.

position

Конечная локальная позиция; у SetPointIn/Out это относительный handle, а не endpoint.

SetPointTiltvoid
# SetPointTilt
C#
public void SetPointTilt(int idx, float tilt);

Задаёт конечный tilt в радианах и инвалидирует кеш. В выборке ориентации наклон учитывается только при applyTilt=true; сама позиция от него не меняется.

Параметры
ИмяТипПо умолчанию
idxint—
tiltfloat—
idx

Существующий индекс управляющей точки; у Sample — индекс сегмента.

tilt

Конечный roll в радианах, не градусах.

SetUpVectorEnabledvoid
# SetUpVectorEnabled
C#
public void SetUpVectorEnabled(bool enable);

Устанавливает UpVectorEnabled. Включает вычисление up-векторов в baked-кеше, default true. Нужен для устойчивого направления «вверх» вдоль пути и SampleBakedUpVector. Выключение экономит часть кеша; frame sampling использует запасной Vector3.Up, что не гарантирует устойчивость вертикальных/вырожденных кривых. Не управляет гравитацией.

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

Включает baked up-векторы; не управляет world-up или гравитацией.

TessellateVector3[]
# Tessellate
C#
public Vector3[] Tessellate(int maxStages = 5, float toleranceDegrees = 4f);

Возвращает локальную полилинию адаптивного подразделения по угловому критерию toleranceDegrees. maxStages ограничивает глубину, не точное число точек. Не меняет управляющие точки и не обещает равные интервалы/точную длину. Для closed результат содержит возврат к первой.

Параметры
ИмяТипПо умолчанию
maxStagesint5
toleranceDegreesfloat4f
maxStages

Разумная неотрицательная глубина подразделения; больше означает больше работы/памяти.

toleranceDegrees

Положительный конечный угловой допуск в градусах; ограничен maxStages.

Возвращает Vector3[]

Новый независимый C# массив указанных baked/полилинейных данных.

TessellateEvenLengthVector3[]
# TessellateEvenLength
C#
public Vector3[] TessellateEvenLength(int maxStages = 5, float toleranceLength = 0.2f);

Возвращает локальную полилинию подразделения по длине toleranceLength с ограничением maxStages. «Even» не является гарантией строго одинакового шага или соблюдения допуска после достижения предела глубины. Минимум две точки; исходные данные не меняет.

Параметры
ИмяТипПо умолчанию
maxStagesint5
toleranceLengthfloat0.2f
maxStages

Разумная неотрицательная глубина подразделения; больше означает больше работы/памяти.

toleranceLength

Положительный конечный критерий длины в локальных единицах; ограничен maxStages.

Возвращает Vector3[]

Новый независимый C# массив указанных baked/полилинейных данных.

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

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

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

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