inverse-kinematics
Version:
Inverse kinematics for 2D and 3D applications
26 lines (25 loc) • 1.19 kB
JavaScript
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);
};