LeCodesdocs

Mathf

Скалярная математика — функции «только с числами», к которым тянешься внутри кадрового цикла. Mathf — это обычный объект с функциями и константами, ничего создавать не нужно. Векторы, кватернионы и матрицы живут на Vec2 / Vec3, Quat и Mat4, а не здесь.

Обзор

TypeScript
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))
})

Константы и перевод углов

TypeScript
Mathf.PI            // Math.PI
Mathf.TAU           // 2π — полный оборот в радианах
Mathf.EPSILON       // 1e-6
Mathf.DEG2RAD       // π / 180
Mathf.RAD2DEG       // 180 / π
Mathf.deg2rad(deg): number
Mathf.rad2deg(rad): number
Заметка

DEG2RAD / RAD2DEG доступны и как «голые» глобалы времени компиляции (без префикса Mathf.). Какие API принимают градусы, а какие радианы — смотрите в разделе Соглашения.

Диапазоны и интерполяция

TypeScript
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]

Сглаживание к значению

TypeScript
Mathf.moveTowards(a, b, maxDelta): number         // линейный шаг, никогда не перелетает цель
Mathf.damp(a, b, lambda, dt): number              // экспоненциальное приближение, не зависит от FPS

damp — это безопасная по частоте кадров замена a = lerp(a, b, 0.1) в цикле: lambda — скорость (больше = резче; хорошие значения 5..15), dt — секунды на кадр. Функция без состояния — передавайте ей обратно значение с прошлого кадра.

smoothDamp — критически задемпфированное слежение (как SmoothDamp в Unity)

TypeScript
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) ограничивает скорость — для массивов ограничение применяется к длине вектора, а не покомпонентно.

TypeScript
const follow = Mathf.smoothDamp([0, 0], 0.15)
setLoop(dt => { scene.camera.position = follow([player.x, player.y], dt) })
Внимание

Создавайте сглаживатель один раз, вне цикла. Новый сглаживатель каждый кадр сбрасывает скорость и сводит сглаживание на нет. При телепортах вызывайте setValue, чтобы следящий объект не гнался за целью со старого места.

Случайные числа

TypeScript
Mathf.random(min?, max?): number      // дробное в [min, max); по умолчанию 0..1
Mathf.randomInt(min, max): number     // целое, ВКЛЮЧАЯ оба конца

Смотрите также

  • Vec2 и Vec3 — векторные lerp / расстояние / нормализация живут на типах векторов.
  • Соглашенияdt в секундах; правила «градусы против радианов».