Skip to content

Instantly share code, notes, and snippets.

@izquiratops
Created April 17, 2022 09:16
Show Gist options
  • Save izquiratops/671d63791e7e8fbf2d35ce2f4fa0845a to your computer and use it in GitHub Desktop.
Save izquiratops/671d63791e7e8fbf2d35ce2f4fa0845a to your computer and use it in GitHub Desktop.
3D vector math utils
const clamp = (v, min, max) => v < min ? min : (v > max ? max : v);
const scale = (v, in_min, in_max, out_min, out_max) => out_min + ((out_max) - out_min) * (((v) - in_min) / ((in_max) - in_min));
const anglemod = (r) => Math.atan2(Math.sin(r), Math.cos(r));
const vec3 = (x = 0, y = 0, z = 0) => ({x, y, z});
const vec3_rotate_yaw_pitch = (p, yaw, pitch) => vec3_rotate_y(vec3_rotate_x(p, pitch), yaw);
const vec3_rotate_y = (p, rad) => vec3(p.z * Math.sin(rad) + p.x * Math.cos(rad), p.y, p.z * Math.cos(rad) - p.x * Math.sin(rad));
const vec3_rotate_x = (p, rad) => vec3(p.x, p.y * Math.cos(rad) - p.z * Math.sin(rad), p.y * Math.sin(rad) + p.z * Math.cos(rad));
const vec3_2d_angle = (a, b) => Math.atan2(b.x - a.x, b.z - a.z);
const vec3_clone = (a) => vec3(a.x,a.y,a.z);
const vec3_length = (a) => Math.hypot(a.x,a.y,a.z);
const vec3_dist = (a, b) => vec3_length(vec3_sub(a, b));
const vec3_dot = (a, b) => (a.x * b.x + a.y * b.y + a.z * b.z);
const vec3_add = (a, b) => vec3(a.x + b.x, a.y + b.y, a.z + b.z);
const vec3_sub = (a, b) => vec3(a.x - b.x, a.y - b.y, a.z - b.z);
const vec3_mul = (a, b) => vec3(a.x * b.x, a.y * b.y, a.z * b.z);
const vec3_mulf = (a, b) => vec3(a.x * b, a.y * b, a.z * b);
const vec3_cross = (a, b) => vec3(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x);
const vec3_normalize = (v) => vec3_mulf(v, 1/vec3_length(v));
const vec3_face_normal = (v0, v1, v2) => vec3_normalize(vec3_cross(vec3_sub(v0, v1), vec3_sub(v2, v1)));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment