easy-three-utils 0.0.1

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.
Files changed (166) hide show
  1. package/package.json +12 -0
  2. package/src/common/index.ts +24 -0
  3. package/src/common/useLine2.ts +87 -0
  4. package/src/common/useLoader.ts +184 -0
  5. package/src/common/useLocationCalculator.ts +145 -0
  6. package/src/common/useMark.ts +42 -0
  7. package/src/common/useTween.ts +86 -0
  8. package/src/core/basic/camera.ts +28 -0
  9. package/src/core/basic/clock.ts +11 -0
  10. package/src/core/basic/control.ts +32 -0
  11. package/src/core/basic/index.ts +35 -0
  12. package/src/core/basic/labelRenderer.ts +26 -0
  13. package/src/core/basic/light.ts +63 -0
  14. package/src/core/basic/renderer.ts +37 -0
  15. package/src/core/basic/scene.ts +11 -0
  16. package/src/core/basic/stats.ts +16 -0
  17. package/src/core/event.ts +74 -0
  18. package/src/core/index.ts +11 -0
  19. package/src/core/main.ts +389 -0
  20. package/src/draco/README.md +32 -0
  21. package/src/draco/draco_decoder.js +34 -0
  22. package/src/draco/draco_decoder.wasm +0 -0
  23. package/src/draco/draco_encoder.js +33 -0
  24. package/src/draco/draco_wasm_wrapper.js +117 -0
  25. package/src/draco/gltf/draco_decoder.js +33 -0
  26. package/src/draco/gltf/draco_decoder.wasm +0 -0
  27. package/src/draco/gltf/draco_encoder.js +33 -0
  28. package/src/draco/gltf/draco_wasm_wrapper.js +116 -0
  29. package/src/tileRenderer/base/Tile.d.ts +50 -0
  30. package/src/tileRenderer/base/TileBase.d.ts +76 -0
  31. package/src/tileRenderer/base/TileInternal.d.ts +36 -0
  32. package/src/tileRenderer/base/TilesRendererBase.d.ts +35 -0
  33. package/src/tileRenderer/base/TilesRendererBase.js +847 -0
  34. package/src/tileRenderer/base/Tileset.d.ts +66 -0
  35. package/src/tileRenderer/base/constants.d.ts +6 -0
  36. package/src/tileRenderer/base/constants.js +16 -0
  37. package/src/tileRenderer/base/loaders/B3DMLoaderBase.d.ts +18 -0
  38. package/src/tileRenderer/base/loaders/B3DMLoaderBase.js +85 -0
  39. package/src/tileRenderer/base/loaders/CMPTLoaderBase.d.ts +22 -0
  40. package/src/tileRenderer/base/loaders/CMPTLoaderBase.js +61 -0
  41. package/src/tileRenderer/base/loaders/I3DMLoaderBase.d.ts +21 -0
  42. package/src/tileRenderer/base/loaders/I3DMLoaderBase.js +130 -0
  43. package/src/tileRenderer/base/loaders/LoaderBase.d.ts +10 -0
  44. package/src/tileRenderer/base/loaders/LoaderBase.js +73 -0
  45. package/src/tileRenderer/base/loaders/PNTSLoaderBase.d.ts +17 -0
  46. package/src/tileRenderer/base/loaders/PNTSLoaderBase.js +82 -0
  47. package/src/tileRenderer/base/plugins/ImplicitTilingPlugin.js +12 -0
  48. package/src/tileRenderer/base/traverseFunctions.js +468 -0
  49. package/src/tileRenderer/gltf.js +144 -0
  50. package/src/tileRenderer/index.d.ts +41 -0
  51. package/src/tileRenderer/index.js +44 -0
  52. package/src/tileRenderer/plugins/README.md +578 -0
  53. package/src/tileRenderer/plugins/base/ImplicitTilingPlugin.d.ts +2 -0
  54. package/src/tileRenderer/plugins/base/ImplicitTilingPlugin.js +84 -0
  55. package/src/tileRenderer/plugins/base/SUBTREELoader.js +876 -0
  56. package/src/tileRenderer/plugins/index.d.ts +17 -0
  57. package/src/tileRenderer/plugins/index.js +17 -0
  58. package/src/tileRenderer/plugins/three/CesiumIonAuthPlugin.d.ts +9 -0
  59. package/src/tileRenderer/plugins/three/CesiumIonAuthPlugin.js +175 -0
  60. package/src/tileRenderer/plugins/three/DebugTilesPlugin.d.ts +29 -0
  61. package/src/tileRenderer/plugins/three/DebugTilesPlugin.js +677 -0
  62. package/src/tileRenderer/plugins/three/GLTFExtensionsPlugin.d.ts +18 -0
  63. package/src/tileRenderer/plugins/three/GLTFExtensionsPlugin.js +86 -0
  64. package/src/tileRenderer/plugins/three/GoogleAttributionsManager.js +62 -0
  65. package/src/tileRenderer/plugins/three/GoogleCloudAuthPlugin.d.ts +5 -0
  66. package/src/tileRenderer/plugins/three/GoogleCloudAuthPlugin.js +200 -0
  67. package/src/tileRenderer/plugins/three/ReorientationPlugin.d.ts +12 -0
  68. package/src/tileRenderer/plugins/three/ReorientationPlugin.js +136 -0
  69. package/src/tileRenderer/plugins/three/TileCompressionPlugin.d.ts +18 -0
  70. package/src/tileRenderer/plugins/three/TileCompressionPlugin.js +223 -0
  71. package/src/tileRenderer/plugins/three/UpdateOnChangePlugin.d.ts +5 -0
  72. package/src/tileRenderer/plugins/three/UpdateOnChangePlugin.js +87 -0
  73. package/src/tileRenderer/plugins/three/fade/FadeManager.js +370 -0
  74. package/src/tileRenderer/plugins/three/fade/TilesFadePlugin.d.ts +9 -0
  75. package/src/tileRenderer/plugins/three/fade/TilesFadePlugin.js +318 -0
  76. package/src/tileRenderer/plugins/three/gltf/GLTFCesiumRTCExtension.d.ts +5 -0
  77. package/src/tileRenderer/plugins/three/gltf/GLTFCesiumRTCExtension.js +27 -0
  78. package/src/tileRenderer/plugins/three/gltf/GLTFMeshFeaturesExtension.d.ts +30 -0
  79. package/src/tileRenderer/plugins/three/gltf/GLTFMeshFeaturesExtension.js +76 -0
  80. package/src/tileRenderer/plugins/three/gltf/GLTFStructuralMetadataExtension.d.ts +49 -0
  81. package/src/tileRenderer/plugins/three/gltf/GLTFStructuralMetadataExtension.js +147 -0
  82. package/src/tileRenderer/plugins/three/gltf/metadata/classes/ClassProperty.js +149 -0
  83. package/src/tileRenderer/plugins/three/gltf/metadata/classes/MeshFeatures.js +215 -0
  84. package/src/tileRenderer/plugins/three/gltf/metadata/classes/PropertyAttributeAccessor.js +107 -0
  85. package/src/tileRenderer/plugins/three/gltf/metadata/classes/PropertySetAccessor.js +45 -0
  86. package/src/tileRenderer/plugins/three/gltf/metadata/classes/PropertyTableAccessor.js +209 -0
  87. package/src/tileRenderer/plugins/three/gltf/metadata/classes/PropertyTextureAccessor.js +244 -0
  88. package/src/tileRenderer/plugins/three/gltf/metadata/classes/StructuralMetadata.js +202 -0
  89. package/src/tileRenderer/plugins/three/gltf/metadata/math/Matrix2.js +55 -0
  90. package/src/tileRenderer/plugins/three/gltf/metadata/utilities/ClassPropertyHelpers.js +495 -0
  91. package/src/tileRenderer/plugins/three/gltf/metadata/utilities/TexCoordUtilities.js +72 -0
  92. package/src/tileRenderer/plugins/three/gltf/metadata/utilities/TextureReadUtility.js +154 -0
  93. package/src/tileRenderer/plugins/three/objects/EllipsoidRegionHelper.js +186 -0
  94. package/src/tileRenderer/plugins/three/objects/SphereHelper.js +55 -0
  95. package/src/tileRenderer/r3f/README.md +238 -0
  96. package/src/tileRenderer/r3f/components/CameraControls.jsx +132 -0
  97. package/src/tileRenderer/r3f/components/CameraTransition.jsx +177 -0
  98. package/src/tileRenderer/r3f/components/CanvasDOMOverlay.jsx +54 -0
  99. package/src/tileRenderer/r3f/components/CompassGizmo.jsx +260 -0
  100. package/src/tileRenderer/r3f/components/TilesAttributionOverlay.jsx +110 -0
  101. package/src/tileRenderer/r3f/components/TilesRenderer.jsx +239 -0
  102. package/src/tileRenderer/r3f/index.jsx +6 -0
  103. package/src/tileRenderer/r3f/utilities/useForceUpdate.jsx +8 -0
  104. package/src/tileRenderer/r3f/utilities/useObjectDep.jsx +59 -0
  105. package/src/tileRenderer/r3f/utilities/useOptions.jsx +143 -0
  106. package/src/tileRenderer/three/DebugTilesRenderer.d.ts +28 -0
  107. package/src/tileRenderer/three/DebugTilesRenderer.js +58 -0
  108. package/src/tileRenderer/three/TilesGroup.d.ts +9 -0
  109. package/src/tileRenderer/three/TilesGroup.js +91 -0
  110. package/src/tileRenderer/three/TilesRenderer.d.ts +37 -0
  111. package/src/tileRenderer/three/TilesRenderer.js +1049 -0
  112. package/src/tileRenderer/three/controls/CameraTransitionManager.js +305 -0
  113. package/src/tileRenderer/three/controls/EnvironmentControls.js +1295 -0
  114. package/src/tileRenderer/three/controls/GlobeControls.js +684 -0
  115. package/src/tileRenderer/three/controls/PivotPointMesh.js +104 -0
  116. package/src/tileRenderer/three/controls/PointerTracker.js +257 -0
  117. package/src/tileRenderer/three/controls/utils.js +113 -0
  118. package/src/tileRenderer/three/loaders/B3DMLoader.d.ts +26 -0
  119. package/src/tileRenderer/three/loaders/B3DMLoader.js +85 -0
  120. package/src/tileRenderer/three/loaders/CMPTLoader.d.ts +19 -0
  121. package/src/tileRenderer/three/loaders/CMPTLoader.js +97 -0
  122. package/src/tileRenderer/three/loaders/GLTFExtensionLoader.d.ts +11 -0
  123. package/src/tileRenderer/three/loaders/GLTFExtensionLoader.js +68 -0
  124. package/src/tileRenderer/three/loaders/I3DMLoader.d.ts +26 -0
  125. package/src/tileRenderer/three/loaders/I3DMLoader.js +256 -0
  126. package/src/tileRenderer/three/loaders/PNTSLoader.d.ts +25 -0
  127. package/src/tileRenderer/three/loaders/PNTSLoader.js +202 -0
  128. package/src/tileRenderer/three/loaders/gltf/GLTFCesiumRTCExtension.js +12 -0
  129. package/src/tileRenderer/three/loaders/gltf/GLTFMeshFeaturesExtension.js +12 -0
  130. package/src/tileRenderer/three/loaders/gltf/GLTFStructuralMetadataExtension.js +12 -0
  131. package/src/tileRenderer/three/math/Ellipsoid.d.ts +31 -0
  132. package/src/tileRenderer/three/math/Ellipsoid.js +337 -0
  133. package/src/tileRenderer/three/math/EllipsoidRegion.d.ts +23 -0
  134. package/src/tileRenderer/three/math/EllipsoidRegion.js +178 -0
  135. package/src/tileRenderer/three/math/ExtendedFrustum.js +65 -0
  136. package/src/tileRenderer/three/math/GeoConstants.d.ts +4 -0
  137. package/src/tileRenderer/three/math/GeoConstants.js +5 -0
  138. package/src/tileRenderer/three/math/GeoUtils.d.ts +9 -0
  139. package/src/tileRenderer/three/math/GeoUtils.js +106 -0
  140. package/src/tileRenderer/three/math/OBB.js +179 -0
  141. package/src/tileRenderer/three/math/TileBoundingVolume.js +272 -0
  142. package/src/tileRenderer/three/plugins/CesiumIonAuthPlugin.js +12 -0
  143. package/src/tileRenderer/three/plugins/DebugTilesPlugin.js +26 -0
  144. package/src/tileRenderer/three/plugins/GoogleCloudAuthPlugin.js +12 -0
  145. package/src/tileRenderer/three/raycastTraverse.js +178 -0
  146. package/src/tileRenderer/three/renderers/CesiumIonTilesRenderer.d.ts +14 -0
  147. package/src/tileRenderer/three/renderers/CesiumIonTilesRenderer.js +21 -0
  148. package/src/tileRenderer/three/renderers/GoogleTilesRenderer.d.ts +43 -0
  149. package/src/tileRenderer/three/renderers/GoogleTilesRenderer.js +48 -0
  150. package/src/tileRenderer/three/utilities.js +54 -0
  151. package/src/tileRenderer/utilities/BatchTable.d.ts +24 -0
  152. package/src/tileRenderer/utilities/BatchTable.js +82 -0
  153. package/src/tileRenderer/utilities/BatchTableHierarchyExtension.js +127 -0
  154. package/src/tileRenderer/utilities/FeatureTable.d.ts +30 -0
  155. package/src/tileRenderer/utilities/FeatureTable.js +159 -0
  156. package/src/tileRenderer/utilities/LRUCache.d.ts +8 -0
  157. package/src/tileRenderer/utilities/LRUCache.js +385 -0
  158. package/src/tileRenderer/utilities/PriorityQueue.d.ts +16 -0
  159. package/src/tileRenderer/utilities/PriorityQueue.js +137 -0
  160. package/src/tileRenderer/utilities/arrayToString.js +7 -0
  161. package/src/tileRenderer/utilities/readMagicBytes.js +29 -0
  162. package/src/tileRenderer/utilities/rgb565torgb.js +22 -0
  163. package/src/tileRenderer/utilities/urlExtension.js +34 -0
  164. package/tsconfig.json +42 -0
  165. package/tsconfig.node.json +11 -0
  166. package/typings/three.d.ts +27 -0
@@ -0,0 +1,305 @@
1
+ import { Clock, EventDispatcher, MathUtils, OrthographicCamera, PerspectiveCamera, Vector3 } from 'three';
2
+
3
+ const _forward = new Vector3();
4
+ const _vec = new Vector3();
5
+ const _orthographicCamera = new OrthographicCamera();
6
+ const _targetPos = new Vector3();
7
+
8
+ export class CameraTransitionManager extends EventDispatcher {
9
+
10
+ get animating() {
11
+
12
+ return this._alpha !== 0 && this._alpha !== 1;
13
+
14
+ }
15
+
16
+ get camera() {
17
+
18
+ if ( this._alpha === 0 ) return this.perspectiveCamera;
19
+ if ( this._alpha === 1 ) return this.orthographicCamera;
20
+ return this.transitionCamera;
21
+
22
+ }
23
+
24
+ get mode() {
25
+
26
+ return this._target === 0 ? 'perspective' : 'orthographic';
27
+
28
+ }
29
+
30
+ set mode( v ) {
31
+
32
+ if ( v === this.mode ) {
33
+
34
+ return;
35
+
36
+ }
37
+
38
+ const prevCamera = this.camera;
39
+ if ( v === 'perspective' ) {
40
+
41
+ this._target = 0;
42
+ this._alpha = 0;
43
+
44
+ } else {
45
+
46
+ this._target = 1;
47
+ this._alpha = 1;
48
+
49
+ }
50
+
51
+ this.dispatchEvent( { type: 'camera-change', camera: this.camera, prevCamera: prevCamera } );
52
+
53
+ }
54
+
55
+ constructor( perspectiveCamera = new PerspectiveCamera(), orthographicCamera = new OrthographicCamera() ) {
56
+
57
+ super();
58
+
59
+ this.perspectiveCamera = perspectiveCamera;
60
+ this.orthographicCamera = orthographicCamera;
61
+ this.transitionCamera = new PerspectiveCamera();
62
+
63
+ // settings
64
+ this.orthographicPositionalZoom = true;
65
+ this.orthographicOffset = 50;
66
+ this.fixedPoint = new Vector3();
67
+ this.duration = 200;
68
+ this.autoSync = true;
69
+
70
+ this._target = 0;
71
+ this._alpha = 0;
72
+ this._clock = new Clock();
73
+
74
+ }
75
+
76
+ toggle() {
77
+
78
+ this._target = this._target === 1 ? 0 : 1;
79
+
80
+ }
81
+
82
+ update() {
83
+
84
+ // update transforms
85
+ if ( this.autoSync ) {
86
+
87
+ this.syncCameras();
88
+
89
+ }
90
+
91
+ // perform transition
92
+ const { perspectiveCamera, orthographicCamera, transitionCamera, camera } = this;
93
+ const clock = this._clock;
94
+ const delta = clock.getDelta() * 1e3;
95
+
96
+ if ( this._alpha !== this._target ) {
97
+
98
+ const direction = Math.sign( this._target - this._alpha );
99
+ const step = direction * delta / this.duration;
100
+ this._alpha = MathUtils.clamp( this._alpha + step, 0, 1 );
101
+
102
+ this.dispatchEvent( { type: 'change' } );
103
+
104
+ }
105
+
106
+ // find the new camera
107
+ const prevCamera = camera;
108
+ let newCamera = null;
109
+ if ( this._alpha === 0 ) {
110
+
111
+ newCamera = perspectiveCamera;
112
+
113
+ } else if ( this._alpha === 1 ) {
114
+
115
+ newCamera = orthographicCamera;
116
+
117
+ } else {
118
+
119
+ newCamera = transitionCamera;
120
+ this._updateTransitionCamera();
121
+
122
+ }
123
+
124
+ if ( prevCamera !== newCamera ) {
125
+
126
+ if ( newCamera === transitionCamera ) {
127
+
128
+ this.dispatchEvent( { type: 'transition-start' } );
129
+
130
+ }
131
+
132
+ this.dispatchEvent( { type: 'camera-change', camera: newCamera, prevCamera: prevCamera } );
133
+
134
+ if ( prevCamera === transitionCamera ) {
135
+
136
+ this.dispatchEvent( { type: 'transition-end' } );
137
+
138
+ }
139
+
140
+ }
141
+
142
+ }
143
+
144
+ syncCameras() {
145
+
146
+ const fromCamera = this._getFromCamera();
147
+ const { perspectiveCamera, orthographicCamera, transitionCamera, fixedPoint } = this;
148
+
149
+ _forward.set( 0, 0, - 1 ).transformDirection( fromCamera.matrixWorld ).normalize();
150
+
151
+ if ( fromCamera.isPerspectiveCamera ) {
152
+
153
+ // offset the orthographic camera backwards based on user setting to avoid cases where the ortho
154
+ // camera position will clip into terrain when once transitioned
155
+ if ( this.orthographicPositionalZoom ) {
156
+
157
+ orthographicCamera.position.copy( perspectiveCamera.position ).addScaledVector( _forward, - this.orthographicOffset );
158
+ orthographicCamera.rotation.copy( perspectiveCamera.rotation );
159
+ orthographicCamera.updateMatrixWorld();
160
+
161
+ } else {
162
+
163
+ const orthoDist = _vec.subVectors( fixedPoint, orthographicCamera.position ).dot( _forward );
164
+ const perspDist = _vec.subVectors( fixedPoint, perspectiveCamera.position ).dot( _forward );
165
+
166
+ _vec.copy( perspectiveCamera.position ).addScaledVector( _forward, perspDist );
167
+ orthographicCamera.rotation.copy( perspectiveCamera.rotation );
168
+ orthographicCamera.position.copy( _vec ).addScaledVector( _forward, - orthoDist );
169
+ orthographicCamera.updateMatrixWorld();
170
+
171
+ }
172
+
173
+ // calculate the necessary orthographic zoom based on the current perspective camera position
174
+ const distToPoint = Math.abs( _vec.subVectors( perspectiveCamera.position, fixedPoint ).dot( _forward ) );
175
+ const projectionHeight = 2 * Math.tan( MathUtils.DEG2RAD * perspectiveCamera.fov * 0.5 ) * distToPoint;
176
+ const orthoHeight = orthographicCamera.top - orthographicCamera.bottom;
177
+ orthographicCamera.zoom = orthoHeight / projectionHeight;
178
+ orthographicCamera.updateProjectionMatrix();
179
+
180
+ } else {
181
+
182
+ // calculate the target distance from the point
183
+ const distToPoint = Math.abs( _vec.subVectors( orthographicCamera.position, fixedPoint ).dot( _forward ) );
184
+ const orthoHeight = ( orthographicCamera.top - orthographicCamera.bottom ) / orthographicCamera.zoom;
185
+ const targetDist = orthoHeight * 0.5 / Math.tan( MathUtils.DEG2RAD * perspectiveCamera.fov * 0.5 );
186
+
187
+ // set the final camera position so the pivot point is stable
188
+ perspectiveCamera.rotation.copy( orthographicCamera.rotation );
189
+ perspectiveCamera.position.copy( orthographicCamera.position )
190
+ .addScaledVector( _forward, distToPoint )
191
+ .addScaledVector( _forward, - targetDist );
192
+
193
+ perspectiveCamera.updateMatrixWorld();
194
+
195
+ // shift the orthographic camera position so it aligns with the perspective cameras position as
196
+ // calculated by the FoV. This ensures a consistent orthographic position on transition.
197
+ if ( this.orthographicPositionalZoom ) {
198
+
199
+ orthographicCamera.position.copy( perspectiveCamera.position ).addScaledVector( _forward, - this.orthographicOffset );
200
+ orthographicCamera.updateMatrixWorld();
201
+
202
+ }
203
+
204
+ }
205
+
206
+ transitionCamera.position.copy( perspectiveCamera.position );
207
+ transitionCamera.rotation.copy( perspectiveCamera.rotation );
208
+
209
+ }
210
+
211
+ _getTransitionDirection() {
212
+
213
+ return Math.sign( this._target - this._alpha );
214
+
215
+ }
216
+
217
+ _getToCamera() {
218
+
219
+ const dir = this._getTransitionDirection();
220
+ if ( dir === 0 ) {
221
+
222
+ return this._target === 0 ? this.perspectiveCamera : this.orthographicCamera;
223
+
224
+ } else if ( dir > 0 ) {
225
+
226
+ return this.orthographicCamera;
227
+
228
+ } else {
229
+
230
+ return this.perspectiveCamera;
231
+
232
+ }
233
+
234
+ }
235
+
236
+ _getFromCamera() {
237
+
238
+ const dir = this._getTransitionDirection();
239
+ if ( dir === 0 ) {
240
+
241
+ return this._target === 0 ? this.perspectiveCamera : this.orthographicCamera;
242
+
243
+ } else if ( dir > 0 ) {
244
+
245
+ return this.perspectiveCamera;
246
+
247
+ } else {
248
+
249
+ return this.orthographicCamera;
250
+
251
+ }
252
+
253
+ }
254
+
255
+ _updateTransitionCamera() {
256
+
257
+ // Perform transition interpolation between the orthographic and perspective camera
258
+ // alpha === 0 : perspective
259
+ // alpha === 1 : orthographic
260
+
261
+ const { perspectiveCamera, orthographicCamera, transitionCamera, fixedPoint } = this;
262
+ const alpha = this._alpha;
263
+
264
+ // get the forward vector
265
+ _forward.set( 0, 0, - 1 ).transformDirection( orthographicCamera.matrixWorld ).normalize();
266
+
267
+ _orthographicCamera.copy( orthographicCamera );
268
+ _orthographicCamera.position.addScaledVector( _forward, orthographicCamera.near );
269
+ orthographicCamera.far -= orthographicCamera.near;
270
+ orthographicCamera.near = 0;
271
+
272
+ // compute the projection height based on the perspective camera
273
+ _forward.set( 0, 0, - 1 ).transformDirection( perspectiveCamera.matrixWorld ).normalize();
274
+ const distToPoint = Math.abs( _vec.subVectors( perspectiveCamera.position, fixedPoint ).dot( _forward ) );
275
+ const projectionHeight = 2 * Math.tan( MathUtils.DEG2RAD * perspectiveCamera.fov * 0.5 ) * distToPoint;
276
+
277
+ // calculate the target distance and fov to position the camera at
278
+ const targetFov = MathUtils.lerp( perspectiveCamera.fov, 1, alpha );
279
+ const targetDistance = projectionHeight * 0.5 / Math.tan( MathUtils.DEG2RAD * targetFov * 0.5 );
280
+ const targetPos = _targetPos.lerpVectors( perspectiveCamera.position, _orthographicCamera.position, alpha );
281
+ targetPos.addScaledVector( _forward, Math.abs( _vec.subVectors( targetPos, fixedPoint ).dot( _forward ) ) - targetDistance );
282
+
283
+ const distToPersp = _vec.subVectors( perspectiveCamera.position, targetPos ).dot( _forward );
284
+ const distToOrtho = _vec.subVectors( _orthographicCamera.position, targetPos ).dot( _forward );
285
+
286
+ const targetNearPlane = MathUtils.lerp( distToPersp + perspectiveCamera.near, distToOrtho + _orthographicCamera.near, alpha );
287
+ const targetFarPlane = MathUtils.lerp( distToPersp + perspectiveCamera.far, distToOrtho + _orthographicCamera.far, alpha );
288
+ const planeDelta = Math.max( targetFarPlane, 0 ) - Math.max( targetNearPlane, 0 );
289
+
290
+ // NOTE: The "planeDelta * 1e-5" can wind up being larger than either of the camera near planes, resulting
291
+ // in some clipping during the transition phase.
292
+
293
+ // update the camera state
294
+ transitionCamera.aspect = perspectiveCamera.aspect;
295
+ transitionCamera.fov = targetFov;
296
+ transitionCamera.near = Math.max( targetNearPlane, planeDelta * 1e-5 );
297
+ transitionCamera.far = targetFarPlane;
298
+ transitionCamera.position.copy( targetPos );
299
+ transitionCamera.rotation.copy( perspectiveCamera.rotation );
300
+ transitionCamera.updateProjectionMatrix();
301
+ transitionCamera.updateMatrixWorld();
302
+
303
+ }
304
+
305
+ }