UNPKG

inverse-kinematics

Version:

Inverse kinematics for 2D and 3D applications

26 lines (25 loc) 1.19 kB
export function lerp(from, to, amount) { amount = amount < 0 ? 0 : amount; amount = amount > 1 ? 1 : amount; return from + (to - from) * amount; } export var clamp = function (value, min, max) { return Math.min(Math.max(min, value), max); }; export function lerpTheta(from, to, amount, circleAt) { if (circleAt === void 0) { circleAt = Math.PI * 2; } var removeLoops = function (distance) { return clamp(distance - Math.floor(distance / circleAt) * circleAt, 0, circleAt); }; var distance = to - from; var unloopedDistance = removeLoops(distance); var isLeft = unloopedDistance > Math.PI; var offset = isLeft ? unloopedDistance - Math.PI * 2 : unloopedDistance; return lerp(from, from + offset, amount); } export var valuesAreWithinDistance = function (valueA, valueB, delta) { var highest = Math.max(valueA, valueB); var lowest = Math.min(valueA, valueB); return highest - delta < lowest; }; export var rotationsAreWithinAngle = function (rotationA, rotationB, angle) { var normalisedA = rotationA % (Math.PI * 2); var normalisedB = rotationB % (Math.PI * 2); return valuesAreWithinDistance(normalisedA, normalisedB, angle); };