Mathf
Скалярная математика — функции «только с числами», к которым тянешься внутри кадрового цикла.
Mathf — это обычный объект с функциями и константами, ничего создавать не нужно. Векторы,
кватернионы и матрицы живут на Vec2 / Vec3, Quat и Mat4, а не здесь.
Обзор
const camX = Mathf.smoothDamp(0, 0.15) // следящий сглаживатель — создаётся ОДИН раз, вне цикла
setLoop(dt => {
cam.x = camX(player.x, dt) // критически задемпфированное слежение камеры
zoom = Mathf.damp(zoom, targetZoom, 10, dt) // экспоненциальное сглаживание без состояния
health = Mathf.clamp(health, 0, 100)
bar.width = Mathf.lerp(0, 200, Mathf.inverseLerp(0, maxCharge, charge))
})Константы и перевод углов
Mathf.PI // Math.PI
Mathf.TAU // 2π — полный оборот в радианах
Mathf.EPSILON // 1e-6
Mathf.DEG2RAD // π / 180
Mathf.RAD2DEG // 180 / π
Mathf.deg2rad(deg): number
Mathf.rad2deg(rad): numberDEG2RAD / RAD2DEG доступны и как «голые» глобалы времени компиляции (без префикса Mathf.).
Какие API принимают градусы, а какие радианы — смотрите в разделе Соглашения.
Диапазоны и интерполяция
Mathf.clamp(v, min, max): number
Mathf.clamp01(v): number // зажать в [0, 1]
Mathf.lerp(a, b, t): number // a + (b − a)·t
Mathf.inverseLerp(a, b, v): number // где v лежит в [a, b] как 0..1 (0, если a === b)
Mathf.remap(v, inMin, inMax, outMin, outMax): number // перенести v из одного диапазона в другой
Mathf.sign(x): number // -1, 0 или 1 (Math.sign)
Mathf.repeat(t, length): number // зациклить t в [0, length)
Mathf.pingPong(t, length): number // t «отскакивает» туда-обратно в [0, length]Сглаживание к значению
Mathf.moveTowards(a, b, maxDelta): number // линейный шаг, никогда не перелетает цель
Mathf.damp(a, b, lambda, dt): number // экспоненциальное приближение, не зависит от FPSdamp — это безопасная по частоте кадров замена a = lerp(a, b, 0.1) в цикле: lambda — скорость
(больше = резче; хорошие значения 5..15), dt — секунды на кадр. Функция без состояния — передавайте
ей обратно значение с прошлого кадра.
smoothDamp — критически задемпфированное слежение (как SmoothDamp в Unity)
Mathf.smoothDamp(initial: number, smoothTime, maxSpeed?): Damper<number>
Mathf.smoothDamp(initial: number[], smoothTime, maxSpeed?): Damper<number[]> // массивы vec2/vec3
const damper = Mathf.smoothDamp([0, 0], 0.15)
damper(target, dt) // вызывайте каждый кадр → новое сглаженное значение
damper.setValue(v) // задать внутреннее состояние (телепорт) — сбрасывает «резинку»Возвращает сглаживатель с состоянием, который сам отслеживает свою скорость, поэтому движение
плавно разгоняется и тормозит без перелёта. smoothTime — примерно время выхода на цель в секундах;
maxSpeed (по умолчанию Infinity) ограничивает скорость — для массивов ограничение применяется к
длине вектора, а не покомпонентно.
const follow = Mathf.smoothDamp([0, 0], 0.15)
setLoop(dt => { scene.camera.position = follow([player.x, player.y], dt) })Создавайте сглаживатель один раз, вне цикла. Новый сглаживатель каждый кадр сбрасывает скорость и
сводит сглаживание на нет. При телепортах вызывайте setValue, чтобы следящий объект не гнался за
целью со старого места.
Случайные числа
Mathf.random(min?, max?): number // дробное в [min, max); по умолчанию 0..1
Mathf.randomInt(min, max): number // целое, ВКЛЮЧАЯ оба концаСмотрите также
- Vec2 и Vec3 — векторные
lerp/ расстояние / нормализация живут на типах векторов. - Соглашения —
dtв секундах; правила «градусы против радианов».