Manual/ Referencia de la API

Mathf

Limitar, interpolar, suavizar, ángulos, trigonometría y ruido Perlin.

Funciones de números para juegos: limitar, interpolar, suavizar, ángulos que dan la vuelta y ruido. Complementa la librería math de Lua, que también está disponible.

local vida = Mathf.clamp(vida - dano, 0, 100)
local t = Mathf.inverseLerp(0, 100, vida)                 -- 0..1
local color = Vec3.lerp(Vec3(1, 0, 0), Vec3(0, 1, 0), t)  -- de rojo a verde
local altura = 2 + Mathf.sin(Time.time * 3) * 0.25        -- flotar arriba y abajo

Constantes

NombreValor
Mathf.pi, Mathf.tau3.14159... y 2π (una vuelta en radianes).
Mathf.deg2rad, Mathf.rad2degMultiplica para pasar de grados a radianes y al revés.
Mathf.infinity, Mathf.negativeInfinityInfinito (para empezar a buscar un mínimo o un máximo).
Mathf.epsilonUn número muy pequeño (0.000001).

Básicas

FunciónDescripción
Mathf.abs(v), Mathf.sign(v)Valor absoluto y signo (-1 o 1; el 0 da 1).
Mathf.min(a, b, ...), Mathf.max(a, b, ...)El menor o el mayor de dos o más números.
Mathf.floor(v), Mathf.ceil(v)Redondea hacia abajo o hacia arriba.
Mathf.round(v [, decimales])Redondea al más cercano: Mathf.round(3.14159, 2) = 3.14.
Mathf.sqrt(v), Mathf.pow(a, b), Mathf.exp(v)Raíz cuadrada, potencia y exponencial.
Mathf.log(v [, base]), Mathf.log10(v)Logaritmo (natural o en esa base) y en base 10.

Trigonometría

FunciónDescripción
Mathf.sin(r), Mathf.cos(r), Mathf.tan(r)En radianes (usa grados * Mathf.deg2rad).
Mathf.asin(v), Mathf.acos(v), Mathf.atan(v)Inversas (devuelven radianes; asin y acos no fallan fuera de -1..1).
Mathf.atan2(y, x)Ángulo de un vector 2D, en radianes (de -π a π).

Rangos e interpolación

FunciónDescripción
Mathf.clamp(v, min, max), Mathf.clamp01(v)Limita un valor a un rango (o a 0..1).
Mathf.lerp(a, b, t)Valor entre a y b; t se limita a 0..1.
Mathf.lerpUnclamped(a, b, t)Igual, sin limitar t.
Mathf.inverseLerp(a, b, v)Lo contrario de lerp: qué t (0..1) le toca a v entre a y b.
Mathf.remap(v, desde1, hasta1, desde2, hasta2)Pasa un valor de un rango a otro: Mathf.remap(velocidad, 0, 30, 60, 90) para el campo de visión.
Mathf.smoothstep(a, b, v), Mathf.smootherstep(a, b, v)De 0 a 1 cuando v va de a a b, con arranque y final suaves.
Mathf.approximately(a, b [, margen])Casi iguales (para comparar decimales: 0.1 + 0.2 ~= 0.3).

Movimiento y suavizado

FunciónDescripción
Mathf.moveTowards(actual, objetivo, paso)Se acerca como mucho paso sin pasarse.
Mathf.smoothDamp(actual, objetivo, vel, tiempo, dt [, maxVel])Seguimiento suave sin rebote; devuelve el valor y la velocidad (guarda la velocidad para el frame siguiente).
Mathf.wrap(t, largo)Da la vuelta dentro de 0..largo (el Repeat de Unity). repeat es palabra reservada de Lua; si la necesitas: Mathf["repeat"].
Mathf.pingPong(t, largo)Va de 0 a largo y vuelve, una y otra vez.

Ángulos (en grados)

FunciónDescripción
Mathf.deltaAngle(a, b)El giro más corto de a a b (-180..180): de 350 a 10 son 20 grados, no -340.
Mathf.lerpAngle(a, b, t)Interpola ángulos por el camino corto.
Mathf.moveTowardsAngle(a, b, paso)Gira hacia b como mucho paso grados.

Ruido Perlin

Números "aleatorios" pero continuos: puntos cercanos dan valores parecidos. Sirve para terrenos, nubes, temblores de cámara o movimientos naturales. Siempre dan lo mismo para las mismas coordenadas.

FunciónDescripción
Mathf.perlinNoise(x, y)Ruido 2D de 0 a 1.
Mathf.perlinNoise3(x, y, z)Ruido 3D de -1 a 1 (usa z = Time.time para que cambie con el tiempo).
Mathf.fractalNoise(x, y [, octavas, persistencia, lacunaridad])Varias capas de ruido (4 por defecto) para relieve con detalle; de 0 a 1.
-- Temblor de camara natural (no salta como math.random)
local t = Time.time * 12
local temblor = Vec3(Mathf.perlinNoise3(t, 0, 0), Mathf.perlinNoise3(0, t, 0), 0) * 0.15 * fuerza

-- Altura de un terreno
local h = Mathf.fractalNoise(x * 0.02, z * 0.02, 5) * 30

Otras

FunciónDescripción
Mathf.isPowerOfTwo(n), Mathf.nextPowerOfTwo(n)Potencias de dos (tamaños de texturas y rejillas).
Mathf.random(min, max)Decimal aleatorio (lo mismo que Random.range; ver Random).

¿Algo no queda claro o falta algo? Pregunta en el Discord.