--- outline: [2, 3] --- # VolumeMesh - 源文件:`packages/sdk/src/effect/volume/VolumeMesh.ts` - 文档位置:`packages/docs/api/effect/volume/VolumeMesh.md` ## 接口:`ColorStop` - 作用:ColorStop 的结构定义。 ### 字段 | 字段名 | 类型 | 必填 | 作用 | | --- | --- | --- | --- | | `color` | `string` | 是 | 颜色配置。 | | `step` | `number` | 是 | 用于保存 `step` 对应的数据。 | ## 枚举:`VolumeRenderMode` - 作用:VolumeRenderMode 枚举定义。 | 枚举项 | 值 | 说明 | | --- | --- | --- | | `EmissionAbsorptionModel` | `0` | 枚举值 `EmissionAbsorptionModel`。 | | `MinimumIntensityProjection` | `1` | 枚举值 `MinimumIntensityProjection`。 | | `MaximumIntensityProjection` | `2` | 枚举值 `MaximumIntensityProjection`。 | ## 接口:`VolumeRenderingOptions` - 作用:VolumeRenderingOptions 的结构定义。 ### 字段 | 字段名 | 类型 | 必填 | 作用 | | --- | --- | --- | --- | | `name` | `string` | 是 | 名称。 | | `scale` | `number` | 否 | 用于保存 `scale` 对应的数据。 | | `size` | `number` | 否 | 尺寸参数。 | | `sizeX` | `number` | 否 | 用于保存 `sizeX` 对应的数据。 | | `sizeY` | `number` | 否 | 用于保存 `sizeY` 对应的数据。 | | `sizeZ` | `number` | 否 | 用于保存 `sizeZ` 对应的数据。 | | `data` | `Uint8Array` | 是 | 输入数据。 | | `colorStops` | `ColorStop[]` | 否 | 用于保存 `colorStops` 的集合数据。 | | `range` | `number` | 否 | 用于保存 `range` 对应的数据。 | | `threshold` | `number` | 否 | 阈值配置。 | | `steps` | `number` | 否 | 用于保存 `steps` 对应的数据。 | | `useSmoothing` | `boolean` | 否 | 用于标记 `useSmoothing` 的启用状态。 | | `mode` | `VolumeRenderMode` | 否 | 用于保存 `mode` 对应的数据。 | | `clipMode` | `0 \| 1` | 否 | 用于保存 `clipMode` 对应的数据。 | | `clipPlane` | `THREE.Vector4` | 否 | 用于保存 `clipPlane` 对应的数据。 | | `showWireframe` | `boolean` | 否 | 用于标记 `showWireframe` 的启用状态。 | ## 函数:`isVolumeMesh` - 作用:执行 is Volume Mesh 相关逻辑。 ### 签名 ```ts function isVolumeMesh(value: any): boolean ``` - 入参: | 参数名 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `value` | `any` | 是 | 要写入的新值。 | - 出参:`boolean` - 返回说明:返回布尔结果。 ## 类:`VolumeMesh` - 作用:VolumeMesh 类。 - 继承/实现:`extends THREE.Mesh` ### 构造函数 #### `new VolumeMesh(viewer: Viewer, options: VolumeRenderingOptions)` - 作用:创建 VolumeMesh 实例。 - 入参: | 参数名 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `viewer` | `Viewer` | 是 | 关联的 Viewer 实例。 | | `options` | `VolumeRenderingOptions` | 是 | 当前功能对应的配置项。 | - 出参:`VolumeMesh` - 返回说明:返回当前类实例。 ### 属性 | 属性名 | 可见性 | 类型 | 作用 | | --- | --- | --- | --- | | `panelCounter` | `public static` | `number` | 用于保存 `panelCounter` 对应的数据。 | | `range` | `public` | `THREE.UniformNode<'float', number>` | 用于保存 `range` 对应的数据。 | | `threshold` | `public` | `THREE.UniformNode<'float', number>` | 阈值配置。 | | `opacity` | `public` | `THREE.UniformNode<'float', number>` | 控制对象或材质的透明度。 | | `steps` | `public` | `THREE.UniformNode<'float', number>` | 用于保存 `steps` 对应的数据。 | | `useSmoothing` | `public` | `THREE.UniformNode<'float', number>` | 用于保存 `useSmoothing` 对应的数据。 | | `mode` | `public` | `THREE.UniformNode<'float', number>` | 用于保存 `mode` 对应的数据。 | | `clipMode` | `public` | `THREE.UniformNode<'float', number>` | 用于保存 `clipMode` 对应的数据。 | | `clipPlane` | `public` | `THREE.UniformNode<'vec4', THREE.Vector4>` | 用于保存 `clipPlane` 对应的数据。 | | `clipPlaneX` | `public` | `THREE.UniformNode<'vec4', THREE.Vector4>` | 用于保存 `clipPlaneX` 对应的数据。 | | `clipPlaneY` | `public` | `THREE.UniformNode<'vec4', THREE.Vector4>` | 用于保存 `clipPlaneY` 对应的数据。 | | `clipPlaneZ` | `public` | `THREE.UniformNode<'vec4', THREE.Vector4>` | 用于保存 `clipPlaneZ` 对应的数据。 | | `uniformScale` | `public` | `number` | 用于保存 `uniformScale` 对应的数据。 | | `data` | `public` | `Uint8Array` | 输入数据。 | | `viewer` | `public` | `Viewer` | 用于保存 `viewer` 对应的数据。 | | `volumeTexture` | `public` | `THREE.Data3DTexture` | 用于保存 `volumeTexture` 对应的数据。 | | `transferTexture` | `public` | `THREE.Texture` | 用于保存 `transferTexture` 对应的数据。 | | `material` | `public` | `THREE.NodeMaterial` | 材质参数。 | | `wireframe` | `public` | `ParametricWireframe` | 用于保存 `wireframe` 对应的数据。 | | `sizeX` | `public` | `number` | 用于保存 `sizeX` 对应的数据。 | | `sizeY` | `public` | `number` | 用于保存 `sizeY` 对应的数据。 | | `sizeZ` | `public` | `number` | 用于保存 `sizeZ` 对应的数据。 | | `canvas` | `public` | `HTMLCanvasElement` | 用于保存 `canvas` 对应的数据。 | | `colorStops` | `public` | `ColorStop[]` | 用于保存 `colorStops` 的集合数据。 | | `isVolumeMesh` | `public` | `boolean` | 用于标记 `isVolumeMesh` 的启用状态。 | ### 方法 #### `updateTransferTexture(colorStops: ColorStop[]): void` - 作用:更新 Transfer Texture。 - 入参: | 参数名 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `colorStops` | `ColorStop[]` | 是 | 参数 `colorStops`,类型为 `ColorStop[]`。 | - 出参:`void` - 返回说明:无返回值。 #### `updateVolumeData(data: Uint8Array): void` - 作用:更新 Volume Data。 - 入参: | 参数名 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `data` | `Uint8Array` | 是 | 输入数据。 | - 出参:`void` - 返回说明:无返回值。 #### `setWireframeVisible(visible: boolean): void` - 作用:设置 Wireframe Visible。 - 入参: | 参数名 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `visible` | `boolean` | 是 | 是否可见。 | - 出参:`void` - 返回说明:无返回值。 #### `updateTransferTextureCanvas(colorStops: ColorStop[]): void` - 作用:更新 Transfer Texture Canvas。 - 入参: | 参数名 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `colorStops` | `ColorStop[]` | 是 | 参数 `colorStops`,类型为 `ColorStop[]`。 | - 出参:`void` - 返回说明:无返回值。 #### `createTransferTexture(colorStops: ColorStop[]): THREE.Texture` - 作用:创建 Transfer Texture。 - 入参: | 参数名 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `colorStops` | `ColorStop[]` | 是 | 参数 `colorStops`,类型为 `ColorStop[]`。 | - 出参:`THREE.Texture` - 返回说明:返回 `THREE.Texture`。 #### `numberToHex(n: number): string` - 作用:执行 number To Hex 相关逻辑。 - 入参: | 参数名 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `n` | `number` | 是 | 参数 `n`,类型为 `number`。 | - 出参:`string` - 返回说明:返回字符串结果。 #### `dispose(): void` - 作用:释放资源并销毁当前实例。 - 入参:无 - 出参:`void` - 返回说明:无返回值。 #### `createDebugPanel(): void` - 作用:创建 Debug Panel。 - 入参:无 - 出参:`void` - 返回说明:无返回值。 ## 构造示例 - 来源:`packages/demo/src/disasterFormationPanel/GoldMineScene/TemperaturePanel.vue` ```ts rangeMin: 6, rangeMax: 53, baseData: data }); // 获取 RAW 后重新遍历体数据,使用 noise3d 重新生成体素值。 data = regenerateVolumeDataWithNoise3D(data, size); } catch (error: unknown) { // RAW 加载失败时回退为全 0 数据,保证面板不崩溃。 console.error("温度体 RAW 加载失败,已回退为默认空数据:", error); data = new Uint8Array(size * size * size); } volume = new VolumeMesh(viewer, { name: "温度", size, scale: 4.99, data: data, mode: VolumeRenderMode.MaximumIntensityProjection, colorStops: [ { color: "#ae1be9", step: 0.0 }, { color: "#0bdb04", step: 0.05 }, { color: "#10e52b", step: 0.1 }, { color: "#1232db", step: 0.15 }, { color: "#0000FF", step: 0.2 }, { color: "#00FFFF", step: 0.33 }, { color: "#FFFF00", step: 0.66 }, { color: "#FF0000", step: 1.0 }, ], }); volume.renderOrder = 3; // volume.material.depthTest = true ``` - 来源:`packages/demo/src/panels/GeothermalScene/DustConcentrationPanel.vue` ```ts const volumeData = generatePipeFilledVolumeData(outerBox); volume = new VolumeMesh(viewer, { name: '形变场数据', size: VOLUME_SIZE, scale: 4.99, data: volumeData, mode: VolumeRenderMode.MaximumIntensityProjection, colorStops: [ // 强度 10(step≈0.04)起始为亮绿色,随强度升高过渡至深绿,热点高强度区映射为红色。 {color: "#335b33", step: 0.04}, {color: "#00ff00", step: 0.62}, {color: "#b31414", step: 0.90}, {color: "#FF0000", step: 1.00}, ], }); volume.renderOrder = 1 // volume.material.depthTest = true volume.material.opacity = 0.5 hasVolume.value = true; bus.triggerSceneTreeUpdate() ``` ## 函数示例 - 当前 Demo 中没有直接展示 `VolumeMesh` 的公开方法调用。 ## Demo 参考 ### `VolumeRenderMode` 以下示例文件中可以看到该 API 的实际调用方式: - `packages/demo/src/disasterFormationPanel/GoldMineScene/TemperaturePanel.vue` - `packages/demo/src/panels/GeothermalScene/DustConcentrationPanel.vue` - `packages/demo/src/panels/TunnelScene/FieldData/StrainDisplayPanel.vue` - `packages/demo/src/panels/TunnelScene/FieldData/StressDisplayPanel.vue` - `packages/demo/src/panels/TunnelScene/FieldData/TemperatureDisplayPanel.vue` ### `VolumeMesh` 以下示例文件中可以看到该 API 的实际调用方式: - `packages/demo/src/disasterFormationPanel/GoldMineScene/DustDisasterLabelPanel.vue` - `packages/demo/src/disasterFormationPanel/GoldMineScene/TemperaturePanel.vue` - `packages/demo/src/panels/GeothermalScene/DustConcentrationPanel.vue` - `packages/demo/src/panels/TunnelScene/FieldData/StrainDisplayPanel.vue` - `packages/demo/src/panels/TunnelScene/FieldData/StressDisplayPanel.vue` - `packages/demo/src/panels/TunnelScene/FieldData/TemperatureDisplayPanel.vue`