From 48cc046fce3837c401c04d2dd4e3d9b48c07a8aa Mon Sep 17 00:00:00 2001 From: Tom Aisthorpe Date: Wed, 4 Sep 2024 20:55:30 +0100 Subject: [PATCH] feat(cameras): add max lead to fixed axis --- .changeset/thick-rockets-drive.md | 5 +++++ .../examples/cameras/fixed-axis-controller.ts | 2 ++ .../cameras/fixed-axis-camera-controller.ts | 21 +++++++++++++++++-- 3 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 .changeset/thick-rockets-drive.md diff --git a/.changeset/thick-rockets-drive.md b/.changeset/thick-rockets-drive.md new file mode 100644 index 0000000..84b2d55 --- /dev/null +++ b/.changeset/thick-rockets-drive.md @@ -0,0 +1,5 @@ +--- +'@tedengine/ted': minor +--- + +Add max lead option to fixed axis controller diff --git a/apps/docs/src/examples/cameras/fixed-axis-controller.ts b/apps/docs/src/examples/cameras/fixed-axis-controller.ts index 9d321c5..5ebb7d8 100644 --- a/apps/docs/src/examples/cameras/fixed-axis-controller.ts +++ b/apps/docs/src/examples/cameras/fixed-axis-controller.ts @@ -76,6 +76,7 @@ class ColliderState extends TGameState { this.addActor(plane); const camera = new TPerspectiveCamera(engine); + camera.lerp = 0.1; this.addActor(camera); // this.activeCamera = camera; camera.cameraComponent.showDebugCamera(engine); @@ -90,6 +91,7 @@ class ColliderState extends TGameState { distance: 5, axis: 'z', leadFactor: 0.5, + maxLead: 0.9, }); controller.attachTo(box.rootComponent); camera.controller = controller; diff --git a/packages/ted/src/cameras/fixed-axis-camera-controller.ts b/packages/ted/src/cameras/fixed-axis-camera-controller.ts index ccfa816..133fdbb 100644 --- a/packages/ted/src/cameras/fixed-axis-camera-controller.ts +++ b/packages/ted/src/cameras/fixed-axis-camera-controller.ts @@ -28,6 +28,7 @@ export default class TFollowAxisCameraController implements TCameraController { private lastPosition?: vec3; public leadFactor = 0; // Adjustable lead factor + public maxLead = 0; // Maximum lead distance constructor(config?: { distance?: number; @@ -35,6 +36,7 @@ export default class TFollowAxisCameraController implements TCameraController { deadzone?: number; bounds?: { min: vec3; max: vec3 }; leadFactor?: number; + maxLead?: number; }) { if (config?.distance !== undefined) { this.distance = config.distance; @@ -65,6 +67,10 @@ export default class TFollowAxisCameraController implements TCameraController { if (config?.leadFactor !== undefined) { this.leadFactor = config.leadFactor; } + + if (config?.maxLead !== undefined) { + this.maxLead = config.maxLead; + } } attachTo(component: TSceneComponent) { @@ -88,9 +94,20 @@ export default class TFollowAxisCameraController implements TCameraController { } this.lastPosition = vec3.clone(currentPosition); - // Calculate lead position + // Calculate lead position with maximum lead const leadPosition = vec3.create(); - vec3.scaleAndAdd(leadPosition, currentPosition, velocity, this.leadFactor); + const leadVector = vec3.create(); + vec3.scale(leadVector, velocity, this.leadFactor); + + // Limit the lead vector to the maximum lead distance + if (this.maxLead > 0) { + const leadDistance = vec3.length(leadVector); + if (leadDistance > this.maxLead) { + vec3.scale(leadVector, leadVector, this.maxLead / leadDistance); + } + } + + vec3.add(leadPosition, currentPosition, leadVector); const distance = vec3.multiply( vec3.create(),