@flighthq/camera-controls 0.2.1-next.585.c7219b8 → 0.2.1-next.640.ec2ea9a
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/framing.d.ts +1 -1
- package/dist/framing.d.ts.map +1 -1
- package/dist/framing.js +2 -2
- package/dist/framing.js.map +1 -1
- package/dist/orbitCameraController.d.ts +3 -3
- package/dist/orbitCameraController.d.ts.map +1 -1
- package/dist/orbitCameraController.js +10 -10
- package/dist/orbitCameraController.js.map +1 -1
- package/package.json +6 -6
- package/src/framing.test.ts +6 -4
- package/src/orbitCameraController.test.ts +19 -19
package/dist/framing.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { BoundingSphereLike, OrbitCameraController, OrthographicProjection, PerspectiveProjection, Projection } from '@flighthq/types';
|
|
2
2
|
export declare function frameOrbitCameraControllerToSphere(controller: OrbitCameraController, projection: Projection, sphere: Readonly<BoundingSphereLike>, aspect: number, padding?: number): boolean;
|
|
3
|
-
export declare function
|
|
3
|
+
export declare function getPerspectiveProjectionFrameDistanceToSphere(projection: Readonly<PerspectiveProjection>, radius: number, aspect: number, padding?: number): number;
|
|
4
4
|
export declare function setOrthographicProjectionFrameToSphere(projection: OrthographicProjection, radius: number, aspect: number, padding?: number): void;
|
|
5
5
|
//# sourceMappingURL=framing.d.ts.map
|
package/dist/framing.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"framing.d.ts","sourceRoot":"","sources":["../src/framing.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,UAAU,EACX,MAAM,iBAAiB,CAAC;AAOzB,wBAAgB,kCAAkC,CAChD,UAAU,EAAE,qBAAqB,EACjC,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EACpC,MAAM,EAAE,MAAM,EACd,OAAO,SAAI,GACV,OAAO,CAeT;AAKD,wBAAgB,
|
|
1
|
+
{"version":3,"file":"framing.d.ts","sourceRoot":"","sources":["../src/framing.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,UAAU,EACX,MAAM,iBAAiB,CAAC;AAOzB,wBAAgB,kCAAkC,CAChD,UAAU,EAAE,qBAAqB,EACjC,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EACpC,MAAM,EAAE,MAAM,EACd,OAAO,SAAI,GACV,OAAO,CAeT;AAKD,wBAAgB,6CAA6C,CAC3D,UAAU,EAAE,QAAQ,CAAC,qBAAqB,CAAC,EAC3C,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,OAAO,SAAI,GACV,MAAM,CAKR;AAID,wBAAgB,sCAAsC,CACpD,UAAU,EAAE,sBAAsB,EAClC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,OAAO,SAAI,GACV,IAAI,CASN"}
|
package/dist/framing.js
CHANGED
|
@@ -8,7 +8,7 @@ export function frameOrbitCameraControllerToSphere(controller, projection, spher
|
|
|
8
8
|
if (!(sphere.radius >= 0) || !(aspect > 0) || !(padding > 0))
|
|
9
9
|
return false;
|
|
10
10
|
if (projection.kind === 'perspective') {
|
|
11
|
-
const distance =
|
|
11
|
+
const distance = getPerspectiveProjectionFrameDistanceToSphere(projection, sphere.radius, aspect, padding);
|
|
12
12
|
if (!Number.isFinite(distance))
|
|
13
13
|
return false;
|
|
14
14
|
controller.goalDistance = clamp(distance, controller.minDistance, controller.maxDistance);
|
|
@@ -24,7 +24,7 @@ export function frameOrbitCameraControllerToSphere(controller, projection, spher
|
|
|
24
24
|
// Computes the eye-to-center distance that contains a sphere in both dimensions of a perspective
|
|
25
25
|
// viewport. `padding` is a radius multiplier (1 is tangent). Clip-plane policy remains with the
|
|
26
26
|
// camera owner and is intentionally not hidden here.
|
|
27
|
-
export function
|
|
27
|
+
export function getPerspectiveProjectionFrameDistanceToSphere(projection, radius, aspect, padding = 1) {
|
|
28
28
|
const paddedRadius = radius * padding;
|
|
29
29
|
const verticalHalfFov = projection.fovY * 0.5;
|
|
30
30
|
const horizontalHalfFov = Math.atan(Math.tan(verticalHalfFov) * aspect);
|
package/dist/framing.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"framing.js","sourceRoot":"","sources":["../src/framing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AASvC,qGAAqG;AACrG,+FAA+F;AAC/F,kGAAkG;AAClG,oGAAoG;AACpG,6FAA6F;AAC7F,MAAM,UAAU,kCAAkC,CAChD,UAAiC,EACjC,UAAsB,EACtB,MAAoC,EACpC,MAAc,EACd,OAAO,GAAG,CAAC;IAEX,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAE3E,IAAI,UAAU,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,
|
|
1
|
+
{"version":3,"file":"framing.js","sourceRoot":"","sources":["../src/framing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AASvC,qGAAqG;AACrG,+FAA+F;AAC/F,kGAAkG;AAClG,oGAAoG;AACpG,6FAA6F;AAC7F,MAAM,UAAU,kCAAkC,CAChD,UAAiC,EACjC,UAAsB,EACtB,MAAoC,EACpC,MAAc,EACd,OAAO,GAAG,CAAC;IAEX,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAE3E,IAAI,UAAU,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,6CAA6C,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAC3G,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,OAAO,KAAK,CAAC;QAC7C,UAAU,CAAC,YAAY,GAAG,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC,WAAW,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;IAC5F,CAAC;SAAM,CAAC;QACN,sCAAsC,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACrF,CAAC;IAED,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACtC,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACtC,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACtC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,iGAAiG;AACjG,gGAAgG;AAChG,qDAAqD;AACrD,MAAM,UAAU,6CAA6C,CAC3D,UAA2C,EAC3C,MAAc,EACd,MAAc,EACd,OAAO,GAAG,CAAC;IAEX,MAAM,YAAY,GAAG,MAAM,GAAG,OAAO,CAAC;IACtC,MAAM,eAAe,GAAG,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC;IAC9C,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,MAAM,CAAC,CAAC;IACxE,OAAO,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED,mGAAmG;AACnG,sFAAsF;AACtF,MAAM,UAAU,sCAAsC,CACpD,UAAkC,EAClC,MAAc,EACd,MAAc,EACd,OAAO,GAAG,CAAC;IAEX,MAAM,YAAY,GAAG,MAAM,GAAG,OAAO,CAAC;IACtC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAChB,UAAU,CAAC,UAAU,GAAG,YAAY,CAAC;QACrC,UAAU,CAAC,SAAS,GAAG,YAAY,GAAG,MAAM,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,UAAU,CAAC,UAAU,GAAG,YAAY,GAAG,MAAM,CAAC;QAC9C,UAAU,CAAC,SAAS,GAAG,YAAY,CAAC;IACtC,CAAC;AACH,CAAC"}
|
|
@@ -2,11 +2,11 @@ import type { Camera3D, OrbitCameraController, OrbitCameraControllerOptions } fr
|
|
|
2
2
|
export declare function cloneOrbitCameraController(source: Readonly<OrbitCameraController>): OrbitCameraController;
|
|
3
3
|
export declare function copyOrbitCameraController(out: OrbitCameraController, source: Readonly<OrbitCameraController>): void;
|
|
4
4
|
export declare function createOrbitCameraController(options?: Readonly<OrbitCameraControllerOptions>): OrbitCameraController;
|
|
5
|
-
export declare function
|
|
6
|
-
export declare function
|
|
7
|
-
export declare function panCameraController(controller: OrbitCameraController, deltaRight: number, deltaUp: number): void;
|
|
5
|
+
export declare function dollyOrbitCameraController(controller: OrbitCameraController, deltaDistance: number): void;
|
|
6
|
+
export declare function panOrbitCameraController(controller: OrbitCameraController, deltaRight: number, deltaUp: number): void;
|
|
8
7
|
export declare function panOrbitCameraControllerInViewPlane(controller: OrbitCameraController, deltaRight: number, deltaUp: number): void;
|
|
9
8
|
export declare function resetOrbitCameraController(controller: OrbitCameraController, options?: Readonly<OrbitCameraControllerOptions>): void;
|
|
9
|
+
export declare function rotateOrbitCameraController(controller: OrbitCameraController, deltaAzimuth: number, deltaPolar: number): void;
|
|
10
10
|
export declare function snapOrbitCameraController(controller: OrbitCameraController): void;
|
|
11
11
|
export declare function updateOrbitCameraController(controller: OrbitCameraController, camera: Camera3D, deltaTime: number): void;
|
|
12
12
|
//# sourceMappingURL=orbitCameraController.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orbitCameraController.d.ts","sourceRoot":"","sources":["../src/orbitCameraController.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,qBAAqB,EAAE,4BAA4B,EAAE,MAAM,iBAAiB,CAAC;AAGrG,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,QAAQ,CAAC,qBAAqB,CAAC,GAAG,qBAAqB,CAIzG;AAID,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,qBAAqB,EAAE,MAAM,EAAE,QAAQ,CAAC,qBAAqB,CAAC,GAAG,IAAI,CAenH;AAMD,wBAAgB,2BAA2B,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,4BAA4B,CAAC,GAAG,qBAAqB,CAmBnH;AAID,wBAAgB,
|
|
1
|
+
{"version":3,"file":"orbitCameraController.d.ts","sourceRoot":"","sources":["../src/orbitCameraController.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,qBAAqB,EAAE,4BAA4B,EAAE,MAAM,iBAAiB,CAAC;AAGrG,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,QAAQ,CAAC,qBAAqB,CAAC,GAAG,qBAAqB,CAIzG;AAID,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,qBAAqB,EAAE,MAAM,EAAE,QAAQ,CAAC,qBAAqB,CAAC,GAAG,IAAI,CAenH;AAMD,wBAAgB,2BAA2B,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,4BAA4B,CAAC,GAAG,qBAAqB,CAmBnH;AAID,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAMzG;AAMD,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAOrH;AAID,wBAAgB,mCAAmC,CACjD,UAAU,EAAE,qBAAqB,EACjC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GACd,IAAI,CASN;AAID,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,qBAAqB,EACjC,OAAO,CAAC,EAAE,QAAQ,CAAC,4BAA4B,CAAC,GAC/C,IAAI,CAmBN;AAKD,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,qBAAqB,EACjC,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,GACjB,IAAI,CAGN;AAGD,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,qBAAqB,GAAG,IAAI,CAIjF;AAOD,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,qBAAqB,EACjC,MAAM,EAAE,QAAQ,EAChB,SAAS,EAAE,MAAM,GAChB,IAAI,CAwBN"}
|
|
@@ -52,21 +52,14 @@ export function createOrbitCameraController(options) {
|
|
|
52
52
|
}
|
|
53
53
|
// Moves the goal distance (dolly / zoom) by `deltaDistance`, clamped to [minDistance, maxDistance].
|
|
54
54
|
// Negative moves the eye toward the target.
|
|
55
|
-
export function
|
|
55
|
+
export function dollyOrbitCameraController(controller, deltaDistance) {
|
|
56
56
|
controller.goalDistance = clamp(controller.goalDistance + deltaDistance, controller.minDistance, controller.maxDistance);
|
|
57
57
|
}
|
|
58
|
-
// Moves the goal orbit angles by the given radian deltas: `deltaAzimuth` rotates horizontally
|
|
59
|
-
// (unbounded), `deltaPolar` vertically (clamped to [minPolar, maxPolar]). The app maps a pointer drag
|
|
60
|
-
// to these; `updateOrbitCameraController` eases the current angles toward the goal.
|
|
61
|
-
export function orbitCameraController(controller, deltaAzimuth, deltaPolar) {
|
|
62
|
-
controller.goalAzimuth += deltaAzimuth;
|
|
63
|
-
controller.goalPolar = clamp(controller.goalPolar + deltaPolar, controller.minPolar, controller.maxPolar);
|
|
64
|
-
}
|
|
65
58
|
// Slides the orbit `target` in a world-up plane: `deltaRight` along the camera's horizontal right axis
|
|
66
59
|
// (at the current goal azimuth), `deltaUp` along world Y. Because the eye is derived from the target
|
|
67
60
|
// each update, panning the target pans the whole view. Reads the target into locals before writing so
|
|
68
61
|
// aliasing is safe.
|
|
69
|
-
export function
|
|
62
|
+
export function panOrbitCameraController(controller, deltaRight, deltaUp) {
|
|
70
63
|
const cosAzimuth = Math.cos(controller.goalAzimuth);
|
|
71
64
|
const sinAzimuth = Math.sin(controller.goalAzimuth);
|
|
72
65
|
const target = controller.target;
|
|
@@ -74,7 +67,7 @@ export function panCameraController(controller, deltaRight, deltaUp) {
|
|
|
74
67
|
target.y += deltaUp;
|
|
75
68
|
target.z += -sinAzimuth * deltaRight;
|
|
76
69
|
}
|
|
77
|
-
// Slides the orbit target in the actual camera view plane. Unlike `
|
|
70
|
+
// Slides the orbit target in the actual camera view plane. Unlike `panOrbitCameraController`, `deltaUp`
|
|
78
71
|
// follows screen-up at the goal polar angle, so it can change all three target coordinates.
|
|
79
72
|
export function panOrbitCameraControllerInViewPlane(controller, deltaRight, deltaUp) {
|
|
80
73
|
const cosAzimuth = Math.cos(controller.goalAzimuth);
|
|
@@ -108,6 +101,13 @@ export function resetOrbitCameraController(controller, options) {
|
|
|
108
101
|
controller.target.y = target?.y ?? 0;
|
|
109
102
|
controller.target.z = target?.z ?? 0;
|
|
110
103
|
}
|
|
104
|
+
// Moves the goal orbit angles by the given radian deltas: `deltaAzimuth` rotates horizontally
|
|
105
|
+
// (unbounded), `deltaPolar` vertically (clamped to [minPolar, maxPolar]). The app maps a pointer drag
|
|
106
|
+
// to these; `updateOrbitCameraController` eases the current angles toward the goal.
|
|
107
|
+
export function rotateOrbitCameraController(controller, deltaAzimuth, deltaPolar) {
|
|
108
|
+
controller.goalAzimuth += deltaAzimuth;
|
|
109
|
+
controller.goalPolar = clamp(controller.goalPolar + deltaPolar, controller.minPolar, controller.maxPolar);
|
|
110
|
+
}
|
|
111
111
|
// Snaps current spherical state to the clamped goal without writing a camera.
|
|
112
112
|
export function snapOrbitCameraController(controller) {
|
|
113
113
|
controller.azimuth = controller.goalAzimuth;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orbitCameraController.js","sourceRoot":"","sources":["../src/orbitCameraController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gCAAgC,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGzD,8EAA8E;AAC9E,MAAM,UAAU,0BAA0B,CAAC,MAAuC;IAChF,MAAM,KAAK,GAAG,2BAA2B,EAAE,CAAC;IAC5C,yBAAyB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACzC,OAAO,KAAK,CAAC;AACf,CAAC;AAED,kGAAkG;AAClG,0FAA0F;AAC1F,MAAM,UAAU,yBAAyB,CAAC,GAA0B,EAAE,MAAuC;IAC3G,GAAG,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAC7B,GAAG,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC/B,GAAG,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;IACrC,GAAG,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;IACvC,GAAG,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACjC,GAAG,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;IACrC,GAAG,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC/B,GAAG,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;IACrC,GAAG,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC/B,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IACzB,GAAG,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACnC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/B,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/B,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,iGAAiG;AACjG,oGAAoG;AACpG,oGAAoG;AACpG,mGAAmG;AACnG,MAAM,UAAU,2BAA2B,CAAC,OAAgD;IAC1F,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,EAAE,CAAC;IACzC,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,CAAC;IAC/B,OAAO,YAAY,CAAC;QAClB,OAAO;QACP,QAAQ;QACR,WAAW,EAAE,OAAO;QACpB,YAAY,EAAE,QAAQ;QACtB,SAAS,EAAE,KAAK;QAChB,WAAW,EAAE,OAAO,EAAE,WAAW,IAAI,MAAM,CAAC,iBAAiB;QAC7D,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,iBAAiB;QAChD,WAAW,EAAE,OAAO,EAAE,WAAW,IAAI,oBAAoB;QACzD,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,iBAAiB;QAChD,KAAK;QACL,UAAU,EAAE,OAAO,EAAE,UAAU,IAAI,CAAC;QACpC,MAAM,EAAE,aAAa,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;KACtE,CAAC,CAAC;AACL,CAAC;AAED,oGAAoG;AACpG,4CAA4C;AAC5C,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"orbitCameraController.js","sourceRoot":"","sources":["../src/orbitCameraController.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flighthq/camera-controls",
|
|
3
|
-
"version": "0.2.1-next.
|
|
3
|
+
"version": "0.2.1-next.640.ec2ea9a",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "https://github.com/flighthq/flight.git",
|
|
@@ -32,11 +32,11 @@
|
|
|
32
32
|
"clean:dist": "tsx ../../scripts/clean-package-dist.ts"
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@flighthq/camera": "0.2.1-next.
|
|
36
|
-
"@flighthq/entity": "0.2.1-next.
|
|
37
|
-
"@flighthq/geometry": "0.2.1-next.
|
|
38
|
-
"@flighthq/math": "0.2.1-next.
|
|
39
|
-
"@flighthq/types": "0.2.1-next.
|
|
35
|
+
"@flighthq/camera": "0.2.1-next.640.ec2ea9a",
|
|
36
|
+
"@flighthq/entity": "0.2.1-next.640.ec2ea9a",
|
|
37
|
+
"@flighthq/geometry": "0.2.1-next.640.ec2ea9a",
|
|
38
|
+
"@flighthq/math": "0.2.1-next.640.ec2ea9a",
|
|
39
|
+
"@flighthq/types": "0.2.1-next.640.ec2ea9a"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
42
|
"typescript": "^5.3.0"
|
package/src/framing.test.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { describe, expect, it } from 'vitest';
|
|
|
4
4
|
|
|
5
5
|
import {
|
|
6
6
|
frameOrbitCameraControllerToSphere,
|
|
7
|
-
|
|
7
|
+
getPerspectiveProjectionFrameDistanceToSphere,
|
|
8
8
|
setOrthographicProjectionFrameToSphere,
|
|
9
9
|
} from './framing';
|
|
10
10
|
import { createOrbitCameraController } from './orbitCameraController';
|
|
@@ -39,16 +39,18 @@ describe('frameOrbitCameraControllerToSphere', () => {
|
|
|
39
39
|
});
|
|
40
40
|
});
|
|
41
41
|
|
|
42
|
-
describe('
|
|
42
|
+
describe('getPerspectiveProjectionFrameDistanceToSphere', () => {
|
|
43
43
|
it('uses the limiting vertical field for a wide viewport', () => {
|
|
44
44
|
const projection = createPerspectiveProjection({ aspect: 2, fovY: Math.PI / 2 });
|
|
45
|
-
expect(
|
|
45
|
+
expect(getPerspectiveProjectionFrameDistanceToSphere(projection, 2, 2)).toBeCloseTo(2 / Math.sin(Math.PI / 4));
|
|
46
46
|
});
|
|
47
47
|
|
|
48
48
|
it('uses the limiting horizontal field for a tall viewport', () => {
|
|
49
49
|
const projection = createPerspectiveProjection({ aspect: 0.5, fovY: Math.PI / 2 });
|
|
50
50
|
const horizontalHalfFov = Math.atan(0.5);
|
|
51
|
-
expect(
|
|
51
|
+
expect(getPerspectiveProjectionFrameDistanceToSphere(projection, 2, 0.5)).toBeCloseTo(
|
|
52
|
+
2 / Math.sin(horizontalHalfFov),
|
|
53
|
+
);
|
|
52
54
|
});
|
|
53
55
|
});
|
|
54
56
|
|
|
@@ -7,9 +7,9 @@ import {
|
|
|
7
7
|
cloneOrbitCameraController,
|
|
8
8
|
copyOrbitCameraController,
|
|
9
9
|
createOrbitCameraController,
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
dollyOrbitCameraController,
|
|
11
|
+
rotateOrbitCameraController,
|
|
12
|
+
panOrbitCameraController,
|
|
13
13
|
panOrbitCameraControllerInViewPlane,
|
|
14
14
|
resetOrbitCameraController,
|
|
15
15
|
snapOrbitCameraController,
|
|
@@ -70,31 +70,22 @@ describe('createOrbitCameraController', () => {
|
|
|
70
70
|
});
|
|
71
71
|
});
|
|
72
72
|
|
|
73
|
-
describe('
|
|
73
|
+
describe('dollyOrbitCameraController', () => {
|
|
74
74
|
it('moves the goal distance, clamped to the range', () => {
|
|
75
75
|
const c = createOrbitCameraController({ distance: 5, minDistance: 2, maxDistance: 8 });
|
|
76
|
-
|
|
76
|
+
dollyOrbitCameraController(c, 2);
|
|
77
77
|
expect(c.goalDistance).toBe(7);
|
|
78
|
-
|
|
78
|
+
dollyOrbitCameraController(c, 100);
|
|
79
79
|
expect(c.goalDistance).toBe(8);
|
|
80
|
-
|
|
80
|
+
dollyOrbitCameraController(c, -100);
|
|
81
81
|
expect(c.goalDistance).toBe(2);
|
|
82
82
|
});
|
|
83
83
|
});
|
|
84
84
|
|
|
85
|
-
describe('
|
|
86
|
-
it('adds to the goal angles and clamps polar', () => {
|
|
87
|
-
const c = createOrbitCameraController({ minPolar: -1, maxPolar: 1 });
|
|
88
|
-
orbitCameraController(c, 0.5, 2);
|
|
89
|
-
expect(c.goalAzimuth).toBe(0.5);
|
|
90
|
-
expect(c.goalPolar).toBe(1); // clamped
|
|
91
|
-
});
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
describe('panCameraController', () => {
|
|
85
|
+
describe('panOrbitCameraController', () => {
|
|
95
86
|
it('slides the target along right (at azimuth 0) and world up', () => {
|
|
96
87
|
const c = createOrbitCameraController();
|
|
97
|
-
|
|
88
|
+
panOrbitCameraController(c, 3, 2);
|
|
98
89
|
expect(c.target.x).toBeCloseTo(3); // right = (cos0, 0, -sin0) = (1,0,0)
|
|
99
90
|
expect(c.target.y).toBeCloseTo(2);
|
|
100
91
|
expect(c.target.z).toBeCloseTo(0);
|
|
@@ -127,6 +118,15 @@ describe('resetOrbitCameraController', () => {
|
|
|
127
118
|
});
|
|
128
119
|
});
|
|
129
120
|
|
|
121
|
+
describe('rotateOrbitCameraController', () => {
|
|
122
|
+
it('adds to the goal angles and clamps polar', () => {
|
|
123
|
+
const c = createOrbitCameraController({ minPolar: -1, maxPolar: 1 });
|
|
124
|
+
rotateOrbitCameraController(c, 0.5, 2);
|
|
125
|
+
expect(c.goalAzimuth).toBe(0.5);
|
|
126
|
+
expect(c.goalPolar).toBe(1); // clamped
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
|
|
130
130
|
describe('snapOrbitCameraController', () => {
|
|
131
131
|
it('snaps current values to clamped goals', () => {
|
|
132
132
|
const c = createOrbitCameraController({ maxDistance: 6, maxPolar: 0.5 });
|
|
@@ -152,7 +152,7 @@ describe('updateOrbitCameraController', () => {
|
|
|
152
152
|
|
|
153
153
|
it('eases toward the goal when smoothTime is positive', () => {
|
|
154
154
|
const c = createOrbitCameraController({ smoothTime: 0.5 });
|
|
155
|
-
|
|
155
|
+
rotateOrbitCameraController(c, 1, 0);
|
|
156
156
|
updateOrbitCameraController(c, testCamera(), 0.016);
|
|
157
157
|
expect(c.azimuth).toBeGreaterThan(0);
|
|
158
158
|
expect(c.azimuth).toBeLessThan(1); // has not reached the goal in one small step
|