Кривые
Что есть
- База
Curve<TOut, TPoint, TTime>с хранением списка точек и индексатором. - Bezier: F/D варианты в 1D/2D/3D (
FBezier1/2/3). Каждая опорная точка содержит forward/back-веса для ручек. - Catmull-Rom: F/D варианты в 1D/2D/3D (
FCatmullRom1/2/3), классическая формула с коэффициентом 0.5.
Bezier с ручками
var bezier = new FBezier3(new[]
{
new FBezier3.Point(
new FVector3(0, 0, 0), // Position
new FVector3(1, 0, 0), // WeightForward (ручка вперёд)
new FVector3(0, 0, 0)), // WeightBack (ручка назад)
new FBezier3.Point(
new FVector3(3, 1, 0),
new FVector3(0, 0, 0),
new FVector3(1, -1, 0))
});
var p = bezier.Compute(0.25f); // t масштабируется на сегмент между соседними точками
t < 0 и t > 1 экстраполируются линейно по задней/передней ручке крайней точки. На каждый отрезок приходится диапазон \(\Delta t = \frac{1}{\text{Count}-1}\).
Catmull-Rom
var knots = new[]
{
new FVector3(-1, 0, 0),
new FVector3(0, 1, 0),
new FVector3(1, 1, 0),
new FVector3(2, 0, 0)
};
var cr = new FCatmullRom3(knots); // нужно минимум 4 точки
var p = cr.Compute(0.5f); // t в [0,1] проходится по сегментам внутри массива
Количество сегментов = Count - 3; выбор t вне [0,1] не защищён — ограничивайте значение сами.
Практика
- Для Bezier задавайте forward/back ручки асимметрично, чтобы получать изломы без добавления новых опорных точек.
- Для Catmull-Rom при открытой кривой добавляйте дублированные крайние точки для мягкой тангенты (или отдельные граничные направляющие).
- Если нужна равномерная скорость, стройте таблицу длины дуги и перепараметризуйте t.
© 2026 Igdrasil Project. Все права защищены.