MikaFil commited on
Commit
d1d9c09
·
verified ·
1 Parent(s): 459cefb

Update orbit-camera.js

Browse files
Files changed (1) hide show
  1. orbit-camera.js +52 -81
orbit-camera.js CHANGED
@@ -538,7 +538,11 @@ OrbitCameraInputTouch.prototype.onTouchMove = function (event) {
538
  }
539
  };
540
 
541
- // =================== Orbit Camera Input Keyboard (per-canvas) ========================
 
 
 
 
542
  var OrbitCameraInputKeyboard = pc.createScript('orbitCameraInputKeyboard');
543
 
544
  OrbitCameraInputKeyboard.attributes.add('forwardSpeed', { type: 'number', default: 1.2, title: 'Vertical Speed (rel. to distance)' });
@@ -551,91 +555,31 @@ OrbitCameraInputKeyboard.attributes.add('zoomKeySensitivity', { type: 'number',
551
 
552
  OrbitCameraInputKeyboard.prototype.initialize = function () {
553
  this.orbitCamera = this.entity.script.orbitCamera;
554
-
555
- // État clavier local à CE canvas
556
- this._keys = Object.create(null);
557
- this._active = false;
558
-
559
- // Cible = canvas de l'app
560
- var el = this.app.graphicsDevice.canvas;
561
- if (!el.hasAttribute('tabindex')) el.setAttribute('tabindex', '0');
562
-
563
- // Empêche le scroll de page pour les touches de navigation quand actif
564
- var shouldBlock = function(ev) {
565
- if (!ev) return false;
566
- var k = ev.key;
567
- return k === 'ArrowUp' || k === 'ArrowDown' || k === 'ArrowLeft' || k === 'ArrowRight' ||
568
- k === 'PageUp' || k === 'PageDown' || k === 'Home' || k === 'End' ||
569
- k === ' ' || k === 'Spacebar' || (ev.ctrlKey && (k === 'ArrowUp' || k === 'ArrowDown'));
570
- };
571
-
572
- this._onKeyDown = (ev) => {
573
- if (!this._active) return;
574
- this._keys[ev.key] = true;
575
- if (shouldBlock(ev)) ev.preventDefault();
576
- };
577
-
578
- this._onKeyUp = (ev) => {
579
- this._keys[ev.key] = false;
580
- };
581
-
582
- this._onBlur = () => {
583
- this._keys = Object.create(null);
584
- };
585
-
586
- this._onEnter = () => {
587
- this._active = true;
588
- try { el.focus({ preventScroll: true }); } catch(e) { el.focus(); }
589
- };
590
-
591
- this._onLeave = () => {
592
- this._active = false;
593
- el.blur();
594
- this._keys = Object.create(null);
595
- };
596
-
597
- el.addEventListener('keydown', this._onKeyDown);
598
- el.addEventListener('keyup', this._onKeyUp);
599
- el.addEventListener('blur', this._onBlur);
600
- el.addEventListener('pointerenter', this._onEnter);
601
- el.addEventListener('pointerleave', this._onLeave);
602
-
603
- // Nettoyage
604
- this.on('destroy', function () {
605
- el.removeEventListener('keydown', this._onKeyDown);
606
- el.removeEventListener('keyup', this._onKeyUp);
607
- el.removeEventListener('blur', this._onBlur);
608
- el.removeEventListener('pointerenter', this._onEnter);
609
- el.removeEventListener('pointerleave', this._onLeave);
610
- }, this);
611
- };
612
-
613
- OrbitCameraInputKeyboard.prototype._pressed = function(name) {
614
- return !!(this._keys[name] || this._keys[name + 'Left'] || this._keys[name + 'Right']);
615
  };
616
 
617
  OrbitCameraInputKeyboard.prototype.update = function (dt) {
618
- if (!this.orbitCamera) return;
619
 
620
- var up = !!this._keys['ArrowUp'];
621
- var dn = !!this._keys['ArrowDown'];
622
- var lt = !!this._keys['ArrowLeft'];
623
- var rt = !!this._keys['ArrowRight'];
624
 
625
- var shift = this._pressed('Shift');
626
- var ctrl = this._pressed('Control');
627
 
628
  // ---- SHIFT: Orbit (pitch / yaw) ----
629
  if (shift && (up || dn || lt || rt)) {
630
- // Yaw (left/right) — Shift+Right => orbit vers la droite
631
- var yawDir = (rt ? 1 : 0) - (lt ? 1 : 0);
632
  if (yawDir !== 0) {
633
  var dYaw = yawDir * this.orbitYawSpeedDeg * dt;
634
- this.orbitCamera.yaw = this.orbitCamera.yaw + dYaw;
635
  }
636
 
637
- // Pitch (up/down)
638
- var pitchDir = (up ? 1 : 0) - (dn ? 1 : 0);
639
  if (pitchDir !== 0) {
640
  var dPitch = pitchDir * this.orbitPitchSpeedDeg * dt;
641
 
@@ -657,7 +601,7 @@ OrbitCameraInputKeyboard.prototype.update = function (dt) {
657
  var wouldGoBelow = proposedY < minY - 1e-4;
658
 
659
  if (!(wouldGoBelow && (proposedY < preY))) {
660
- this.orbitCamera.pitch = testPitch;
661
  }
662
  }
663
  return;
@@ -665,21 +609,48 @@ OrbitCameraInputKeyboard.prototype.update = function (dt) {
665
 
666
  // ---- CTRL: Zoom (up/down) ----
667
  if (ctrl && (up || dn)) {
668
- var zoomSign = (up ? 1 : 0) - (dn ? 1 : 0);
669
  if (zoomSign !== 0) {
670
  if (this.entity.camera.projection === pc.PROJECTION_PERSPECTIVE) {
671
  var dz = zoomSign * this.zoomKeySensitivity * (this.orbitCamera.distance * 0.5) * dt;
672
- this.orbitCamera.distance -= dz;
673
  } else {
674
  var doh = zoomSign * this.zoomKeySensitivity * (this.orbitCamera.orthoHeight * 0.5) * dt;
675
- this.orbitCamera.orthoHeight -= doh;
676
  }
677
  }
678
  return;
679
  }
680
 
681
- // ---- Sans modifieurs : translation (vertical + strafe) ----
682
- var moveVert = (up ? 1 : 0) - (dn ? 1 : 0);
683
  var moveRight = (rt ? 1 : 0) - (lt ? 1 : 0);
684
 
685
- i
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
538
  }
539
  };
540
 
541
+ // =================== Orbit Camera Input Keyboard ========================
542
+ // Arrows:
543
+ // - No modifier: Up/Down = vertical pan; Left/Right = strafe
544
+ // - With Shift: Up/Down = orbit pitch; Left/Right = orbit yaw (inverted as requested)
545
+ // - With Ctrl: Up/Down = zoom in/out
546
  var OrbitCameraInputKeyboard = pc.createScript('orbitCameraInputKeyboard');
547
 
548
  OrbitCameraInputKeyboard.attributes.add('forwardSpeed', { type: 'number', default: 1.2, title: 'Vertical Speed (rel. to distance)' });
 
555
 
556
  OrbitCameraInputKeyboard.prototype.initialize = function () {
557
  this.orbitCamera = this.entity.script.orbitCamera;
558
+ this.keyboard = this.app.keyboard || null;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
559
  };
560
 
561
  OrbitCameraInputKeyboard.prototype.update = function (dt) {
562
+ if (!this.orbitCamera || !this.keyboard) return;
563
 
564
+ var up = this.keyboard.isPressed(pc.KEY_UP);
565
+ var dn = this.keyboard.isPressed(pc.KEY_DOWN);
566
+ var lt = this.keyboard.isPressed(pc.KEY_LEFT);
567
+ var rt = this.keyboard.isPressed(pc.KEY_RIGHT);
568
 
569
+ var shift = this.keyboard.isPressed(pc.KEY_SHIFT);
570
+ var ctrl = this.keyboard.isPressed(pc.KEY_CONTROL);
571
 
572
  // ---- SHIFT: Orbit (pitch / yaw) ----
573
  if (shift && (up || dn || lt || rt)) {
574
+ // Yaw (left/right) — inverted per request: Shift+Right => orbit to the right
575
+ var yawDir = (rt ? 1 : 0) - (lt ? 1 : 0); // right=+1, left=-1
576
  if (yawDir !== 0) {
577
  var dYaw = yawDir * this.orbitYawSpeedDeg * dt;
578
+ this.orbitCamera.yaw = this.orbitCamera.yaw + dYaw; // NOTE: '+' (inversion)
579
  }
580
 
581
+ // Pitch (up/down) — Shift+Up => orbit up, Shift+Down => down
582
+ var pitchDir = (up ? 1 : 0) - (dn ? 1 : 0); // up=+1, down=-1
583
  if (pitchDir !== 0) {
584
  var dPitch = pitchDir * this.orbitPitchSpeedDeg * dt;
585
 
 
601
  var wouldGoBelow = proposedY < minY - 1e-4;
602
 
603
  if (!(wouldGoBelow && (proposedY < preY))) {
604
+ this.orbitCamera.pitch = testPitch; // clamped by setter
605
  }
606
  }
607
  return;
 
609
 
610
  // ---- CTRL: Zoom (up/down) ----
611
  if (ctrl && (up || dn)) {
612
+ var zoomSign = (up ? 1 : 0) - (dn ? 1 : 0); // up=zoom in, down=zoom out
613
  if (zoomSign !== 0) {
614
  if (this.entity.camera.projection === pc.PROJECTION_PERSPECTIVE) {
615
  var dz = zoomSign * this.zoomKeySensitivity * (this.orbitCamera.distance * 0.5) * dt;
616
+ this.orbitCamera.distance -= dz; // clamped
617
  } else {
618
  var doh = zoomSign * this.zoomKeySensitivity * (this.orbitCamera.orthoHeight * 0.5) * dt;
619
+ this.orbitCamera.orthoHeight -= doh; // clamped >= 0
620
  }
621
  }
622
  return;
623
  }
624
 
625
+ // ---- No modifier: translate (vertical + strafe) ----
626
+ var moveVert = (up ? 1 : 0) - (dn ? 1 : 0); // Up=+1 => go up
627
  var moveRight = (rt ? 1 : 0) - (lt ? 1 : 0);
628
 
629
+ if (moveVert === 0 && moveRight === 0) return;
630
+
631
+ // Base speeds relative to distance (consistent feel near/far)
632
+ var dist = Math.max(0.1, this.orbitCamera.distance);
633
+ var speedV = this.forwardSpeed * dist; // vertical speed
634
+ var speedR = this.strafeSpeed * dist; // strafe speed
635
+
636
+ // Vertical move (pure Y), respect minY
637
+ var dy = moveVert * speedV * dt;
638
+ if (dy !== 0) {
639
+ var currentCamY = this.orbitCamera.worldCameraYForPivot(this.orbitCamera.pivotPoint);
640
+ var minY = this.orbitCamera.minY;
641
+ var proposedCamY = currentCamY + dy;
642
+ if (proposedCamY < minY) {
643
+ dy = Math.max(dy, minY - currentCamY);
644
+ }
645
+ if (dy !== 0) {
646
+ this.orbitCamera._pivotPoint.y += dy;
647
+ }
648
+ }
649
+
650
+ // Strafe on XZ
651
+ var right = this.entity.right.clone(); right.y = 0; if (right.lengthSq() > 1e-8) right.normalize();
652
+ var dx = moveRight * speedR * dt;
653
+ if (dx !== 0) {
654
+ this.orbitCamera._pivotPoint.add(right.mulScalar(dx));
655
+ }
656
+ };