u-space 0.0.5 → 0.0.9
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/index.cjs +16 -1
- package/dist/index.js +1657 -412
- package/dist/plugins/u-manager/flows/ComponentFlowParser.d.ts +8 -0
- package/dist/plugins/u-manager/flows/FlowParser.d.ts +48 -0
- package/dist/plugins/u-manager/flows/edges/index.d.ts +9 -0
- package/dist/plugins/u-manager/flows/index.d.ts +4 -0
- package/dist/plugins/u-manager/flows/nodes/ColorNode.d.ts +8 -0
- package/dist/plugins/u-manager/flows/nodes/ConditionNode.d.ts +9 -0
- package/dist/plugins/u-manager/flows/nodes/DataExtractionNode.d.ts +8 -0
- package/dist/plugins/u-manager/flows/nodes/DataFilterNode.d.ts +8 -0
- package/dist/plugins/u-manager/flows/nodes/DelayNode.d.ts +8 -0
- package/dist/plugins/u-manager/flows/nodes/EmissiveNode.d.ts +8 -0
- package/dist/plugins/u-manager/flows/nodes/FlyToNode.d.ts +8 -0
- package/dist/plugins/u-manager/flows/nodes/HideNode.d.ts +10 -0
- package/dist/plugins/u-manager/flows/nodes/HighlightNode.d.ts +8 -0
- package/dist/plugins/u-manager/flows/nodes/MeshNode.d.ts +8 -0
- package/dist/plugins/u-manager/flows/nodes/MeshesNode.d.ts +8 -0
- package/dist/plugins/u-manager/flows/nodes/ModelNode.d.ts +8 -0
- package/dist/plugins/u-manager/flows/nodes/ModelsNode.d.ts +8 -0
- package/dist/plugins/u-manager/flows/nodes/Node.d.ts +52 -0
- package/dist/plugins/u-manager/flows/nodes/NumberNode.d.ts +8 -0
- package/dist/plugins/u-manager/flows/nodes/OpacityNode.d.ts +8 -0
- package/dist/plugins/u-manager/flows/nodes/POINode.d.ts +8 -0
- package/dist/plugins/u-manager/flows/nodes/POISNode.d.ts +8 -0
- package/dist/plugins/u-manager/flows/nodes/PathNode.d.ts +8 -0
- package/dist/plugins/u-manager/flows/nodes/PathsNode.d.ts +8 -0
- package/dist/plugins/u-manager/flows/nodes/RotateNode.d.ts +8 -0
- package/dist/plugins/u-manager/flows/nodes/ScaleNode.d.ts +8 -0
- package/dist/plugins/u-manager/flows/nodes/ShowNode.d.ts +10 -0
- package/dist/plugins/u-manager/flows/nodes/SpaceNode.d.ts +8 -0
- package/dist/plugins/u-manager/flows/nodes/SpacesNode.d.ts +8 -0
- package/dist/plugins/u-manager/flows/nodes/StartNode.d.ts +7 -0
- package/dist/plugins/u-manager/flows/nodes/TranslateNode.d.ts +8 -0
- package/dist/plugins/u-manager/flows/nodes/UnEmissiveNode.d.ts +10 -0
- package/dist/plugins/u-manager/flows/nodes/UnHighlightNode.d.ts +10 -0
- package/dist/plugins/u-manager/flows/nodes/UnOpacityNode.d.ts +8 -0
- package/dist/plugins/u-manager/flows/nodes/UserDataNode.d.ts +8 -0
- package/dist/plugins/u-manager/flows/nodes/clip-animation/ClipAnimationNode.d.ts +8 -0
- package/dist/plugins/u-manager/flows/nodes/clip-animation/UnClipAnimationNode.d.ts +8 -0
- package/dist/plugins/u-manager/flows/nodes/clip-animation/index.d.ts +2 -0
- package/dist/plugins/u-manager/flows/nodes/component-tween-animation/ComponentTweenAnimationNode.d.ts +8 -0
- package/dist/plugins/u-manager/flows/nodes/component-tween-animation/UnComponentTweenAnimationNode.d.ts +8 -0
- package/dist/plugins/u-manager/flows/nodes/component-tween-animation/index.d.ts +2 -0
- package/dist/plugins/u-manager/flows/nodes/component-tween-animation/utils.d.ts +5 -0
- package/dist/plugins/u-manager/flows/nodes/index.d.ts +34 -0
- package/dist/plugins/u-manager/flows/nodes/tween-animation/TweenAnimationNode.d.ts +8 -0
- package/dist/plugins/u-manager/flows/nodes/tween-animation/UnTweenAnimationNode.d.ts +8 -0
- package/dist/plugins/u-manager/flows/nodes/tween-animation/index.d.ts +2 -0
- package/dist/plugins/u-manager/flows/nodes/tween-animation/utils.d.ts +5 -0
- package/dist/plugins/u-manager/flows/types.d.ts +81 -0
- package/dist/plugins/u-manager/flows/utils.d.ts +14 -0
- package/dist/plugins/u-manager/index.cjs +59 -59
- package/dist/plugins/u-manager/index.d.ts +1 -0
- package/dist/plugins/u-manager/index.js +9692 -8601
- package/dist/src/effects/MaterialEffects.d.ts +33 -3
- package/dist/src/index.d.ts +9 -0
- package/dist/src/interactions/InteractionManager.d.ts +31 -0
- package/dist/src/interactions/Selection.d.ts +77 -0
- package/dist/src/interactions/index.d.ts +1 -0
- package/dist/src/managers/LightManager.d.ts +101 -0
- package/dist/src/managers/ObjectManager.d.ts +33 -1
- package/dist/src/managers/SceneManager.d.ts +57 -0
- package/dist/src/managers/index.d.ts +2 -0
- package/dist/src/objects/Model.d.ts +13 -1
- package/dist/src/tools/AnnotationManager.d.ts +104 -0
- package/dist/src/tools/ClippingTool.d.ts +96 -0
- package/dist/src/tools/MeasureTool.d.ts +80 -0
- package/dist/src/tools/index.d.ts +3 -0
- package/dist/src/viewers/CSSRenderer.d.ts +19 -0
- package/dist/src/viewers/CameraControls.d.ts +30 -0
- package/dist/src/viewers/RenderPipeline.d.ts +30 -2
- package/dist/src/viewers/Viewer.d.ts +54 -1
- package/dist/src/viewers/index.d.ts +2 -0
- package/docs/api-camera-controls.md +146 -0
- package/docs/api-css-renderer.md +43 -0
- package/docs/api-effects.md +95 -15
- package/docs/api-interactions.md +107 -7
- package/docs/api-managers.md +181 -0
- package/docs/api-objects.md +46 -13
- package/docs/api-plugin-atmosphere.md +10 -0
- package/docs/api-plugin-curve-movement.md +38 -0
- package/docs/api-plugin-keyboard-controls.md +40 -0
- package/docs/api-plugin-minimap.md +36 -0
- package/docs/api-plugin-object-controls.md +67 -0
- package/docs/api-plugin-tiles.md +26 -0
- package/docs/api-plugin-topology-drawer.md +74 -0
- package/docs/api-plugin-tracking-controls.md +23 -0
- package/docs/api-plugin-u-manager.md +123 -0
- package/docs/api-render-pipeline.md +114 -0
- package/docs/api-tools.md +254 -0
- package/docs/api-viewer.md +97 -0
- package/docs/changelog.md +105 -0
- package/docs/examples-guide.md +130 -0
- package/docs/getting-started.md +13 -1
- package/docs/index.md +20 -12
- package/package.json +1 -1
- package/docs/api-plugins.md +0 -449
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { CSS2DRenderer, CSS2DObject } from 'three/addons/renderers/CSS2DRenderer.js';
|
|
2
|
+
import { CSS3DRenderer, CSS3DObject, CSS3DSprite } from 'three/addons/renderers/CSS3DRenderer.js';
|
|
3
|
+
import type { Scene, Camera } from 'three/webgpu';
|
|
4
|
+
export { CSS2DObject, CSS3DObject, CSS3DSprite };
|
|
5
|
+
declare class CSSRenderer {
|
|
6
|
+
el: HTMLElement;
|
|
7
|
+
css2dRenderer: CSS2DRenderer | null;
|
|
8
|
+
css3dRenderer: CSS3DRenderer | null;
|
|
9
|
+
constructor(el: HTMLElement);
|
|
10
|
+
private initCSS2DRenderer;
|
|
11
|
+
private initCSS3DRenderer;
|
|
12
|
+
createCSS2DObject(element: HTMLElement): CSS2DObject;
|
|
13
|
+
createCSS25DObject(element: HTMLElement): CSS3DSprite;
|
|
14
|
+
createCSS3DObject(element: HTMLElement): CSS3DObject;
|
|
15
|
+
render(scene: Scene, camera: Camera): void;
|
|
16
|
+
resize(width: number, height: number): void;
|
|
17
|
+
dispose(): void;
|
|
18
|
+
}
|
|
19
|
+
export { CSSRenderer };
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import CameraControlsBase from 'camera-controls';
|
|
2
2
|
import { Box3, type Object3D } from 'three/webgpu';
|
|
3
|
+
import type { IVector3 } from '../interfaces';
|
|
3
4
|
export interface FlyToBoxOptions {
|
|
4
5
|
viewpoint?: 'current' | 'top' | 'bottom' | 'front' | 'back' | 'left' | 'right' | 'frontTop' | 'backTop' | 'leftTop' | 'rightTop' | 'leftFrontTop' | 'rightFrontTop' | 'leftBackTop' | 'rightBackTop';
|
|
5
6
|
enableTransition?: boolean;
|
|
@@ -8,6 +9,14 @@ export interface FlyToBoxOptions {
|
|
|
8
9
|
}
|
|
9
10
|
export interface FlyToObjectOptions extends FlyToBoxOptions {
|
|
10
11
|
}
|
|
12
|
+
export interface FlyToOptions {
|
|
13
|
+
enableTransition?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface CameraViewpointData {
|
|
16
|
+
position: IVector3;
|
|
17
|
+
target: IVector3;
|
|
18
|
+
zoom: number;
|
|
19
|
+
}
|
|
11
20
|
export declare class CameraControls extends CameraControlsBase {
|
|
12
21
|
constructor(...args: ConstructorParameters<typeof CameraControlsBase>);
|
|
13
22
|
/**
|
|
@@ -16,4 +25,25 @@ export declare class CameraControls extends CameraControlsBase {
|
|
|
16
25
|
absoluteRotations(): void;
|
|
17
26
|
flyToBox(box: Box3, options?: FlyToBoxOptions): Promise<boolean>;
|
|
18
27
|
flyToObject(object: Object3D, options?: FlyToObjectOptions): Promise<boolean>;
|
|
28
|
+
/**
|
|
29
|
+
* Fly camera to a specific position and look-at target.
|
|
30
|
+
*/
|
|
31
|
+
flyTo(position: IVector3, target: IVector3, options?: FlyToOptions): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Get the current camera viewpoint data (position, target, zoom).
|
|
34
|
+
*/
|
|
35
|
+
getCameraViewpoint(): CameraViewpointData;
|
|
36
|
+
/**
|
|
37
|
+
* Lock camera controls (disable all user interaction).
|
|
38
|
+
*/
|
|
39
|
+
lock(): void;
|
|
40
|
+
/**
|
|
41
|
+
* Unlock camera controls (re-enable user interaction).
|
|
42
|
+
*/
|
|
43
|
+
unlock(): void;
|
|
44
|
+
/**
|
|
45
|
+
* Switch between 2D top-down and 3D perspective views.
|
|
46
|
+
*/
|
|
47
|
+
setViewMode(mode: '2d' | '3d', enableTransition?: boolean): Promise<void>;
|
|
48
|
+
setCameraViewpoint(viewpoint: CameraViewpointData, enableTransition?: boolean): Promise<[void, void]>;
|
|
19
49
|
}
|
|
@@ -1,17 +1,45 @@
|
|
|
1
|
-
import { type Scene, type Camera, RenderPipeline as RenderPipelineBase, type Node } from 'three/webgpu';
|
|
1
|
+
import { type Scene, type Camera, type PassNode, RenderPipeline as RenderPipelineBase, type Node } from 'three/webgpu';
|
|
2
|
+
export interface BloomConfig {
|
|
3
|
+
strength?: number;
|
|
4
|
+
radius?: number;
|
|
5
|
+
threshold?: number;
|
|
6
|
+
}
|
|
7
|
+
export interface SSGIConfig {
|
|
8
|
+
sliceCount?: number;
|
|
9
|
+
stepCount?: number;
|
|
10
|
+
aoIntensity?: number;
|
|
11
|
+
giIntensity?: number;
|
|
12
|
+
radius?: number;
|
|
13
|
+
thickness?: number;
|
|
14
|
+
}
|
|
15
|
+
export type OutputNodeComposer = (scenePass: PassNode) => Node;
|
|
2
16
|
type Args = [ConstructorParameters<typeof RenderPipelineBase>[0], Scene, Camera];
|
|
3
17
|
export declare class RenderPipeline extends RenderPipelineBase {
|
|
4
18
|
#private;
|
|
5
19
|
scene: Scene;
|
|
6
20
|
camera: Camera;
|
|
7
|
-
|
|
21
|
+
scenePass: PassNode;
|
|
8
22
|
needsUpdateOutputNode: boolean;
|
|
9
23
|
constructor(...args: Args);
|
|
24
|
+
/** @deprecated Use `scenePass` instead */
|
|
25
|
+
get currentOutputNode(): PassNode;
|
|
10
26
|
addOverlayPass(pass: Node): void;
|
|
11
27
|
removeOverlayPass(pass: Node): void;
|
|
12
28
|
setCamera(camera: Camera): void;
|
|
29
|
+
/** @deprecated Use `setOutputComposer` instead */
|
|
13
30
|
setCurrentOutputNode(node: Node): void;
|
|
31
|
+
/** @deprecated Use `setOutputComposer(null)` instead */
|
|
14
32
|
resetCurrentOutputNode(): void;
|
|
33
|
+
setOutputComposer(composer: OutputNodeComposer | null): void;
|
|
34
|
+
enableBloom(config?: BloomConfig): void;
|
|
35
|
+
disableBloom(): void;
|
|
36
|
+
updateBloom(config: Partial<BloomConfig>): void;
|
|
37
|
+
enableSSGI(config?: SSGIConfig): void;
|
|
38
|
+
disableSSGI(): void;
|
|
39
|
+
updateSSGI(config: Partial<SSGIConfig>): void;
|
|
40
|
+
enableTRAA(): void;
|
|
41
|
+
disableTRAA(): void;
|
|
15
42
|
render(): void;
|
|
43
|
+
dispose(): void;
|
|
16
44
|
}
|
|
17
45
|
export {};
|
|
@@ -1,16 +1,32 @@
|
|
|
1
|
-
import { EventDispatcher, WebGPURenderer, Scene, PerspectiveCamera, Timer, OrthographicCamera } from 'three/webgpu';
|
|
1
|
+
import { EventDispatcher, WebGPURenderer, Scene, PerspectiveCamera, Timer, OrthographicCamera, type ColorRepresentation, type Texture } from 'three/webgpu';
|
|
2
2
|
import { InteractionManager } from '../interactions';
|
|
3
3
|
import { ObjectManager } from '../managers';
|
|
4
4
|
import { RenderPipeline } from './RenderPipeline';
|
|
5
5
|
import { CameraControls } from './CameraControls';
|
|
6
6
|
import { RoomEnvironment } from './RoomEnvironment';
|
|
7
7
|
import { ViewerHelper } from './ViewerHelper';
|
|
8
|
+
import { CSSRenderer } from './CSSRenderer';
|
|
8
9
|
import { Info } from './Info';
|
|
9
10
|
type ViewerRendererOptions = ConstructorParameters<typeof WebGPURenderer>['0'];
|
|
10
11
|
export interface ViewerOptions {
|
|
11
12
|
el: HTMLElement;
|
|
12
13
|
rendererOptions?: ViewerRendererOptions;
|
|
13
14
|
}
|
|
15
|
+
export interface ScreenshotOptions {
|
|
16
|
+
width?: number;
|
|
17
|
+
height?: number;
|
|
18
|
+
type?: 'image/png' | 'image/jpeg' | 'image/webp';
|
|
19
|
+
quality?: number;
|
|
20
|
+
}
|
|
21
|
+
export interface FogOptions {
|
|
22
|
+
color?: ColorRepresentation;
|
|
23
|
+
near?: number;
|
|
24
|
+
far?: number;
|
|
25
|
+
}
|
|
26
|
+
export interface FogExp2Options {
|
|
27
|
+
color?: ColorRepresentation;
|
|
28
|
+
density?: number;
|
|
29
|
+
}
|
|
14
30
|
export interface ViewerEventMap {
|
|
15
31
|
beforeControlsUpdate: {
|
|
16
32
|
time: number;
|
|
@@ -45,6 +61,7 @@ declare class Viewer extends EventDispatcher<ViewerEventMap> {
|
|
|
45
61
|
interactionManager: InteractionManager;
|
|
46
62
|
objectManager: ObjectManager;
|
|
47
63
|
viewerHelper: ViewerHelper;
|
|
64
|
+
cssRenderer: CSSRenderer;
|
|
48
65
|
frameCount: number;
|
|
49
66
|
frameloop: 'always' | 'demand';
|
|
50
67
|
constructor({ el, rendererOptions }: ViewerOptions);
|
|
@@ -58,6 +75,42 @@ declare class Viewer extends EventDispatcher<ViewerEventMap> {
|
|
|
58
75
|
createScene(): Scene;
|
|
59
76
|
createPerspectiveCamera(): PerspectiveCamera;
|
|
60
77
|
createOrthographicCamera(): OrthographicCamera;
|
|
78
|
+
/**
|
|
79
|
+
* Manually trigger a resize update.
|
|
80
|
+
*/
|
|
81
|
+
resize(width?: number, height?: number): void;
|
|
82
|
+
/**
|
|
83
|
+
* Capture a screenshot of the current render.
|
|
84
|
+
*/
|
|
85
|
+
screenshot(options?: ScreenshotOptions): Promise<string>;
|
|
86
|
+
/**
|
|
87
|
+
* Set the scene background color, texture, or null.
|
|
88
|
+
*/
|
|
89
|
+
setBackground(background: ColorRepresentation | Texture | null): void;
|
|
90
|
+
/**
|
|
91
|
+
* Set the scene environment map for reflections / IBL.
|
|
92
|
+
*/
|
|
93
|
+
setEnvironment(envMap: Texture | null): void;
|
|
94
|
+
/**
|
|
95
|
+
* Enable shadow rendering.
|
|
96
|
+
*/
|
|
97
|
+
enableShadow(): void;
|
|
98
|
+
/**
|
|
99
|
+
* Disable shadow rendering.
|
|
100
|
+
*/
|
|
101
|
+
disableShadow(): void;
|
|
102
|
+
/**
|
|
103
|
+
* Enable linear fog.
|
|
104
|
+
*/
|
|
105
|
+
enableFog(options?: FogOptions): void;
|
|
106
|
+
/**
|
|
107
|
+
* Enable exponential fog.
|
|
108
|
+
*/
|
|
109
|
+
enableFogExp2(options?: FogExp2Options): void;
|
|
110
|
+
/**
|
|
111
|
+
* Disable fog.
|
|
112
|
+
*/
|
|
113
|
+
disableFog(): void;
|
|
61
114
|
dispose(): void;
|
|
62
115
|
}
|
|
63
116
|
export { Viewer };
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
# CameraControls API
|
|
2
|
+
|
|
3
|
+
`CameraControls` 是 `u-space` 对 [`camera-controls`](https://github.com/yomotsu/camera-controls) 库的扩展封装,提供相机飞行、视角切换等高级功能。通过 `viewer.controls` 访问。
|
|
4
|
+
|
|
5
|
+
## 默认配置
|
|
6
|
+
|
|
7
|
+
| 属性 | 默认值 | 说明 |
|
|
8
|
+
| :------------ | :----- | :----------------------------- |
|
|
9
|
+
| `minDistance` | `0.2` | 相机最小缩放距离。 |
|
|
10
|
+
| `smoothTime` | `0.2` | 平滑过渡时间(秒)。 |
|
|
11
|
+
| `dollySpeed` | `0.2` | 滚轮缩放速度。 |
|
|
12
|
+
|
|
13
|
+
> 更多基础属性和方法请参考 [camera-controls 文档](https://github.com/yomotsu/camera-controls)。
|
|
14
|
+
|
|
15
|
+
## 方法
|
|
16
|
+
|
|
17
|
+
### `flyToBox(box, options?)`
|
|
18
|
+
|
|
19
|
+
将相机飞行到指定的 `Box3` 包围盒。
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
import { Box3 } from 'three/webgpu';
|
|
23
|
+
|
|
24
|
+
const box = new Box3().setFromObject(myModel);
|
|
25
|
+
await viewer.controls.flyToBox(box, {
|
|
26
|
+
viewpoint: 'frontTop',
|
|
27
|
+
enableTransition: true,
|
|
28
|
+
padding: 0.1,
|
|
29
|
+
});
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
#### `FlyToBoxOptions`
|
|
33
|
+
|
|
34
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
35
|
+
| :----------------- | :-------- | :----------- | :------------------------------------------------ |
|
|
36
|
+
| `viewpoint` | `string` | `'frontTop'` | 预设视角方向,见下方视角列表。设为 `'current'` 保持当前朝向。 |
|
|
37
|
+
| `enableTransition` | `boolean` | `true` | 是否启用平滑过渡动画。 |
|
|
38
|
+
| `padding` | `number` | `0.1` | 包围盒四周的留白比例。 |
|
|
39
|
+
| `cover` | `boolean` | `false` | 是否以覆盖模式适配(类似 CSS `object-fit: cover`)。 |
|
|
40
|
+
|
|
41
|
+
**预设视角:**
|
|
42
|
+
|
|
43
|
+
`top` | `bottom` | `front` | `back` | `left` | `right` | `frontTop` | `backTop` | `leftTop` | `rightTop` | `leftFrontTop` | `rightFrontTop` | `leftBackTop` | `rightBackTop` | `current`
|
|
44
|
+
|
|
45
|
+
### `flyToObject(object, options?)`
|
|
46
|
+
|
|
47
|
+
将相机飞行到指定对象的包围盒。参数同 `flyToBox`。
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
await viewer.controls.flyToObject(myModel, { viewpoint: 'rightFrontTop' });
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### `setCameraViewpoint(viewpoint, enableTransition?)`
|
|
54
|
+
|
|
55
|
+
将相机平滑过渡到指定的位置、目标和缩放。
|
|
56
|
+
|
|
57
|
+
```typescript
|
|
58
|
+
await viewer.controls.setCameraViewpoint({
|
|
59
|
+
position: { x: 10, y: 5, z: 10 },
|
|
60
|
+
target: { x: 0, y: 0, z: 0 },
|
|
61
|
+
zoom: 1.0,
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
// 禁用过渡动画,立即跳转
|
|
65
|
+
await viewer.controls.setCameraViewpoint(viewpoint, false);
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
**参数:**
|
|
69
|
+
|
|
70
|
+
| 参数 | 类型 | 默认值 | 说明 |
|
|
71
|
+
| :----------------- | :--------------------- | :------ | :---------------------------------- |
|
|
72
|
+
| `viewpoint` | `CameraViewpointData` | — | 包含 `position`、`target`、`zoom`。 |
|
|
73
|
+
| `enableTransition` | `boolean` | `true` | 是否启用平滑过渡动画。 |
|
|
74
|
+
|
|
75
|
+
#### `CameraViewpointData`
|
|
76
|
+
|
|
77
|
+
| 属性 | 类型 | 说明 |
|
|
78
|
+
| :--------- | :--------- | :------------------- |
|
|
79
|
+
| `position` | `IVector3` | 相机位置。 |
|
|
80
|
+
| `target` | `IVector3` | 相机注视目标位置。 |
|
|
81
|
+
| `zoom` | `number` | 相机缩放值。 |
|
|
82
|
+
|
|
83
|
+
### `flyTo(position, target, options?)`
|
|
84
|
+
|
|
85
|
+
将相机飞行到指定的位置和注视目标。
|
|
86
|
+
|
|
87
|
+
```typescript
|
|
88
|
+
await viewer.controls.flyTo(
|
|
89
|
+
{ x: 10, y: 8, z: 10 },
|
|
90
|
+
{ x: 0, y: 0, z: 0 },
|
|
91
|
+
{ enableTransition: true },
|
|
92
|
+
);
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
**参数:**
|
|
96
|
+
|
|
97
|
+
| 参数 | 类型 | 默认值 | 说明 |
|
|
98
|
+
| :----------------- | :--------- | :----- | :---------------------- |
|
|
99
|
+
| `position` | `IVector3` | — | 相机目标位置。 |
|
|
100
|
+
| `target` | `IVector3` | — | 相机注视目标。 |
|
|
101
|
+
| `enableTransition` | `boolean` | `true` | 是否启用平滑过渡动画。 |
|
|
102
|
+
|
|
103
|
+
### `getCameraViewpoint()`
|
|
104
|
+
|
|
105
|
+
获取当前相机的视角数据,返回 `CameraViewpointData`。与 `setCameraViewpoint` 对应,方便保存/恢复视角。
|
|
106
|
+
|
|
107
|
+
```typescript
|
|
108
|
+
const viewpoint = viewer.controls.getCameraViewpoint();
|
|
109
|
+
console.log(viewpoint.position, viewpoint.target, viewpoint.zoom);
|
|
110
|
+
|
|
111
|
+
// 稍后恢复
|
|
112
|
+
await viewer.controls.setCameraViewpoint(viewpoint);
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### `lock()` / `unlock()`
|
|
116
|
+
|
|
117
|
+
锁定或解锁相机控制(禁用/启用所有用户交互)。
|
|
118
|
+
|
|
119
|
+
```typescript
|
|
120
|
+
viewer.controls.lock(); // 禁止用户操作相机
|
|
121
|
+
viewer.controls.unlock(); // 恢复用户操作
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### `setViewMode(mode, enableTransition?)`
|
|
125
|
+
|
|
126
|
+
在 2D 俯视图和 3D 透视图之间切换。2D 模式会将相机旋转到正上方,并锁定极角。
|
|
127
|
+
|
|
128
|
+
```typescript
|
|
129
|
+
await viewer.controls.setViewMode('2d'); // 切换到 2D 俯视模式
|
|
130
|
+
await viewer.controls.setViewMode('3d'); // 切换回 3D 模式
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
**参数:**
|
|
134
|
+
|
|
135
|
+
| 参数 | 类型 | 默认值 | 说明 |
|
|
136
|
+
| :----------------- | :---------------- | :----- | :---------------------- |
|
|
137
|
+
| `mode` | `'2d'` \| `'3d'` | — | 视图模式。 |
|
|
138
|
+
| `enableTransition` | `boolean` | `true` | 是否启用平滑过渡动画。 |
|
|
139
|
+
|
|
140
|
+
### `absoluteRotations()`
|
|
141
|
+
|
|
142
|
+
将方位角(azimuth)归一化到 `[-π, π]` 范围内,避免相机在飞行过渡时产生多余旋转。在 `flyToBox` 内部自动调用。
|
|
143
|
+
|
|
144
|
+
```typescript
|
|
145
|
+
viewer.controls.absoluteRotations();
|
|
146
|
+
```
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# CSSRenderer API
|
|
2
|
+
|
|
3
|
+
`viewer.cssRenderer` 用于在 3D 场景中叠加渲染 HTML 元素。支持三种模式:
|
|
4
|
+
|
|
5
|
+
| 模式 | 方法 | 返回类型 | 说明 |
|
|
6
|
+
| :--- | :--- | :------- | :--- |
|
|
7
|
+
| CSS2D | `createCSS2DObject(element)` | `CSS2DObject` | HTML 元素始终面向相机,屏幕尺寸固定不随距离缩放。适合标签、工具提示。 |
|
|
8
|
+
| CSS2.5D | `createCSS25DObject(element)` | `CSS3DSprite` | HTML 元素面向相机,但尺寸随距离缩放(近大远小)。 |
|
|
9
|
+
| CSS3D | `createCSS3DObject(element)` | `CSS3DObject` | HTML 元素具有完整的 3D 变换,可旋转、缩放,参与透视投影。适合面板、信息板。 |
|
|
10
|
+
|
|
11
|
+
底层渲染器采用**懒加载**:首次调用对应 `create` 方法时才初始化 `CSS2DRenderer` 或 `CSS3DRenderer`,不使用则无开销。
|
|
12
|
+
|
|
13
|
+
创建的对象是标准 Three.js `Object3D`,直接添加到场景中即可:
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
// CSS2D 标签
|
|
17
|
+
const labelEl = document.createElement('div');
|
|
18
|
+
labelEl.textContent = '标签';
|
|
19
|
+
labelEl.style.cssText = 'background:rgba(0,0,0,0.7);color:#fff;padding:4px 8px;border-radius:4px;font-size:13px;';
|
|
20
|
+
const label = viewer.cssRenderer.createCSS2DObject(labelEl);
|
|
21
|
+
label.position.set(0, 2, 0);
|
|
22
|
+
viewer.scene.add(label);
|
|
23
|
+
|
|
24
|
+
// CSS2.5D 精灵(需设置 scale,通常 0.01 左右)
|
|
25
|
+
const spriteEl = document.createElement('div');
|
|
26
|
+
spriteEl.textContent = '精灵';
|
|
27
|
+
const sprite = viewer.cssRenderer.createCSS25DObject(spriteEl);
|
|
28
|
+
sprite.position.set(3, 2, 0);
|
|
29
|
+
sprite.scale.setScalar(0.01);
|
|
30
|
+
viewer.scene.add(sprite);
|
|
31
|
+
|
|
32
|
+
// CSS3D 面板(需设置 scale,通常 0.01 左右)
|
|
33
|
+
const panelEl = document.createElement('div');
|
|
34
|
+
panelEl.innerHTML = '<h3>面板</h3><p>3D 空间中的 HTML</p>';
|
|
35
|
+
const panel = viewer.cssRenderer.createCSS3DObject(panelEl);
|
|
36
|
+
panel.position.set(0, 1.5, -3);
|
|
37
|
+
panel.scale.setScalar(0.01);
|
|
38
|
+
viewer.scene.add(panel);
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
> `CSSRenderer` 的生命周期(渲染、缩放、销毁)已自动集成到 `Viewer` 中,无需手动调用。
|
|
42
|
+
|
|
43
|
+
同时从 `u-space` 包中导出了 `CSS2DObject`、`CSS3DObject`、`CSS3DSprite` 类型,供直接使用。
|
package/docs/api-effects.md
CHANGED
|
@@ -1,40 +1,120 @@
|
|
|
1
1
|
# Effects API
|
|
2
2
|
|
|
3
|
-
`u-space` 提供了两个基于 Three.js 着色语言(TSL/WebGPU 节点)的静态特效工具:`MaterialEffects`
|
|
3
|
+
`u-space` 提供了两个基于 Three.js 着色语言(TSL/WebGPU 节点)的静态特效工具:`MaterialEffects` 用于为对象应用高亮、呼吸等材质特效,`TSLEffects` 用于生成动态颜色节点模式。
|
|
4
4
|
|
|
5
5
|
## `MaterialEffects`
|
|
6
6
|
|
|
7
|
-
静态工具类,将基于 TSL 的视觉特效直接应用于对象的材质。适用于任何 `Object3D
|
|
7
|
+
静态工具类,将基于 TSL 的视觉特效直接应用于对象的材质。适用于任何 `Object3D`(支持单个或数组),会自动遍历所有子网格。
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
特性:
|
|
10
|
+
- **效果可叠加**:高亮和呼吸效果可同时作用于同一对象,呼吸在高亮结果之上混合
|
|
11
|
+
- **共享材质安全**:按材质跟踪引用计数,多个 Mesh 共享材质时互不干扰
|
|
12
|
+
- **完整还原**:移除效果时自动恢复材质原始的 `colorNode`、`opacityNode`、`transparent` 和 `depthWrite` 状态
|
|
10
13
|
|
|
11
|
-
|
|
14
|
+
### `MaterialEffects.highlightColor(object, options?)`
|
|
15
|
+
|
|
16
|
+
为对象中所有网格应用颜色/透明度高亮。
|
|
12
17
|
|
|
13
18
|
```typescript
|
|
14
19
|
import { MaterialEffects } from 'u-space';
|
|
15
20
|
|
|
16
|
-
// 以 50%
|
|
17
|
-
MaterialEffects.
|
|
18
|
-
enabled: true,
|
|
21
|
+
// 以 50% 透明度高亮为红色(叠加模式)
|
|
22
|
+
MaterialEffects.highlightColor(myModel, {
|
|
19
23
|
color: 0xff0000,
|
|
20
24
|
opacity: 0.5,
|
|
21
25
|
overwrite: false, // false = 叠加(相乘),true = 完全替换颜色
|
|
22
26
|
});
|
|
23
27
|
|
|
24
|
-
//
|
|
25
|
-
MaterialEffects.
|
|
28
|
+
// 半透明效果
|
|
29
|
+
MaterialEffects.highlightColor(myModel, { opacity: 0.3 });
|
|
30
|
+
|
|
31
|
+
// X 光效果(替换颜色 + 关闭深度写入)
|
|
32
|
+
MaterialEffects.highlightColor(myModel, {
|
|
33
|
+
color: 0x0088ff,
|
|
34
|
+
opacity: 0.25,
|
|
35
|
+
overwrite: true,
|
|
36
|
+
depthWrite: false,
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
// 支持数组
|
|
40
|
+
MaterialEffects.highlightColor([model1, model2], { color: 0x00ff00 });
|
|
26
41
|
```
|
|
27
42
|
|
|
28
|
-
|
|
43
|
+
#### `HighlightColorOptions`
|
|
29
44
|
|
|
30
45
|
| 属性 | 类型 | 默认值 | 说明 |
|
|
31
46
|
| :---------- | :-------------------- | :---------- | :--------------------------------------------------------------------------- |
|
|
32
|
-
| `
|
|
33
|
-
| `
|
|
34
|
-
| `
|
|
35
|
-
| `
|
|
47
|
+
| `color` | `ColorRepresentation` | `0xff0000` | 高亮颜色。 |
|
|
48
|
+
| `opacity` | `number` | `0.5` | 高亮时材质的透明度。 |
|
|
49
|
+
| `overwrite` | `boolean` | `false` | `false` = 与原始颜色相乘(叠加);`true` = 完全替换颜色。 |
|
|
50
|
+
| `depthWrite` | `boolean` | — | 可选。设为 `false` 可产生 X 光透视效果。不设置时保持原始值。 |
|
|
51
|
+
|
|
52
|
+
### `MaterialEffects.removeHighlightColor(object)`
|
|
53
|
+
|
|
54
|
+
移除高亮效果。当对象上所有效果都被移除后,材质将完整恢复到原始状态。
|
|
55
|
+
|
|
56
|
+
```typescript
|
|
57
|
+
MaterialEffects.removeHighlightColor(myModel);
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### `MaterialEffects.breatheColor(object, options?)`
|
|
61
|
+
|
|
62
|
+
为对象应用呼吸灯效果,颜色在材质原色与目标颜色之间随时间脉冲变化。需要 `viewer.frameloop = 'always'`。
|
|
63
|
+
|
|
64
|
+
```typescript
|
|
65
|
+
MaterialEffects.breatheColor(myModel, {
|
|
66
|
+
color: 0x00ff00,
|
|
67
|
+
speed: 1.0,
|
|
68
|
+
intensity: 2.0,
|
|
69
|
+
});
|
|
70
|
+
viewer.frameloop = 'always';
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
#### `BreatheColorOptions`
|
|
74
|
+
|
|
75
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
76
|
+
| :---------- | :-------------------- | :---------- | :--------------------------------- |
|
|
77
|
+
| `color` | `ColorRepresentation` | `0x00ff00` | 呼吸目标颜色。 |
|
|
78
|
+
| `speed` | `number` | `1.0` | 振荡速度。 |
|
|
79
|
+
| `intensity` | `number` | `2.0` | 控制峰值的锐度。 |
|
|
80
|
+
|
|
81
|
+
### `MaterialEffects.removeBreatheColor(object)`
|
|
82
|
+
|
|
83
|
+
移除呼吸效果。
|
|
84
|
+
|
|
85
|
+
```typescript
|
|
86
|
+
MaterialEffects.removeBreatheColor(myModel);
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### `MaterialEffects.wireframe(object, enabled?)`
|
|
90
|
+
|
|
91
|
+
开启或关闭线框渲染模式。
|
|
92
|
+
|
|
93
|
+
```typescript
|
|
94
|
+
MaterialEffects.wireframe(myModel); // 开启线框
|
|
95
|
+
MaterialEffects.wireframe(myModel, false); // 关闭线框
|
|
96
|
+
MaterialEffects.removeWireframe(myModel); // 等同于 wireframe(obj, false)
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### `MaterialEffects.fadeIn(object, options?)` / `MaterialEffects.fadeOut(object, options?)`
|
|
100
|
+
|
|
101
|
+
淡入/淡出动画效果。返回 `Promise`,在动画完成后 resolve。淡出后对象材质保持透明状态。
|
|
102
|
+
|
|
103
|
+
```typescript
|
|
104
|
+
// 淡出
|
|
105
|
+
await MaterialEffects.fadeOut(myModel, { duration: 1000 });
|
|
106
|
+
|
|
107
|
+
// 淡入
|
|
108
|
+
await MaterialEffects.fadeIn(myModel, { duration: 500 });
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
> 动画期间需要持续渲染,建议配合 `viewer.frameloop = 'always'` 使用。
|
|
112
|
+
|
|
113
|
+
#### `FadeOptions`
|
|
36
114
|
|
|
37
|
-
|
|
115
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
116
|
+
| :--------- | :------- | :----- | :------------------ |
|
|
117
|
+
| `duration` | `number` | `500` | 动画时长(毫秒)。 |
|
|
38
118
|
|
|
39
119
|
---
|
|
40
120
|
|
package/docs/api-interactions.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
## 启用交互事件
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
出于性能考虑,指针移动事件默认处于禁用状态。如需悬停和拖拽效果,必须显式开启。
|
|
10
10
|
|
|
11
11
|
```typescript
|
|
12
12
|
// 启用鼠标移动事件(如 pointerenter 和 pointerleave)
|
|
@@ -46,9 +46,9 @@ myBox.addEventListener('click', (eventData) => {
|
|
|
46
46
|
|
|
47
47
|
以下事件类型可在可交互对象上监听:
|
|
48
48
|
|
|
49
|
-
- `click
|
|
49
|
+
- `click`:指针点击对象时触发。内置智能过滤:长按(>500ms)或移动距离过大时忽略,双击时不重复触发。
|
|
50
50
|
- `dblclick`:快速双击对象时触发。
|
|
51
|
-
- `rightclick
|
|
51
|
+
- `rightclick`:右键短按松开时触发(长按或拖拽不触发;浏览器原生上下文菜单已被阻止)。在 `pointerup` 时派发,因此可以正确过滤相机拖拽等操作。
|
|
52
52
|
- `pointerdown`:指针按键在对象上按下时触发。
|
|
53
53
|
- `pointerup`:指针按键在对象上释放时触发。
|
|
54
54
|
- `pointermove`:指针在对象上移动时触发,需要 `pointerMoveEventsEnabled = true`。
|
|
@@ -89,13 +89,40 @@ myObject.addEventListener('click', (e) => {
|
|
|
89
89
|
|
|
90
90
|
### 属性
|
|
91
91
|
|
|
92
|
-
| 属性 | 类型 | 默认值
|
|
93
|
-
| :------------------------- | :---------------------------- |
|
|
94
|
-
| `targetObjects` | `Object3D[]` | `scene.children`
|
|
95
|
-
| `pointerMoveEventsEnabled` | `boolean` | `false`
|
|
92
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
93
|
+
| :------------------------- | :---------------------------- | :---------------- | :--------------------------------------------------------- |
|
|
94
|
+
| `targetObjects` | `Object3D[]` | `scene.children` | 射线检测的目标对象列表,默认为场景的直接子级。 |
|
|
95
|
+
| `pointerMoveEventsEnabled` | `boolean` | `false` | 启用 `pointermove`、`pointerenter`、`pointerleave` 事件。 |
|
|
96
96
|
|
|
97
97
|
### 方法
|
|
98
98
|
|
|
99
|
+
#### `enable()` / `disable()`
|
|
100
|
+
|
|
101
|
+
全局启用或禁用所有交互事件。禁用后不再触发任何交互事件。
|
|
102
|
+
|
|
103
|
+
```typescript
|
|
104
|
+
viewer.interactionManager.disable(); // 暂停交互
|
|
105
|
+
viewer.interactionManager.enable(); // 恢复交互
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
#### `setInteractable(object, interactable)`
|
|
109
|
+
|
|
110
|
+
控制单个对象是否可交互。设为 `false` 后该对象及其所有子对象不再参与射线检测。
|
|
111
|
+
|
|
112
|
+
```typescript
|
|
113
|
+
viewer.interactionManager.setInteractable(myModel, false); // 禁止交互
|
|
114
|
+
viewer.interactionManager.setInteractable(myModel, true); // 恢复交互
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
#### `addIgnore(object)` / `removeIgnore(object)`
|
|
118
|
+
|
|
119
|
+
`setInteractable` 的别名。`addIgnore(obj)` 等同于 `setInteractable(obj, false)`,`removeIgnore(obj)` 等同于 `setInteractable(obj, true)`。
|
|
120
|
+
|
|
121
|
+
```typescript
|
|
122
|
+
viewer.interactionManager.addIgnore(helperObject); // 忽略辅助对象
|
|
123
|
+
viewer.interactionManager.removeIgnore(helperObject); // 恢复
|
|
124
|
+
```
|
|
125
|
+
|
|
99
126
|
#### `setCamera(camera)`
|
|
100
127
|
|
|
101
128
|
更新用于射线检测的相机。由 `viewer.setCamera()` 自动调用。
|
|
@@ -107,3 +134,76 @@ myObject.addEventListener('click', (e) => {
|
|
|
107
134
|
```typescript
|
|
108
135
|
viewer.interactionManager.dispose();
|
|
109
136
|
```
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## Selection
|
|
141
|
+
|
|
142
|
+
`Selection` 提供对象选择能力,包括单选、多选、toggle 和框选(rubber-band)。
|
|
143
|
+
|
|
144
|
+
```typescript
|
|
145
|
+
import { Selection } from 'u-space';
|
|
146
|
+
|
|
147
|
+
const selection = new Selection(viewer.renderer.domElement, viewer.scene, viewer.camera);
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### 基础选择
|
|
151
|
+
|
|
152
|
+
```typescript
|
|
153
|
+
selection.select(myObject); // 选中
|
|
154
|
+
selection.select([obj1, obj2]); // 多选
|
|
155
|
+
selection.deselect(myObject); // 取消选择
|
|
156
|
+
selection.toggle(myObject); // 切换选择状态
|
|
157
|
+
selection.clear(); // 清空选择
|
|
158
|
+
selection.isSelected(myObject); // 检查是否已选
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### 属性
|
|
162
|
+
|
|
163
|
+
| 属性 | 类型 | 说明 |
|
|
164
|
+
| :-------------- | :-------------- | :---------------------------------- |
|
|
165
|
+
| `selected` | `Set<Object3D>` | 当前已选对象集合。 |
|
|
166
|
+
| `selectedArray` | `Object3D[]` | 当前已选对象数组。 |
|
|
167
|
+
| `targetObjects` | `Object3D[]` | 框选时的候选对象(默认为场景子级)。 |
|
|
168
|
+
|
|
169
|
+
### 框选
|
|
170
|
+
|
|
171
|
+
启用后可用鼠标拖动矩形区域选择多个对象。框选覆盖层会渲染在容器元素上。
|
|
172
|
+
|
|
173
|
+
```typescript
|
|
174
|
+
selection.enableBoxSelection({ deep: true }); // 开启框选
|
|
175
|
+
selection.disableBoxSelection(); // 关闭框选
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
#### `BoxSelectionOptions`
|
|
179
|
+
|
|
180
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
181
|
+
| :---------- | :-------- | :----- | :------------------------------ |
|
|
182
|
+
| `className` | `string` | — | 框选矩形的 CSS 类名。 |
|
|
183
|
+
| `deep` | `boolean` | `true` | 是否递归检测子对象。 |
|
|
184
|
+
|
|
185
|
+
### 事件
|
|
186
|
+
|
|
187
|
+
```typescript
|
|
188
|
+
selection.addEventListener('select', (e) => {
|
|
189
|
+
console.log('新选中:', e.objects);
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
selection.addEventListener('deselect', (e) => {
|
|
193
|
+
console.log('取消选中:', e.objects);
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
selection.addEventListener('change', (e) => {
|
|
197
|
+
console.log('当前选中:', e.selected.size, '个对象');
|
|
198
|
+
});
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### 方法
|
|
202
|
+
|
|
203
|
+
#### `setCamera(camera)`
|
|
204
|
+
|
|
205
|
+
更新用于框选投影计算的相机。切换相机时需调用。
|
|
206
|
+
|
|
207
|
+
#### `dispose()`
|
|
208
|
+
|
|
209
|
+
关闭框选、移除事件监听、清空选择集。
|