aboutsummaryrefslogtreecommitdiff
path: root/lib/systems/camera_rotator.js
diff options
context:
space:
mode:
authorRuben Beltran del Rio <git@r.bdr.sh>2024-05-07 22:37:27 +0200
committerRuben Beltran del Rio <git@r.bdr.sh>2024-05-07 22:37:27 +0200
commit362f91160b243453578633e3f9af67ce40179d8c (patch)
treea9ee95e2f8a9c59189ea904ce87bfe54ed5be107 /lib/systems/camera_rotator.js
parent5f6ef99eae91f53239f08143cead1249893fef81 (diff)
Make 3D
Diffstat (limited to 'lib/systems/camera_rotator.js')
-rw-r--r--lib/systems/camera_rotator.js49
1 files changed, 49 insertions, 0 deletions
diff --git a/lib/systems/camera_rotator.js b/lib/systems/camera_rotator.js
new file mode 100644
index 0000000..3520f71
--- /dev/null
+++ b/lib/systems/camera_rotator.js
@@ -0,0 +1,49 @@
+import { mat4, vec3 } from 'gl-matrix';
+import { System } from '@serpentity/serpentity';
+import Cameras from '../nodes/cameras';
+
+export default class CameraRotator extends System {
+
+ constructor() {
+
+ super();
+ }
+
+ added(engine){
+
+ this.cameras = engine.getNodes(Cameras);
+ }
+
+ removed(){
+
+ delete this.cameras;
+ }
+
+ update(dt){
+
+ for (const camera of this.cameras) {
+
+ let rotationMatrix = mat4.create();
+ mat4.rotateY(rotationMatrix, rotationMatrix, camera.angle.yaw);
+ mat4.rotateX(rotationMatrix, rotationMatrix, camera.angle.pitch);
+ mat4.rotateZ(rotationMatrix, rotationMatrix, camera.angle.roll);
+
+ let eye = vec3.fromValues(0, 0, camera.radius.radius);
+ vec3.transformMat4(eye, eye, rotationMatrix);
+
+ camera.position.x = eye[0];
+ camera.position.y = eye[1];
+ camera.position.z = eye[2];
+
+ let up = vec3.fromValues(0, 1, 0);
+ vec3.transformMat4(up, up, rotationMatrix);
+ camera.up.x = up[0];
+ camera.up.y = up[1];
+ camera.up.z = up[2];
+
+ camera.angle.pitch = (camera.angle.pitch + camera.velocity.x * dt / 100 + 2 * Math.PI) % (2 * Math.PI);
+ camera.angle.yaw = (camera.angle.yaw + camera.velocity.y * dt / 100 + 2 * Math.PI) % (2 * Math.PI);
+ camera.angle.roll = (camera.angle.roll + camera.velocity.z * dt / 100 + 2 * Math.PI) % (2 * Math.PI);
+ }
+ }
+};