Skip to content

Commit fa8730f

Browse files
feat: use bearings in pan service
Support combined panning for fisheyes with horizontal fov >180 degrees.
1 parent 4d96110 commit fa8730f

File tree

1 file changed

+12
-29
lines changed

1 file changed

+12
-29
lines changed

src/viewer/PanService.ts

Lines changed: 12 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -195,9 +195,7 @@ export class PanService {
195195
0,
196196
2 * Math.PI);
197197

198-
const currentProjectedPoints: number[][] = this._computeProjectedPoints(currentTransform);
199-
200-
const currentHFov: number = this._computeHorizontalFov(currentProjectedPoints) / 180 * Math.PI;
198+
const currentHFov: number = this._computeHorizontalFov(currentTransform) / 180 * Math.PI;
201199

202200
const preferredOverlap: number = Math.PI / 8;
203201
let left: [number, Image, Transform, number] = undefined;
@@ -210,8 +208,7 @@ export class PanService {
210208
reference);
211209

212210
const transform: Transform = this._createTransform(a, translation);
213-
const projectedPoints: number[][] = this._computeProjectedPoints(transform);
214-
const hFov: number = this._computeHorizontalFov(projectedPoints) / 180 * Math.PI;
211+
const hFov: number = this._computeHorizontalFov(transform) / 180 * Math.PI;
215212

216213
const direction: THREE.Vector3 = this._spatial.viewingDirection(a.rotation);
217214
const azimuthal: number = this._spatial.wrap(
@@ -367,34 +364,20 @@ export class PanService {
367364
image.cameraParameters));
368365
}
369366

370-
private _computeProjectedPoints(transform: Transform): number[][] {
367+
private _computeHorizontalFov(transform: Transform): number {
371368
const vertices: number[][] = [[1, 0]];
372369
const directions: number[][] = [[0, 0.5]];
373-
const pointsPerLine: number = 20;
374-
375-
return Geo
376-
.computeProjectedPoints(
377-
transform,
378-
vertices,
379-
directions,
380-
pointsPerLine,
381-
this._viewportCoords)
382-
.map(([x, y]) => [Math.abs(x), Math.abs(y)]);
383-
}
370+
const pointsPerLine: number = 12;
384371

385-
private _computeHorizontalFov(projectedPoints: number[][]): number {
386-
const fovs: number[] = projectedPoints
387-
.map(
388-
(projectedPoint: number[]): number => {
389-
return this._coordToFov(projectedPoint[0]);
390-
});
372+
const bearings = Geo.computeBearings(
373+
transform, vertices, directions, pointsPerLine, this._viewportCoords);
374+
const projections = bearings
375+
.map(b => this._spatial.projectToPlane(b, [0, 1, 0]))
376+
.map(p => [p[0], -p[2]]);
391377

392-
const fov: number = Math.min(...fovs);
393-
394-
return fov;
395-
}
378+
const angles = projections.map(p => Math.abs(Math.atan2(p[0], p[1])));
379+
const fov = 2 * Math.max(...angles);
396380

397-
private _coordToFov(x: number): number {
398-
return 2 * Math.atan(x) * 180 / Math.PI;
381+
return this._spatial.radToDeg(fov);
399382
}
400383
}

0 commit comments

Comments
 (0)