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.
- package/package.json +12 -0
- package/src/common/index.ts +24 -0
- package/src/common/useLine2.ts +87 -0
- package/src/common/useLoader.ts +184 -0
- package/src/common/useLocationCalculator.ts +145 -0
- package/src/common/useMark.ts +42 -0
- package/src/common/useTween.ts +86 -0
- package/src/core/basic/camera.ts +28 -0
- package/src/core/basic/clock.ts +11 -0
- package/src/core/basic/control.ts +32 -0
- package/src/core/basic/index.ts +35 -0
- package/src/core/basic/labelRenderer.ts +26 -0
- package/src/core/basic/light.ts +63 -0
- package/src/core/basic/renderer.ts +37 -0
- package/src/core/basic/scene.ts +11 -0
- package/src/core/basic/stats.ts +16 -0
- package/src/core/event.ts +74 -0
- package/src/core/index.ts +11 -0
- package/src/core/main.ts +389 -0
- package/src/draco/README.md +32 -0
- package/src/draco/draco_decoder.js +34 -0
- package/src/draco/draco_decoder.wasm +0 -0
- package/src/draco/draco_encoder.js +33 -0
- package/src/draco/draco_wasm_wrapper.js +117 -0
- package/src/draco/gltf/draco_decoder.js +33 -0
- package/src/draco/gltf/draco_decoder.wasm +0 -0
- package/src/draco/gltf/draco_encoder.js +33 -0
- package/src/draco/gltf/draco_wasm_wrapper.js +116 -0
- package/src/tileRenderer/base/Tile.d.ts +50 -0
- package/src/tileRenderer/base/TileBase.d.ts +76 -0
- package/src/tileRenderer/base/TileInternal.d.ts +36 -0
- package/src/tileRenderer/base/TilesRendererBase.d.ts +35 -0
- package/src/tileRenderer/base/TilesRendererBase.js +847 -0
- package/src/tileRenderer/base/Tileset.d.ts +66 -0
- package/src/tileRenderer/base/constants.d.ts +6 -0
- package/src/tileRenderer/base/constants.js +16 -0
- package/src/tileRenderer/base/loaders/B3DMLoaderBase.d.ts +18 -0
- package/src/tileRenderer/base/loaders/B3DMLoaderBase.js +85 -0
- package/src/tileRenderer/base/loaders/CMPTLoaderBase.d.ts +22 -0
- package/src/tileRenderer/base/loaders/CMPTLoaderBase.js +61 -0
- package/src/tileRenderer/base/loaders/I3DMLoaderBase.d.ts +21 -0
- package/src/tileRenderer/base/loaders/I3DMLoaderBase.js +130 -0
- package/src/tileRenderer/base/loaders/LoaderBase.d.ts +10 -0
- package/src/tileRenderer/base/loaders/LoaderBase.js +73 -0
- package/src/tileRenderer/base/loaders/PNTSLoaderBase.d.ts +17 -0
- package/src/tileRenderer/base/loaders/PNTSLoaderBase.js +82 -0
- package/src/tileRenderer/base/plugins/ImplicitTilingPlugin.js +12 -0
- package/src/tileRenderer/base/traverseFunctions.js +468 -0
- package/src/tileRenderer/gltf.js +144 -0
- package/src/tileRenderer/index.d.ts +41 -0
- package/src/tileRenderer/index.js +44 -0
- package/src/tileRenderer/plugins/README.md +578 -0
- package/src/tileRenderer/plugins/base/ImplicitTilingPlugin.d.ts +2 -0
- package/src/tileRenderer/plugins/base/ImplicitTilingPlugin.js +84 -0
- package/src/tileRenderer/plugins/base/SUBTREELoader.js +876 -0
- package/src/tileRenderer/plugins/index.d.ts +17 -0
- package/src/tileRenderer/plugins/index.js +17 -0
- package/src/tileRenderer/plugins/three/CesiumIonAuthPlugin.d.ts +9 -0
- package/src/tileRenderer/plugins/three/CesiumIonAuthPlugin.js +175 -0
- package/src/tileRenderer/plugins/three/DebugTilesPlugin.d.ts +29 -0
- package/src/tileRenderer/plugins/three/DebugTilesPlugin.js +677 -0
- package/src/tileRenderer/plugins/three/GLTFExtensionsPlugin.d.ts +18 -0
- package/src/tileRenderer/plugins/three/GLTFExtensionsPlugin.js +86 -0
- package/src/tileRenderer/plugins/three/GoogleAttributionsManager.js +62 -0
- package/src/tileRenderer/plugins/three/GoogleCloudAuthPlugin.d.ts +5 -0
- package/src/tileRenderer/plugins/three/GoogleCloudAuthPlugin.js +200 -0
- package/src/tileRenderer/plugins/three/ReorientationPlugin.d.ts +12 -0
- package/src/tileRenderer/plugins/three/ReorientationPlugin.js +136 -0
- package/src/tileRenderer/plugins/three/TileCompressionPlugin.d.ts +18 -0
- package/src/tileRenderer/plugins/three/TileCompressionPlugin.js +223 -0
- package/src/tileRenderer/plugins/three/UpdateOnChangePlugin.d.ts +5 -0
- package/src/tileRenderer/plugins/three/UpdateOnChangePlugin.js +87 -0
- package/src/tileRenderer/plugins/three/fade/FadeManager.js +370 -0
- package/src/tileRenderer/plugins/three/fade/TilesFadePlugin.d.ts +9 -0
- package/src/tileRenderer/plugins/three/fade/TilesFadePlugin.js +318 -0
- package/src/tileRenderer/plugins/three/gltf/GLTFCesiumRTCExtension.d.ts +5 -0
- package/src/tileRenderer/plugins/three/gltf/GLTFCesiumRTCExtension.js +27 -0
- package/src/tileRenderer/plugins/three/gltf/GLTFMeshFeaturesExtension.d.ts +30 -0
- package/src/tileRenderer/plugins/three/gltf/GLTFMeshFeaturesExtension.js +76 -0
- package/src/tileRenderer/plugins/three/gltf/GLTFStructuralMetadataExtension.d.ts +49 -0
- package/src/tileRenderer/plugins/three/gltf/GLTFStructuralMetadataExtension.js +147 -0
- package/src/tileRenderer/plugins/three/gltf/metadata/classes/ClassProperty.js +149 -0
- package/src/tileRenderer/plugins/three/gltf/metadata/classes/MeshFeatures.js +215 -0
- package/src/tileRenderer/plugins/three/gltf/metadata/classes/PropertyAttributeAccessor.js +107 -0
- package/src/tileRenderer/plugins/three/gltf/metadata/classes/PropertySetAccessor.js +45 -0
- package/src/tileRenderer/plugins/three/gltf/metadata/classes/PropertyTableAccessor.js +209 -0
- package/src/tileRenderer/plugins/three/gltf/metadata/classes/PropertyTextureAccessor.js +244 -0
- package/src/tileRenderer/plugins/three/gltf/metadata/classes/StructuralMetadata.js +202 -0
- package/src/tileRenderer/plugins/three/gltf/metadata/math/Matrix2.js +55 -0
- package/src/tileRenderer/plugins/three/gltf/metadata/utilities/ClassPropertyHelpers.js +495 -0
- package/src/tileRenderer/plugins/three/gltf/metadata/utilities/TexCoordUtilities.js +72 -0
- package/src/tileRenderer/plugins/three/gltf/metadata/utilities/TextureReadUtility.js +154 -0
- package/src/tileRenderer/plugins/three/objects/EllipsoidRegionHelper.js +186 -0
- package/src/tileRenderer/plugins/three/objects/SphereHelper.js +55 -0
- package/src/tileRenderer/r3f/README.md +238 -0
- package/src/tileRenderer/r3f/components/CameraControls.jsx +132 -0
- package/src/tileRenderer/r3f/components/CameraTransition.jsx +177 -0
- package/src/tileRenderer/r3f/components/CanvasDOMOverlay.jsx +54 -0
- package/src/tileRenderer/r3f/components/CompassGizmo.jsx +260 -0
- package/src/tileRenderer/r3f/components/TilesAttributionOverlay.jsx +110 -0
- package/src/tileRenderer/r3f/components/TilesRenderer.jsx +239 -0
- package/src/tileRenderer/r3f/index.jsx +6 -0
- package/src/tileRenderer/r3f/utilities/useForceUpdate.jsx +8 -0
- package/src/tileRenderer/r3f/utilities/useObjectDep.jsx +59 -0
- package/src/tileRenderer/r3f/utilities/useOptions.jsx +143 -0
- package/src/tileRenderer/three/DebugTilesRenderer.d.ts +28 -0
- package/src/tileRenderer/three/DebugTilesRenderer.js +58 -0
- package/src/tileRenderer/three/TilesGroup.d.ts +9 -0
- package/src/tileRenderer/three/TilesGroup.js +91 -0
- package/src/tileRenderer/three/TilesRenderer.d.ts +37 -0
- package/src/tileRenderer/three/TilesRenderer.js +1049 -0
- package/src/tileRenderer/three/controls/CameraTransitionManager.js +305 -0
- package/src/tileRenderer/three/controls/EnvironmentControls.js +1295 -0
- package/src/tileRenderer/three/controls/GlobeControls.js +684 -0
- package/src/tileRenderer/three/controls/PivotPointMesh.js +104 -0
- package/src/tileRenderer/three/controls/PointerTracker.js +257 -0
- package/src/tileRenderer/three/controls/utils.js +113 -0
- package/src/tileRenderer/three/loaders/B3DMLoader.d.ts +26 -0
- package/src/tileRenderer/three/loaders/B3DMLoader.js +85 -0
- package/src/tileRenderer/three/loaders/CMPTLoader.d.ts +19 -0
- package/src/tileRenderer/three/loaders/CMPTLoader.js +97 -0
- package/src/tileRenderer/three/loaders/GLTFExtensionLoader.d.ts +11 -0
- package/src/tileRenderer/three/loaders/GLTFExtensionLoader.js +68 -0
- package/src/tileRenderer/three/loaders/I3DMLoader.d.ts +26 -0
- package/src/tileRenderer/three/loaders/I3DMLoader.js +256 -0
- package/src/tileRenderer/three/loaders/PNTSLoader.d.ts +25 -0
- package/src/tileRenderer/three/loaders/PNTSLoader.js +202 -0
- package/src/tileRenderer/three/loaders/gltf/GLTFCesiumRTCExtension.js +12 -0
- package/src/tileRenderer/three/loaders/gltf/GLTFMeshFeaturesExtension.js +12 -0
- package/src/tileRenderer/three/loaders/gltf/GLTFStructuralMetadataExtension.js +12 -0
- package/src/tileRenderer/three/math/Ellipsoid.d.ts +31 -0
- package/src/tileRenderer/three/math/Ellipsoid.js +337 -0
- package/src/tileRenderer/three/math/EllipsoidRegion.d.ts +23 -0
- package/src/tileRenderer/three/math/EllipsoidRegion.js +178 -0
- package/src/tileRenderer/three/math/ExtendedFrustum.js +65 -0
- package/src/tileRenderer/three/math/GeoConstants.d.ts +4 -0
- package/src/tileRenderer/three/math/GeoConstants.js +5 -0
- package/src/tileRenderer/three/math/GeoUtils.d.ts +9 -0
- package/src/tileRenderer/three/math/GeoUtils.js +106 -0
- package/src/tileRenderer/three/math/OBB.js +179 -0
- package/src/tileRenderer/three/math/TileBoundingVolume.js +272 -0
- package/src/tileRenderer/three/plugins/CesiumIonAuthPlugin.js +12 -0
- package/src/tileRenderer/three/plugins/DebugTilesPlugin.js +26 -0
- package/src/tileRenderer/three/plugins/GoogleCloudAuthPlugin.js +12 -0
- package/src/tileRenderer/three/raycastTraverse.js +178 -0
- package/src/tileRenderer/three/renderers/CesiumIonTilesRenderer.d.ts +14 -0
- package/src/tileRenderer/three/renderers/CesiumIonTilesRenderer.js +21 -0
- package/src/tileRenderer/three/renderers/GoogleTilesRenderer.d.ts +43 -0
- package/src/tileRenderer/three/renderers/GoogleTilesRenderer.js +48 -0
- package/src/tileRenderer/three/utilities.js +54 -0
- package/src/tileRenderer/utilities/BatchTable.d.ts +24 -0
- package/src/tileRenderer/utilities/BatchTable.js +82 -0
- package/src/tileRenderer/utilities/BatchTableHierarchyExtension.js +127 -0
- package/src/tileRenderer/utilities/FeatureTable.d.ts +30 -0
- package/src/tileRenderer/utilities/FeatureTable.js +159 -0
- package/src/tileRenderer/utilities/LRUCache.d.ts +8 -0
- package/src/tileRenderer/utilities/LRUCache.js +385 -0
- package/src/tileRenderer/utilities/PriorityQueue.d.ts +16 -0
- package/src/tileRenderer/utilities/PriorityQueue.js +137 -0
- package/src/tileRenderer/utilities/arrayToString.js +7 -0
- package/src/tileRenderer/utilities/readMagicBytes.js +29 -0
- package/src/tileRenderer/utilities/rgb565torgb.js +22 -0
- package/src/tileRenderer/utilities/urlExtension.js +34 -0
- package/tsconfig.json +42 -0
- package/tsconfig.node.json +11 -0
- package/typings/three.d.ts +27 -0
package/package.json
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { useLoader } from './useLoader'
|
|
2
|
+
import { useMark, EMarkDefaultStyle } from './useMark'
|
|
3
|
+
import { useLine2 } from './useLine2'
|
|
4
|
+
import { useLocationCalculator } from './useLocationCalculator'
|
|
5
|
+
import { Animation } from './useTween'
|
|
6
|
+
|
|
7
|
+
import type { IPathItem } from './useTween'
|
|
8
|
+
|
|
9
|
+
export {
|
|
10
|
+
useLoader,
|
|
11
|
+
|
|
12
|
+
useMark,
|
|
13
|
+
EMarkDefaultStyle,
|
|
14
|
+
|
|
15
|
+
useLine2,
|
|
16
|
+
|
|
17
|
+
useLocationCalculator,
|
|
18
|
+
|
|
19
|
+
Animation
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export type {
|
|
23
|
+
IPathItem
|
|
24
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import * as THREE from 'three'
|
|
2
|
+
import { Line2 } from 'three/examples/jsm/lines/Line2.js'
|
|
3
|
+
import { LineGeometry } from 'three/examples/jsm/lines/LineGeometry.js'
|
|
4
|
+
import { LineMaterial } from 'three/examples/jsm/lines/LineMaterial.js'
|
|
5
|
+
|
|
6
|
+
const setLineGeometry = (start: THREE.Vector3, end: THREE.Vector3) => {
|
|
7
|
+
const pointArr = [start.x, start.y, start.z, end.x, end.y, end.z];
|
|
8
|
+
const geometry = new LineGeometry();
|
|
9
|
+
geometry.setPositions(pointArr);
|
|
10
|
+
|
|
11
|
+
return geometry;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const createLine2 = (config: {
|
|
15
|
+
name: string;
|
|
16
|
+
startPos: THREE.Vector3;
|
|
17
|
+
endPos: THREE.Vector3;
|
|
18
|
+
color?: number;
|
|
19
|
+
linewidth?: number;
|
|
20
|
+
}) => {
|
|
21
|
+
const color = config.color ? config.color : 0xFF9100;
|
|
22
|
+
const linewidth = config.linewidth ? config.linewidth : 6;
|
|
23
|
+
|
|
24
|
+
const geometry = setLineGeometry(config.startPos, config.endPos)
|
|
25
|
+
const centerPoint = new THREE.Vector3().copy(config.startPos).add(config.endPos).multiplyScalar(0.5)
|
|
26
|
+
const distance = Number(new THREE.Vector3().copy(config.startPos).distanceTo(config.endPos))
|
|
27
|
+
|
|
28
|
+
const material = new LineMaterial({
|
|
29
|
+
color,
|
|
30
|
+
linewidth
|
|
31
|
+
})
|
|
32
|
+
material.resolution.set(window.innerWidth, window.innerHeight);
|
|
33
|
+
const line = new Line2(geometry, material);
|
|
34
|
+
line.name = config.name
|
|
35
|
+
line.userData.startPos = config.startPos
|
|
36
|
+
line.userData.endPos = config.endPos
|
|
37
|
+
|
|
38
|
+
return {
|
|
39
|
+
centerPoint,
|
|
40
|
+
distance,
|
|
41
|
+
line
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const updateLine2 = (config: {
|
|
46
|
+
line: Line2;
|
|
47
|
+
startPos?: THREE.Vector3;
|
|
48
|
+
endPos?: THREE.Vector3;
|
|
49
|
+
color?: THREE.Color;
|
|
50
|
+
linewidth?: number;
|
|
51
|
+
}) => {
|
|
52
|
+
if (config.color) {
|
|
53
|
+
config.line.material.color = config.color
|
|
54
|
+
}
|
|
55
|
+
if (config.linewidth) {
|
|
56
|
+
config.line.material.linewidth = config.linewidth
|
|
57
|
+
}
|
|
58
|
+
if (config.startPos) {
|
|
59
|
+
config.line.userData.startPos = config.startPos
|
|
60
|
+
}
|
|
61
|
+
if (config.endPos) {
|
|
62
|
+
config.line.userData.endPos = config.endPos
|
|
63
|
+
}
|
|
64
|
+
if (config.startPos || config.endPos) {
|
|
65
|
+
const geometry = setLineGeometry(config.line.userData.startPos, config.line.userData.endPos)
|
|
66
|
+
config.line.geometry = geometry
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const centerPoint = new THREE.Vector3().copy(config.line.userData.startPos).add(config.line.userData.endPos).multiplyScalar(0.5)
|
|
70
|
+
const distance = Number(new THREE.Vector3().copy(config.line.userData.startPos).distanceTo(config.line.userData.endPos))
|
|
71
|
+
|
|
72
|
+
return {
|
|
73
|
+
centerPoint,
|
|
74
|
+
distance
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const useLine2 = () => {
|
|
79
|
+
return {
|
|
80
|
+
createLine2,
|
|
81
|
+
updateLine2
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export {
|
|
86
|
+
useLine2
|
|
87
|
+
}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import * as THREE from 'three'
|
|
2
|
+
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js"
|
|
3
|
+
import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js'
|
|
4
|
+
import { OBJLoader } from "three/examples/jsm/loaders/OBJLoader.js"
|
|
5
|
+
import { MTLLoader } from 'three/examples/jsm/loaders/MTLLoader.js'
|
|
6
|
+
import { FBXLoader } from 'three/examples/jsm/loaders/FBXLoader.js'
|
|
7
|
+
import { TGALoader } from 'three/examples/jsm/loaders/TGALoader.js'
|
|
8
|
+
import { TilesRenderer } from '../tileRenderer'
|
|
9
|
+
import { GoogleCloudAuthPlugin } from '../tileRenderer/plugins';
|
|
10
|
+
import { enableDefaultEvent, EDefaultEvent } from '../core'
|
|
11
|
+
|
|
12
|
+
//todo 1.曝光
|
|
13
|
+
interface IThreeLoaders {
|
|
14
|
+
GLTFLoader: GLTFLoader | null,
|
|
15
|
+
DRACOLoader: DRACOLoader | null,
|
|
16
|
+
OBJLoader: OBJLoader | null,
|
|
17
|
+
MTLLoader: MTLLoader | null,
|
|
18
|
+
FBXLoader: FBXLoader | null,
|
|
19
|
+
TGALoader: TGALoader | null,
|
|
20
|
+
TextureLoader: THREE.TextureLoader | null
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const threeLoaders: IThreeLoaders = {
|
|
24
|
+
GLTFLoader: null,
|
|
25
|
+
DRACOLoader: null,
|
|
26
|
+
OBJLoader: null,
|
|
27
|
+
MTLLoader: null,
|
|
28
|
+
FBXLoader: null,
|
|
29
|
+
TGALoader: null,
|
|
30
|
+
TextureLoader: null
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const useLoader = () => {
|
|
34
|
+
const useTextureLoader = (url: string, callback?: (texture: THREE.Texture) => void) => {
|
|
35
|
+
threeLoaders.TextureLoader = new THREE.TextureLoader()
|
|
36
|
+
const texture = threeLoaders.TextureLoader.load(url, (texture) => {
|
|
37
|
+
callback && callback(texture)
|
|
38
|
+
})
|
|
39
|
+
return texture;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const setFBXLoader = () => {
|
|
43
|
+
threeLoaders.FBXLoader = new FBXLoader()
|
|
44
|
+
threeLoaders.FBXLoader.setPath("/model")
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const useFBXLoader = (url: string, callback: (object: THREE.Group & Record<'mixer', THREE.AnimationMixer>) => void, xhrCallback?: (xhr: ProgressEvent<EventTarget>) => void) => {
|
|
48
|
+
setFBXLoader()
|
|
49
|
+
|
|
50
|
+
threeLoaders.FBXLoader!.load(url, (object) => {
|
|
51
|
+
object.traverse((child) => {
|
|
52
|
+
if (child instanceof THREE.Mesh) {
|
|
53
|
+
child.castShadow = true;
|
|
54
|
+
child.receiveShadow = true;
|
|
55
|
+
child.material.fog = true;
|
|
56
|
+
child.material.emissive = child.material.color;
|
|
57
|
+
child.material.emissiveMap = child.material.map;
|
|
58
|
+
child.material.side = 0;
|
|
59
|
+
child.material.shadowSide = THREE.BackSide;
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
callback(object as THREE.Group & Record<'mixer', THREE.AnimationMixer>)
|
|
63
|
+
}, (xhr) => {
|
|
64
|
+
xhrCallback && xhrCallback(xhr)
|
|
65
|
+
})
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const setGLTFLoader = () => {
|
|
69
|
+
threeLoaders.DRACOLoader = new DRACOLoader()
|
|
70
|
+
threeLoaders.DRACOLoader.setDecoderPath('/draco/gltf/');
|
|
71
|
+
threeLoaders.DRACOLoader.preload()
|
|
72
|
+
|
|
73
|
+
threeLoaders.GLTFLoader = new GLTFLoader()
|
|
74
|
+
threeLoaders.GLTFLoader.setDRACOLoader(threeLoaders.DRACOLoader)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const useGLTFLoader = (url: string, callback: (object: THREE.Group, animations: {
|
|
78
|
+
mixer: THREE.AnimationMixer | null,
|
|
79
|
+
actions: THREE.AnimationAction[]
|
|
80
|
+
}) => void, xhrCallback?: (xhr: ProgressEvent<EventTarget>) => void) => {
|
|
81
|
+
if (!threeLoaders.GLTFLoader) {
|
|
82
|
+
setGLTFLoader()
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if (url.includes('http')) {
|
|
86
|
+
threeLoaders.GLTFLoader!.setPath('')
|
|
87
|
+
} else {
|
|
88
|
+
threeLoaders.GLTFLoader!.setPath('/model')
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
threeLoaders.GLTFLoader!.load(url, (object) => {
|
|
92
|
+
object.scene.updateMatrixWorld()
|
|
93
|
+
object.scene.traverse(child => {
|
|
94
|
+
if (child instanceof THREE.Mesh) {
|
|
95
|
+
child.material.fog = true;
|
|
96
|
+
child.castShadow = true;
|
|
97
|
+
child.receiveShadow = true;
|
|
98
|
+
child.material.side = 0;
|
|
99
|
+
child.material.shadowSide = THREE.BackSide;
|
|
100
|
+
}
|
|
101
|
+
})
|
|
102
|
+
object.scene.animations = object.animations
|
|
103
|
+
|
|
104
|
+
const animaion: {
|
|
105
|
+
mixer: THREE.AnimationMixer | null,
|
|
106
|
+
actions: THREE.AnimationAction[]
|
|
107
|
+
} = {
|
|
108
|
+
mixer: null,
|
|
109
|
+
actions: []
|
|
110
|
+
}
|
|
111
|
+
animaion.mixer = new THREE.AnimationMixer(object.scene)
|
|
112
|
+
animaion.actions = object.animations.map(item => animaion.mixer!.clipAction(item))
|
|
113
|
+
|
|
114
|
+
callback(object.scene, animaion)
|
|
115
|
+
}, (xhr) => {
|
|
116
|
+
xhrCallback && xhrCallback(xhr)
|
|
117
|
+
})
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const useOfflineGoogleCloudTilesLoader = (config: {
|
|
121
|
+
url: string;
|
|
122
|
+
lat: number;
|
|
123
|
+
lon: number;
|
|
124
|
+
config: ITHREEConfiguration;
|
|
125
|
+
}, callback?: (tilesRenderer: TilesRenderer, clearFn: () => void) => void) => {
|
|
126
|
+
let tilesRenderer: TilesRenderer | null = new TilesRenderer();
|
|
127
|
+
tilesRenderer.registerPlugin(new GoogleCloudAuthPlugin({ url: config.url }));
|
|
128
|
+
tilesRenderer.setLatLonToYUp(config.lat * THREE.MathUtils.DEG2RAD, config.lon * THREE.MathUtils.DEG2RAD);
|
|
129
|
+
|
|
130
|
+
const dracoLoader = new DRACOLoader();
|
|
131
|
+
dracoLoader.setDecoderPath('../draco/gltf/');
|
|
132
|
+
|
|
133
|
+
const loader = new GLTFLoader(tilesRenderer.manager);
|
|
134
|
+
loader.setDRACOLoader(dracoLoader);
|
|
135
|
+
|
|
136
|
+
tilesRenderer.manager.addHandler(/\.gltf$/, loader);
|
|
137
|
+
|
|
138
|
+
enableDefaultEvent(EDefaultEvent.INSERTANIMATIONS, {
|
|
139
|
+
cb() {
|
|
140
|
+
if (tilesRenderer) {
|
|
141
|
+
tilesRenderer.update()
|
|
142
|
+
tilesRenderer.setResolutionFromRenderer(config.config.camera!, config.config.renderer!);
|
|
143
|
+
tilesRenderer.setCamera(config.config.camera!);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
})
|
|
147
|
+
|
|
148
|
+
config.config.scene!.add(tilesRenderer.group)
|
|
149
|
+
tilesRenderer.setResolutionFromRenderer(config.config.camera!, config.config.renderer!);
|
|
150
|
+
tilesRenderer.setCamera(config.config.camera!);
|
|
151
|
+
|
|
152
|
+
const clear = () => {
|
|
153
|
+
if (tilesRenderer) {
|
|
154
|
+
config.config.scene!.remove(tilesRenderer.group)
|
|
155
|
+
tilesRenderer = null
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
callback && callback(tilesRenderer, clear)
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
//todo 1.多动画封装 2.动画库封装 3.多动画加载时间差 4.同模型克隆
|
|
163
|
+
const useMixer: (object: THREE.Object3D, animate: THREE.AnimationClip) => { mixer: THREE.AnimationMixer, action: THREE.AnimationAction } = (object: THREE.Object3D, animate: THREE.AnimationClip) => {
|
|
164
|
+
const mixer = new THREE.AnimationMixer(object)
|
|
165
|
+
const action = mixer.clipAction(animate);
|
|
166
|
+
|
|
167
|
+
return {
|
|
168
|
+
mixer,
|
|
169
|
+
action
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
return {
|
|
174
|
+
useTextureLoader,
|
|
175
|
+
useFBXLoader,
|
|
176
|
+
useGLTFLoader,
|
|
177
|
+
useOfflineGoogleCloudTilesLoader,
|
|
178
|
+
useMixer
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
export {
|
|
183
|
+
useLoader
|
|
184
|
+
}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import * as THREE from 'three'
|
|
2
|
+
|
|
3
|
+
interface IPercentages {
|
|
4
|
+
index: number;
|
|
5
|
+
percentages: number[];
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
const useLocationCalculator = () => {
|
|
9
|
+
const getEqualNodes = (points: THREE.Vector3[], parts: number) => {
|
|
10
|
+
const percentages: IPercentages[] = getPercentage(points, parts)
|
|
11
|
+
|
|
12
|
+
const node = points.reduce((pre: THREE.Vector3[], next, index) => {
|
|
13
|
+
if (index === 0) {
|
|
14
|
+
return pre
|
|
15
|
+
} else {
|
|
16
|
+
const spline = new THREE.LineCurve3(points[index - 1], next);
|
|
17
|
+
const node = spline.getPoints(9999)
|
|
18
|
+
for (const item of percentages) {
|
|
19
|
+
if (item.index === index) {
|
|
20
|
+
pre = pre.concat(item.percentages.map((ele) => {
|
|
21
|
+
if (Math.round(ele * 100) === 0) {
|
|
22
|
+
return node[Math.round(ele * 100)]
|
|
23
|
+
} else {
|
|
24
|
+
return node[Math.round(ele * 100) - 1]
|
|
25
|
+
}
|
|
26
|
+
}))
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return pre
|
|
30
|
+
}
|
|
31
|
+
}, [])
|
|
32
|
+
|
|
33
|
+
return {
|
|
34
|
+
node
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const getPercentage = (points: THREE.Vector3[], parts: number) => {
|
|
39
|
+
const linePercentages = points.reduce((data: {
|
|
40
|
+
totalLength: number;
|
|
41
|
+
lengths: number[];
|
|
42
|
+
percentages: number[];
|
|
43
|
+
}, next, index) => {
|
|
44
|
+
if (index === 0) {
|
|
45
|
+
return data
|
|
46
|
+
} else {
|
|
47
|
+
const length = points[index - 1].distanceTo(next)
|
|
48
|
+
data.lengths.push(length)
|
|
49
|
+
data.totalLength = data.totalLength + length
|
|
50
|
+
if (index === points.length - 1) {
|
|
51
|
+
for (const [index, item] of data.lengths.entries()) {
|
|
52
|
+
if (index === 0) {
|
|
53
|
+
data.percentages.push(Math.round(item / data.totalLength * 10000) / 100.00)
|
|
54
|
+
} else {
|
|
55
|
+
data.percentages.push(Math.round(item / data.totalLength * 10000) / 100.00 + data.percentages[index - 1])
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
data.percentages.unshift(0)
|
|
59
|
+
}
|
|
60
|
+
return data
|
|
61
|
+
}
|
|
62
|
+
}, {
|
|
63
|
+
totalLength: 0,
|
|
64
|
+
lengths: [],
|
|
65
|
+
percentages: []
|
|
66
|
+
}).percentages
|
|
67
|
+
|
|
68
|
+
const equalPercentage = new Array(parts - 1).fill('').reduce((percentages, next, index) => {
|
|
69
|
+
const percentage = (index + 1) * Math.round(Math.round(1 / (parts - 1) * 10000)) / 100.00
|
|
70
|
+
if (percentage >= 100) {
|
|
71
|
+
percentages.push(99.99)
|
|
72
|
+
} else {
|
|
73
|
+
percentages.push(percentage)
|
|
74
|
+
}
|
|
75
|
+
return percentages
|
|
76
|
+
}, [])
|
|
77
|
+
|
|
78
|
+
const data = linePercentages.reduce((data: {
|
|
79
|
+
name: number;
|
|
80
|
+
percentages: number[];
|
|
81
|
+
index: number;
|
|
82
|
+
}[], next: number, i: number) => {
|
|
83
|
+
if (i > 0) {
|
|
84
|
+
for (const item of equalPercentage) {
|
|
85
|
+
const pre = linePercentages[i - 1]
|
|
86
|
+
if (item > pre && item < next) {
|
|
87
|
+
const percentage = Math.round((item - pre) / (next - pre) * 10000) / 100.00
|
|
88
|
+
if (data.length === 0) {
|
|
89
|
+
data.push({
|
|
90
|
+
name: next,
|
|
91
|
+
percentages: [percentage],
|
|
92
|
+
index: i
|
|
93
|
+
})
|
|
94
|
+
} else {
|
|
95
|
+
const keys = data.map(ele => {
|
|
96
|
+
if (ele.name === next) {
|
|
97
|
+
ele.percentages.push(percentage)
|
|
98
|
+
}
|
|
99
|
+
return ele.name
|
|
100
|
+
})
|
|
101
|
+
if (!keys.includes(next)) {
|
|
102
|
+
data.push({
|
|
103
|
+
name: next,
|
|
104
|
+
percentages: [percentage],
|
|
105
|
+
index: i
|
|
106
|
+
})
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
if (i === linePercentages.length - 1) {
|
|
112
|
+
if (!data.map(ele => ele.index).includes(1)) {
|
|
113
|
+
data.unshift({
|
|
114
|
+
name: 0,
|
|
115
|
+
percentages: [0],
|
|
116
|
+
index: 1
|
|
117
|
+
})
|
|
118
|
+
} else {
|
|
119
|
+
for (const item of data) {
|
|
120
|
+
if (item.index === 1) {
|
|
121
|
+
item.percentages.unshift(0)
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return data
|
|
128
|
+
}, []).map(item => {
|
|
129
|
+
return {
|
|
130
|
+
percentages: item.percentages,
|
|
131
|
+
index: item.index
|
|
132
|
+
}
|
|
133
|
+
})
|
|
134
|
+
|
|
135
|
+
return data
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
return {
|
|
139
|
+
getEqualNodes
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export {
|
|
144
|
+
useLocationCalculator
|
|
145
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import * as THREE from 'three'
|
|
2
|
+
import { CSS2DObject } from 'three/examples/jsm/renderers/CSS2DRenderer.js';
|
|
3
|
+
|
|
4
|
+
enum EMarkDefaultStyle {
|
|
5
|
+
NORMAL = 'three_mark',
|
|
6
|
+
ACTIVE = 'three_mark_active'
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
const useMark = () => {
|
|
10
|
+
const createMark = (pos: THREE.Vector3, className: string) => {
|
|
11
|
+
const div = document.createElement('div');
|
|
12
|
+
div.style.pointerEvents = 'auto'
|
|
13
|
+
div.classList.add(className)
|
|
14
|
+
const mark = new CSS2DObject(div)
|
|
15
|
+
mark.userData = {
|
|
16
|
+
ray: {
|
|
17
|
+
filterable: true
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
mark.position.set(pos.x, pos.y, pos.z)
|
|
21
|
+
return {
|
|
22
|
+
mark
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const updateMarkStyle = (marks: CSS2DObject[], className: string) => {
|
|
27
|
+
marks.forEach(mark => {
|
|
28
|
+
mark.element.classList.remove(...mark.element.classList)
|
|
29
|
+
mark.element.classList.add(className)
|
|
30
|
+
})
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return {
|
|
34
|
+
createMark,
|
|
35
|
+
updateMarkStyle
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export {
|
|
40
|
+
useMark,
|
|
41
|
+
EMarkDefaultStyle
|
|
42
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import * as THREE from 'three'
|
|
2
|
+
import * as TWEEN from '@tweenjs/tween.js'
|
|
3
|
+
|
|
4
|
+
export interface IPathItem {
|
|
5
|
+
startPos: THREE.Vector3;
|
|
6
|
+
endPos: THREE.Vector3;
|
|
7
|
+
delay: number;
|
|
8
|
+
speed: number;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
type TTweenType = 'start' | 'pause' | 'stop' | 'resume'
|
|
12
|
+
|
|
13
|
+
class Animation {
|
|
14
|
+
tweenActionList: TWEEN.Tween<THREE.Vector3>[] = []
|
|
15
|
+
currentMesh: THREE.Object3D | null = null
|
|
16
|
+
currentIndex: number = 0
|
|
17
|
+
complete: boolean = false
|
|
18
|
+
x: number = 0
|
|
19
|
+
y: number = 0
|
|
20
|
+
z: number = 0
|
|
21
|
+
|
|
22
|
+
createTween = (pre: THREE.Vector3, next: THREE.Vector3, delay: number, speed: number, index: number, loop: boolean) => {
|
|
23
|
+
let currentDelay = 0
|
|
24
|
+
if (index === 0) {
|
|
25
|
+
currentDelay = delay * 1000
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const time = new THREE.Vector3(pre.x, pre.y, pre.z).distanceTo(new THREE.Vector3(next.x, next.y, next.z)) / (speed * 0.001)
|
|
29
|
+
const tween = new TWEEN.Tween(pre).to(next, time).easing(TWEEN.Easing.Linear.None).delay(currentDelay).onUpdate((e) => {
|
|
30
|
+
this.currentIndex = index
|
|
31
|
+
if (this.x) {
|
|
32
|
+
this.currentMesh!.position.set(this.x, this.y, this.z)
|
|
33
|
+
}
|
|
34
|
+
this.currentMesh!.lookAt(e.x, e.y, e.z)
|
|
35
|
+
this.x = e.x
|
|
36
|
+
this.y = e.y
|
|
37
|
+
this.z = e.z
|
|
38
|
+
}).onComplete((e) => {
|
|
39
|
+
if (index === this.tweenActionList.length - 1) {
|
|
40
|
+
if (!loop) {
|
|
41
|
+
this.complete = true
|
|
42
|
+
}
|
|
43
|
+
this.currentMesh!.position.set(e.x, e.y, e.z)
|
|
44
|
+
this.currentIndex = 0
|
|
45
|
+
this.x = 0
|
|
46
|
+
this.y = 0
|
|
47
|
+
this.z = 0
|
|
48
|
+
}
|
|
49
|
+
})
|
|
50
|
+
return tween;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
setTweenList = (path: IPathItem[], loop: boolean) => {
|
|
54
|
+
this.tweenActionList = []
|
|
55
|
+
path.forEach((item, i) => {
|
|
56
|
+
const startVector3 = new THREE.Vector3(item.startPos.x, item.startPos.y, item.startPos.z)
|
|
57
|
+
const endVector3 = new THREE.Vector3(item.endPos.x, item.endPos.y, item.endPos.z)
|
|
58
|
+
const tweenAction = this.createTween(startVector3, endVector3, item.delay, item.speed, i, loop)
|
|
59
|
+
if (i > 0) {
|
|
60
|
+
this.tweenActionList[i - 1].chain(tweenAction)
|
|
61
|
+
}
|
|
62
|
+
this.tweenActionList.push(tweenAction)
|
|
63
|
+
})
|
|
64
|
+
if (this.tweenActionList.length > 1 && loop) {
|
|
65
|
+
this.tweenActionList[this.tweenActionList.length - 1].chain(this.tweenActionList[0])
|
|
66
|
+
}
|
|
67
|
+
if (path.length === 1 && loop) {
|
|
68
|
+
this.tweenActionList[this.tweenActionList.length - 1].repeat(Infinity)
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
handleAnimation = (mesh: THREE.Object3D, type: TTweenType) => {
|
|
73
|
+
if (!this.tweenActionList.length) return
|
|
74
|
+
if (type === 'start') {
|
|
75
|
+
this.complete = false
|
|
76
|
+
} else if (type === 'stop') {
|
|
77
|
+
this.complete = true
|
|
78
|
+
}
|
|
79
|
+
this.currentMesh = mesh
|
|
80
|
+
this.tweenActionList[this.currentIndex][type]()
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export {
|
|
85
|
+
Animation
|
|
86
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import * as THREE from 'three'
|
|
2
|
+
|
|
3
|
+
export type TCamera = {
|
|
4
|
+
fov: number;
|
|
5
|
+
aspect: number;
|
|
6
|
+
near: number;
|
|
7
|
+
far: number;
|
|
8
|
+
pos: {
|
|
9
|
+
x: number;
|
|
10
|
+
y: number;
|
|
11
|
+
z: number;
|
|
12
|
+
},
|
|
13
|
+
up: number;
|
|
14
|
+
lookAt?: THREE.Vector3;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const createCamera = (options: TCamera) => {
|
|
18
|
+
const camera = new THREE.PerspectiveCamera(options.fov, options.aspect, options.near, options.far)
|
|
19
|
+
camera.position.set(options.pos.x, options.pos.y, options.pos.z)
|
|
20
|
+
camera.up.y = options.up;
|
|
21
|
+
camera.lookAt(options.lookAt!)
|
|
22
|
+
|
|
23
|
+
return camera
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export {
|
|
27
|
+
createCamera
|
|
28
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import * as THREE from 'three'
|
|
2
|
+
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'
|
|
3
|
+
|
|
4
|
+
export type TControl = {
|
|
5
|
+
camera: THREE.PerspectiveCamera;
|
|
6
|
+
element: HTMLElement;
|
|
7
|
+
pos: {
|
|
8
|
+
x: number;
|
|
9
|
+
y: number;
|
|
10
|
+
z: number;
|
|
11
|
+
},
|
|
12
|
+
minDistance: number;
|
|
13
|
+
maxDistance: number;
|
|
14
|
+
minPolarAngle?: number;
|
|
15
|
+
maxPolarAngle?: number;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const createControl = (options: TControl) => {
|
|
19
|
+
const control = new OrbitControls(options.camera!, options.element)
|
|
20
|
+
control.target.set(options.pos.x, options.pos.y, options.pos.z)
|
|
21
|
+
control.minDistance = options.minDistance
|
|
22
|
+
control.maxDistance = options.maxDistance
|
|
23
|
+
control.enableDamping = true
|
|
24
|
+
control.maxPolarAngle = options.maxPolarAngle ? options.maxPolarAngle : 3 * Math.PI / 8
|
|
25
|
+
control.minPolarAngle = options.minPolarAngle ? options.minPolarAngle : 0
|
|
26
|
+
|
|
27
|
+
return control
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export {
|
|
31
|
+
createControl
|
|
32
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { createScene } from './scene'
|
|
2
|
+
import { createCamera } from './camera'
|
|
3
|
+
import { createControl } from './control'
|
|
4
|
+
import { createLabelRenderer } from './labelRenderer'
|
|
5
|
+
import { createRenderer } from './renderer'
|
|
6
|
+
import { createStats } from './stats'
|
|
7
|
+
import { createClock } from './clock'
|
|
8
|
+
import { createAmbientLight, createDirectionalLight } from './light'
|
|
9
|
+
|
|
10
|
+
import type { TControl } from './control'
|
|
11
|
+
import type { TLabelRenderer } from './labelRenderer'
|
|
12
|
+
import type { TAmbientLight, TDirectionalLight } from './light'
|
|
13
|
+
import type { TRenderer } from './renderer'
|
|
14
|
+
import type { TCamera } from './camera'
|
|
15
|
+
|
|
16
|
+
export {
|
|
17
|
+
createScene,
|
|
18
|
+
createCamera,
|
|
19
|
+
createControl,
|
|
20
|
+
createLabelRenderer,
|
|
21
|
+
createRenderer,
|
|
22
|
+
createStats,
|
|
23
|
+
createClock,
|
|
24
|
+
createAmbientLight,
|
|
25
|
+
createDirectionalLight
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export type {
|
|
29
|
+
TControl,
|
|
30
|
+
TLabelRenderer,
|
|
31
|
+
TAmbientLight,
|
|
32
|
+
TDirectionalLight,
|
|
33
|
+
TRenderer,
|
|
34
|
+
TCamera
|
|
35
|
+
}
|