@threeify/math
Version:
Computer graphics oriented, High performance, tree-shakeable, TypeScript 3D vector math library.
74 lines (63 loc) • 1.88 kB
text/typescript
import { Mat4 } from './Mat4.js';
import { planePointDistance } from './Plane.Functions.js';
import { Plane } from './Plane.js';
import { Ray3 } from './Ray3.js';
import {
mat4TransformNormal3,
mat4TransformPosition3,
vec3Add,
vec3Dot,
vec3Equals,
vec3MultiplyByScalar,
vec3Negate,
vec3Normalize,
vec3Subtract
} from './Vec3.Functions.js';
import { Vec3 } from './Vec3.js';
export function ray3Equals(a: Ray3, b: Ray3): boolean {
return vec3Equals(a.origin, b.origin) && vec3Equals(a.direction, b.direction);
}
export function ray3At(r: Ray3, t: number, result = new Vec3()): Vec3 {
return vec3Add(
vec3MultiplyByScalar(r.direction.clone(result), t, result),
r.origin,
result
);
}
export function ray3LookAt(r: Ray3, v: Vec3, result = new Ray3()): Ray3 {
result.origin.copy(r.origin);
vec3Normalize(
vec3Subtract(v.clone(result.direction), r.origin, result.direction),
result.direction
);
return result;
}
export function ray3DistanceToPlane(ray: Ray3, plane: Plane): number {
const denominator = vec3Dot(plane.normal, ray.direction);
if (denominator === 0) {
// line is coplanar, return origin
if (planePointDistance(plane, ray.origin) === 0) {
return 0;
}
return Number.NaN;
}
return -planePointDistance(plane, ray.origin) / denominator;
}
export function ray3Negate(r: Ray3, result = new Ray3()): Ray3 {
result.origin.copy(r.origin);
vec3Negate(r.direction, result.direction);
return result;
}
export function ray3IntersectPlane(
ray: Ray3,
plane: Plane,
result = new Vec3()
): Vec3 {
const t = ray3DistanceToPlane(ray, plane);
return ray3At(ray, t, result);
}
export function mat4TransformRay3(m: Mat4, r: Ray3, result = new Ray3()): Ray3 {
mat4TransformPosition3(m, r.origin, result.origin);
mat4TransformNormal3(m, r.direction, result.direction);
return result;
}