66 lines
1.9 KiB
TypeScript
66 lines
1.9 KiB
TypeScript
import TrsMatrix from "./TrsMatrix";
|
|
import Point3D from "./Point3D";
|
|
import {Transformable} from "./types";
|
|
import MatrixFour from "./MatrixFour";
|
|
|
|
class Camera implements Transformable {
|
|
private trs: TrsMatrix;
|
|
constructor();
|
|
constructor(position: Point3D, lookAt: Point3D, up: Point3D);
|
|
constructor(radius: number, rotX: number, rotY: number, rotZ: number);
|
|
constructor(...args: any[]) {
|
|
this.trs = new TrsMatrix();
|
|
if (args[0] !== undefined) {
|
|
if (args[0] instanceof Point3D) {
|
|
this.trs.setPosition(args[0]);
|
|
this.lookAt(args[1], args[2]);
|
|
}
|
|
else {
|
|
this.rotateBy(args[1], args[2], args[3]);
|
|
this.translateBy(0, 0, args[0]);
|
|
}
|
|
}
|
|
}
|
|
|
|
translateBy(tX: number, tY: number, tZ: number): Camera {
|
|
this.trs.translateBy(tX, tY, tZ);
|
|
return this;
|
|
}
|
|
|
|
rotateBy(degX: number, degY: number, degZ: number): Camera {
|
|
this.trs.rotateBy(degX, degY, degZ);
|
|
return this;
|
|
}
|
|
|
|
scaleBy(sX: number, sY: number, sZ: number): Camera {
|
|
this.trs.scaleBy(sX, sY, sZ);
|
|
return this;
|
|
}
|
|
|
|
getTrsMatrix(): TrsMatrix {
|
|
return this.trs;
|
|
}
|
|
|
|
position(): Point3D {
|
|
return this.trs.position();
|
|
};
|
|
|
|
lookAt(other: Point3D, up: Point3D) {
|
|
const selfPosition = this.position();
|
|
const zAxis = selfPosition.minus(other).normalised();
|
|
const xAxis = up.cross(zAxis).normalised();
|
|
const yAxis = zAxis.cross(xAxis).normalised();
|
|
this.trs.setSlice([
|
|
xAxis.x(), xAxis.y(), xAxis.z(), 0,
|
|
yAxis.x(), yAxis.y(), yAxis.z(), 0,
|
|
zAxis.x(), zAxis.y(), zAxis.z(), 0,
|
|
selfPosition.x(), selfPosition.y(), selfPosition.z(), 1,
|
|
], 0);
|
|
}
|
|
|
|
viewMat(): MatrixFour {
|
|
return this.trs.inverse();
|
|
}
|
|
}
|
|
|
|
export default Camera; |