playcanvas
Version:
PlayCanvas WebGL game engine
59 lines (56 loc) • 1.45 kB
JavaScript
import { Vec3 } from '../math/vec3.js';
class Plane {
constructor(normal = Vec3.UP, distance = 0){
this.normal = new Vec3();
this.normal.copy(normal);
this.distance = distance;
}
clone() {
const cstr = this.constructor;
return new cstr().copy(this);
}
copy(src) {
this.normal.copy(src.normal);
this.distance = src.distance;
return this;
}
intersectsLine(start, end, point) {
const d = this.distance;
const d0 = this.normal.dot(start) + d;
const d1 = this.normal.dot(end) + d;
const t = d0 / (d0 - d1);
const intersects = t >= 0 && t <= 1;
if (intersects && point) {
point.lerp(start, end, t);
}
return intersects;
}
intersectsRay(ray, point) {
const denominator = this.normal.dot(ray.direction);
if (denominator === 0) {
return false;
}
const t = -(this.normal.dot(ray.origin) + this.distance) / denominator;
if (t >= 0 && point) {
point.copy(ray.direction).mulScalar(t).add(ray.origin);
}
return t >= 0;
}
normalize() {
const invLength = 1 / this.normal.length();
this.normal.mulScalar(invLength);
this.distance *= invLength;
return this;
}
set(nx, ny, nz, d) {
this.normal.set(nx, ny, nz);
this.distance = d;
return this;
}
setFromPointNormal(point, normal) {
this.normal.copy(normal);
this.distance = -this.normal.dot(point);
return this;
}
}
export { Plane };