UNPKG

@realsee/five

Version:

Realsee Renderer SDK

185 lines (148 loc) • 7.88 kB
# Five (Five 核心类) - **Summary**: Five 是 @realsee/five 的核心类,负责 3D 场景的渲染、资源加载、用户交互和状态管理。 - **Schema**: FiveInitArgs 初始化参数接口。 - **Concepts**: Instance Management, Rendering Loop, Resource Loading, State Sync. - **Configuration**: Five 初始化参数详解。 - **Examples**: 基础初始化、加载数据、销毁实例。 ## Schema ### FiveInitArgs > **Definition**: [FiveInitArgs](../../five/application/fiveInitArgs.d.ts) `new Five(args)` 的初始化参数对象。 ```typescript interface FiveInitArgs { /** 外部传入的渲染器 (如果传入,部分渲染配置将失效) */ renderer?: THREE.WebGLRenderer; /** * 屏幕渲染区域 { left, bottom, width, height } * 必须配合外部 renderer 使用 */ viewport?: Viewport; /** 背景颜色 (默认 0x181A1C) */ backgroundColor?: number | THREE.Color; /** 背景透明度 (0-1, 默认 1) */ backgroundAlpha?: number; /** 是否开启抗锯齿 (默认 false) */ antialias?: boolean; /** 全景图配置 (见 image-options.md) */ imageOptions?: ImageOptions; /** 贴图配置 (见 image-options.md) */ textureOptions?: TextureOptions; /** 是否按需渲染 (默认 true, 推荐开启以节省性能) */ onlyRenderIfNeeds?: boolean; /** 模式切换动画时长 (ms, 默认 1000) */ modeChangeDuration?: number; /** 是否支持滚轮缩放 (默认 true) */ enableWheel?: boolean; /** 插件列表 */ plugins?: FivePlugin[]; /** 是否显示 Powered by Realsee */ poweredByRealsee?: boolean; } ``` ## Concepts ### Instance Management (实例管理) Five 实例是整个 3D 场景的入口。 - **Singleton-like**: 虽然支持多实例,但在同一个 DOM 容器中通常只维护一个 Five 实例。 - **Lifecycle**: 包含 `appendTo` (挂载)、`load` (加载数据)、`dispose` (销毁) 等生命周期方法。 ### Rendering Loop (渲染循环) Five 内部维护了一个 `requestAnimationFrame` 循环。 - **按需渲染**: 默认开启 `onlyRenderIfNeeds`,仅在画面发生变化(如视角移动、数据加载)时才触发 WebGL 绘制,大幅降低能耗。 - **手动触发**: 可以通过 `five.needsRender = true` 强制下一帧进行渲染。 ### Resource Loading (资源加载) 通过 `load()` 方法加载 Work 数据。 - **数据解析**: 自动解析 Work 数据结构,生成场景图。 - **预加载**: 支持配置预加载策略,平衡首屏速度与流量。 ## Configuration | 参数 | 类型 | 默认值 | 说明 | | :--- | :--- | :--- | :--- | | `imageOptions` | `ImageOptions` | `{}` | 图片加载策略,详见 [Image Options](./image-options.md) | | `textureOptions` | `TextureOptions` | `{}` | 贴图加载策略,同上 | | `onlyRenderIfNeeds` | `boolean` | `true` | 是否仅在需要时渲染,建议保持 `true` | | `antialias` | `boolean` | `false` | 抗锯齿,开启会增加性能消耗 | | `modeChangeDuration` | `number` | `1000` | 模式切换动画时长 (ms) | | `enableWheel` | `boolean` | `true` | 是否支持滚轮缩放 | ## Examples ### 快速上手 (Quick Example) 创建一个全屏的 Five 实例并加载数据。 ```typescript import { Five, parseWork } from "@realsee/five"; // 1. 初始化实例 const five = new Five({ imageOptions: { size: 512 }, // 初始加载小图 onlyRenderIfNeeds: true }); // 2. 挂载到 DOM five.appendTo(document.getElementById("app")); // 3. 加载数据 // workData 通常来自服务端 API five.load(workData); ``` ### 进阶用法:自定义渲染器与视口 使用外部渲染器并指定视口区域(例如用于分屏渲染)。 ```typescript import * as THREE from "three"; import { Five } from "@realsee/five"; const renderer = new THREE.WebGLRenderer(); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); const five = new Five({ renderer: renderer, viewport: { left: 0, bottom: 0, width: 0.5, height: 1 } // 仅占用左半屏 }); five.load(workData); ``` ### 进阶用法:自定义相机动画 使用 `updateCamera` 或 `updateCameraWithKeyframes` 实现平滑的视角漫游。 ```typescript // 简单移动到指定视角 five.updateCamera( { longitude: Math.PI / 2, latitude: 0 }, // 目标姿态 1000 // 动画时长 1秒 ).then(() => { console.log("移动完成"); }).catch(() => { console.log("移动被打断"); }); // 复杂关键帧动画 const keyframes = [ { progress: 0, value: { longitude: 0, latitude: 0 } }, { progress: 0.5, value: { longitude: Math.PI / 4, latitude: 0.2 } }, { progress: 1, value: { longitude: Math.PI / 2, latitude: 0 } } ]; five.updateCameraWithKeyframes(keyframes, 2000).then(() => { console.log("关键帧动画完成"); }); ``` ### 实例属性 (Instance Properties) - **`work`**: 当前加载的 Work 数据(主 Work)。详见 [Work](./work.md)。 - **`works`**: 当前加载的所有 Work 数据列表。详见 [Work](./work.md)。 - **`model`**: 当前加载的 Model 数据(主 Model)。详见 [Model](./model.md)。 - **`models`**: 当前加载的所有 Model 数据列表。详见 [Model](./model.md)。 ### 实例方法 (Instance Methods) - **`appendTo(element: HTMLElement)`**: 将 canvas 挂载到指定 DOM 元素。 - **`load(work: Work, state?: State, duration?: number)`**: 加载场景数据。详见 [Work](./work.md)。 - **`dispose()`**: 销毁实例,释放 WebGL 上下文与内存。 - **`updateCamera(pose: Partial<Pose>, duration: number, userAction?: boolean)`**: 移动相机(不触发点位移动)。移动相机的视角或位置,不会改变当前所在的 PanoIndex。如果动画中途被打断,Promise 会被 reject。 - **`updateCameraWithKeyframes(keyframes: { progress: number; value: Pose; key?: string }[], duration: number, userAction?: boolean)`**: 通过关键帧动画移动相机。 - **`refresh()`**: 强制刷新画布尺寸。通常在窗口 resize 时调用,Five 会自动监听 resize,但在某些布局变化场景下可能需要手动调用。 - **`getPixels(x, y, width, height, ...)` / `getPixels(options)`**: 获取画布指定区域的像素数据。常用于截图、生成缩略图或颜色拾取。支持配置区域、像素比 (pixelRatio)、Y轴翻转 (flipY) 及是否忽略全景图 (skipPanorama) 等。 - **`project2d(vector: THREE.Vector3, testModel?: boolean): THREE.Vector2 | null`**: 计算三维坐标对应到屏幕的二维坐标。如果坐标在视野外或被遮挡(开启 testModel 时),返回 null。详见 [Screen Project](./screen-project.md)。 - **`ready(args?: { tile?: boolean })`**: Promise,当 Five 状态稳定时 resolve。 - **Resolve 时机**: 1. **状态同步**:相机姿态已通过动画过渡到目标状态(`stateSynced` 为 true)。 2. **模型加载**:如果是 Floorplan/Topview/Mapview/Model 模态,需等待模型加载完成 (`modelScene.loaded`)。 3. **瓦片加载**:如果是 Panorama 模态且传入了 `{ tile: true }`,需等待当前视角的瓦片加载完成。 - **`setState(state: Partial<State>, options?: ChangeStateOptions)`**: 变更当前状态(如点位、视角)。详见 [State](./state.md)。 - **`on(event, callback)` / `off(event, callback)`**: 事件监听。详见 [Event](./event.md)。 ## Related * [Work](./work.md): Work 数据结构说明。 * [Model](./model.md): Model 数据结构说明。 * [State](./state.md): 状态管理详解。 * [Event](./event.md): 事件系统说明。 * [Image Options](./image-options.md): 图片加载配置。 * [Mode](./mode.md): 模态切换说明。 * [Parameter](./parameter.md): 其他核心参数。 --- ```yaml tags: [初始化, 创建实例, 渲染器, 销毁, 入口, 构造函数, five, initialization, core, instance, lifecycle, canvas, appendTo, dispose] ```