UNPKG

@phaserjs/phaser

Version:
47 lines (46 loc) 1.29 kB
import { Mat4Identity } from "./Mat4Identity"; import { Matrix4 } from "./Matrix4"; export function Mat4LookAt(eye, center, up, out = new Matrix4()) { const { x: eyex, y: eyey, z: eyez } = eye; const { x: upx, y: upy, z: upz } = up; const { x: centerx, y: centery, z: centerz } = center; if (Math.abs(eyex - centerx) < 1e-5 && Math.abs(eyey - centery) < 1e-5 && Math.abs(eyez - centerz) < 1e-5) { return Mat4Identity(out); } let z0 = eyex - centerx; let z1 = eyey - centery; let z2 = eyez - centerz; let len = 1 / Math.hypot(z0, z1, z2); z0 *= len; z1 *= len; z2 *= len; let x0 = upy * z2 - upz * z1; let x1 = upz * z0 - upx * z2; let x2 = upx * z1 - upy * z0; len = Math.hypot(x0, x1, x2); if (!len) { x0 = 0; x1 = 0; x2 = 0; } else { len = 1 / len; x0 *= len; x1 *= len; x2 *= len; } let y0 = z1 * x2 - z2 * x1; let y1 = z2 * x0 - z0 * x2; let y2 = z0 * x1 - z1 * x0; len = Math.hypot(y0, y1, y2); if (!len) { y0 = 0; y1 = 0; y2 = 0; } else { len = 1 / len; y0 *= len; y1 *= len; y2 *= len; } return out.set(x0, y0, z0, 0, x1, y1, z1, 0, x2, y2, z2, 0, -(x0 * eyex + x1 * eyey + x2 * eyez), -(y0 * eyex + y1 * eyey + y2 * eyez), -(z0 * eyex + z1 * eyey + z2 * eyez), 1); }