84 lines
1.5 KiB
JavaScript
84 lines
1.5 KiB
JavaScript
import Vector3 from "./Vector3.js";
|
|
import Matrix4 from "./Matrix4.js";
|
|
|
|
export default class Camera {
|
|
|
|
eye = new Vector3();
|
|
target = new Vector3();
|
|
up = new Vector3( 0, 1, 0 );
|
|
|
|
yaw = 0;
|
|
pitch = 0;
|
|
fovRadians = Math.PI / 4;
|
|
near = 0.1;
|
|
far = 3000.0;
|
|
distance = 10;
|
|
viewMatrix = new Float32Array( 16 );
|
|
|
|
constructor( eye = [0, 0, 5], target = [0, 0, 0], up = [0, 1, 0] ) {
|
|
|
|
this.eye = new Vector3( ...eye );
|
|
this.target = new Vector3( ...target );
|
|
this.up = new Vector3( ...up );
|
|
|
|
this.distance = Vector3.subtract( this.eye, this.target ).length();
|
|
|
|
this.viewMatrix = Matrix4.lookAt( this.eye, this.target, this.up );
|
|
|
|
}
|
|
|
|
update() {
|
|
|
|
const x = this.distance * Math.cos( this.pitch ) * Math.sin( this.yaw );
|
|
const y = this.distance * Math.sin( this.pitch );
|
|
const z = this.distance * Math.cos( this.pitch ) * Math.cos( this.yaw );
|
|
|
|
this.eye = new Vector3(
|
|
x + this.target.x,
|
|
y + this.target.y,
|
|
z + this.target.z
|
|
);
|
|
|
|
this.viewMatrix = Matrix4.lookAt( this.eye, this.target, this.up );
|
|
|
|
}
|
|
|
|
getViewMatrix() {
|
|
|
|
return this.viewMatrix;
|
|
|
|
}
|
|
|
|
rotate( deltaYaw, deltaPitch ) {
|
|
|
|
this.yaw += deltaYaw;
|
|
this.pitch -= deltaPitch;
|
|
|
|
const maxPitch = Math.PI / 2 - 0.01;
|
|
|
|
if ( this.pitch > maxPitch ) this.pitch = maxPitch;
|
|
if ( this.pitch < -maxPitch ) this.pitch = -maxPitch;
|
|
|
|
this.update();
|
|
|
|
}
|
|
|
|
zoom( delta ) {
|
|
|
|
this.distance += delta * 1;
|
|
|
|
if ( this.distance < 0.1 ) this.distance = 0.1;
|
|
|
|
this.update();
|
|
|
|
}
|
|
|
|
setTarget( target ) {
|
|
|
|
this.target = new Vector3( ...target );
|
|
|
|
this.update();
|
|
|
|
}
|
|
}
|