UNPKG

@realsee/five

Version:

Realsee Renderer SDK

122 lines (96 loc) • 4.58 kB
# State (状态) - **Summary**: State 是 Five 的核心状态对象,描述了当前的显示模式、观察点位以及相机的空间姿态。 - **Schema**: 包含 Pose (相机姿态) 和 Mode (模式) 等属性的接口。 - **Concepts**: Camera Pose, Coordinate System, Mode Specifics。 - **Examples**: 状态获取与更新。 ## Schema > **Definition**: [State](../../five/types/state.d.ts) **State** 类型定义如下(继承自 `Pose`): ```ts import * as THREE from "three"; import { Mode } from "@realsee/five"; interface Pose { /** 相机偏航角 (水平方向),单位:弧度 */ longitude: number; /** 相机俯仰角 (垂直方向),单位:弧度 */ latitude: number; /** 相机垂直视场角,单位:度 */ fov: number; /** 相机看向的目标中心点坐标 */ offset: THREE.Vector3; /** 相机距离目标中心点的距离 */ distance: number; } interface State extends Pose { /** 显示模式 */ mode: Mode; /** 当前点位的唯一标识 (workCode) */ workCode: string; /** 当前点位在列表中的索引 */ panoIndex: number; } ``` ## Concepts * **Camera Pose (相机姿态)**: Five 使用球坐标系 (Spherical) + 笛卡尔偏移 (Cartesian Offset) 来描述相机位置。 * 相机始终位于以 `offset` 为中心、`distance` 为半径的球面上。 * **longitude**: 球面上的经度(水平旋转)。 * **latitude**: 球面上的纬度(垂直旋转)。 * **offset**: 相机“看向”的点,也是球心。 * **distance**: 相机到 `offset` 的距离。 * **Coordinate System (坐标系)**: * 采用 Y-Up 右手坐标系(与 Three.js 默认一致)。 * 单位长度为米。 * **Mode Specifics (模式特性)**: * **Panorama**: `distance` 通常为 0,即相机位置与 `offset` 重合(第一人称视角)。 * **Floorplan/Mapview**: `offset` 通常位于模型中心,`distance` 大于模型包围盒半径(第三人称上帝视角)。 * **State vs CurrentState**: * **five.state**: **目标状态**。表示相机最终应该到达的状态。当调用 `setState` 或用户交互结束时,此值即为最终结果。通常用于 UI 同步(如高亮当前模式按钮)。 * **five.getCurrentState()**: **瞬时状态**。表示当前渲染帧相机的实际状态。在动画过渡过程中,`currentState` 会不断变化直至追赶上 `state`。通常用于需要实时反馈的场景(如罗盘旋转)。 ## Examples ### 快速上手 (Quick Example) 使用 `setState` 更新状态: ```ts // 切换到户型图模式,并旋转相机到 45 度 five.setState({ mode: 'Floorplan', longitude: Math.PI / 4 }); ``` ### 详细示例 (Detailed Example) 获取当前状态并基于此修改: ```ts const state = five.state; // 在当前状态基础上,向右旋转 90 度,并略微拉远距离 five.setState({ longitude: state.longitude + Math.PI / 2, distance: state.distance + 2.0 }); ``` ## Common Pitfalls 1. **单位混淆**: `longitude` 和 `latitude` 使用**弧度**,而 `fov` 使用**角度**(度)。 2. **Offset 类型**: `offset` 必须是 `THREE.Vector3` 实例。如果在 React 等框架中使用纯对象(Plain Object),Five 内部会自动转换,但在 TypeScript 中需注意类型匹配。 3. **异步更新**: `setState` 触发的相机运动是异步动画过程。如果需要立即无动画跳转,可传递第二个参数 `immediately: true`。 4. **JSON 序列化**: `State` 中的 `offset` 是 `THREE.Vector3` 实例,不能直接 `JSON.stringify`。保存时需手动提取 `{ x, y, z }`,恢复时需重新构造 `new THREE.Vector3(x, y, z)`。 ```typescript // 保存 const snapshot = { ...five.state, offset: { x: five.state.offset.x, y: five.state.offset.y, z: five.state.offset.z } }; localStorage.setItem('fiveState', JSON.stringify(snapshot)); // 恢复 const saved = JSON.parse(localStorage.getItem('fiveState')!); five.setState({ ...saved, offset: new THREE.Vector3(saved.offset.x, saved.offset.y, saved.offset.z) }, true); ``` ## Related * [Mode - 模式](./mode.md): 详细了解各种 Mode 的区别。 * [Camera Animation](./camera-animation.md): 基于 State 的相机动画控制。 * [Five](./five.md): Five 核心类,`setState` / `getCurrentState` 的宿主。 * [Coordinate System](./coordinate-system.md): 坐标系定义。 --- ```yaml tags: [状态保存, 状态恢复, 场景还原, 快照, camera, state, pose, interaction, save, restore, snapshot] ```