export class Vector3 { | |
constructor(x = 0, y = 0, z = 0) { | |
this.x = x; | |
this.y = y; | |
this.z = z; | |
} | |
add(v) { | |
return new Vector3(this.x + v.x, this.y + v.y, this.z + v.z); | |
} | |
subtract(v) { | |
return new Vector3(this.x - v.x, this.y - v.y, this.z - v.z); | |
} | |
scale(s) { | |
return new Vector3(this.x * s, this.y * s, this.z * s); | |
} | |
dot(v) { | |
return this.x * v.x + this.y * v.y + this.z * v.z; | |
} | |
cross(v) { | |
return new Vector3( | |
this.y * v.z - this.z * v.y, | |
this.z * v.x - this.x * v.z, | |
this.x * v.y - this.y * v.x | |
); | |
} | |
length() { | |
return Math.sqrt(this.dot(this)); | |
} | |
magnitude() { | |
return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z); | |
} | |
normalize() { | |
const len = this.length(); | |
return len ? this.scale(1 / len) : new Vector3(); | |
} | |
clone() { | |
return new Vector3(this.x, this.y, this.z); | |
} | |
} | |