添加全景热点标签
PanoTagPlugin
功能说明
全景热点标签插件 提供在全景模式下标注房源不同位置热点标签信息。
详细功能点如下:
- 热点标签共分为“音频标签(Audio)”、“文本标签(Text)”、“图文标签(ImageText)”、“VR 跳转标签(Link)”、“营销标签(Marketing)”、“图片视频贴片(MediaPlane)”、“自定义标签(Custom)”等。
 - 标签按照维度类型(DimensionType)可以分为:“2D(Two)”和“3D(Three)”两种。
 - 按照点位类型(PointType)来分,标签又可以分为:点标记(PointTag)和平面标记(PlaneTag)两种。
 - 用户可以自由组合上述标签分类属性,根据自己的业务类型,创造更加适合的全景热点标签。
 
示例效果
安装引用
请按需选择 yarn 或 npm 安装方式:
- npm
 - Yarn
 - pnpm
 
npm install @realsee/dnalogel
yarn add @realsee/dnalogel
pnpm add @realsee/dnalogel
通过 es 引用:
import { PanoTagPlugin } from "@realsee/dnalogel";
开发指南
初始化
在初始化 Five 实例时,将 PanoTagPlugin 配置在初始化插件参数即可。
import { Five } from "@realsee/five";
import { PanoTagPlugin } from "@realsee/dnalogel";
const five = new Five({
  plugins: [
    [
      PanoTagPlugin,
      "panoTagPlugin", // 自定义插件名称
      {
        // 参数配置
      },
    ],
  ],
});
React 初始化
在创建 FiveProvider 时,将 PanoTagPlugin 配置在初始化插件参数即可。
import { PanoTagPlugin } from "@realsee/dnalogel";
import { createFiveProvider, FiveCanvas } from "@realsee/five/react";
const FiveProvider = createFiveProvider({
  plugins: [
    [
      PanoTagPlugin,
      "panoTagPlugin", // 自定义插件名称
      {
        // 参数配置
      },
    ],
  ],
});
Vue 初始化
在使用 FiveProvider 时,将 PanoTagPlugin 配置在初始化插件参数即可。
<template>
  <FiveProvider :fiveInitArgs="fiveInitArgs"> </FiveProvider>
</template>
<script setup>
import PanoTagPlugin from "@realsee/dnalogel/libs/PanoTagPlugin";
import { FiveProvider, FiveCanvas } from "@realsee/five/vue";
const fiveInitArgs = {
  plugins: [
    [
      PanoTagPlugin,
      "panoTagPlugin", // 自定义插件名称
      {
        // 参数配置
      },
    ],
  ],
};
</script>
载入数据
// 获取插件实例,其中 `panoTagPlugin` 是初始化时自定义的名称
const pluginInstance = five.plugins.panoTagPlugin;
// 调用 `load` 方法载入全景标签数据
pluginInstance.load(tagsData, config);
核心方法
load:(data: Tags, config?: AddTagConfig) => void载入插件数据addTag:(tag: Tag | Tag[], config?: AddTagConfig) => void添加标签clearTags: () => void清空所有标签async show: (params?: { userAction?: boolean; withAnimation?: boolean }) => void显示标签async hide: (params?: { userAction?: boolean; withAnimation?: boolean }) => void隐藏标签enable: (params?: { userAction?: boolean }) => void允许使用插件disable: (params?: { userAction?: boolean }) => void禁止使用插件dispose: () => void销毁插件setState: (state: Partial<State>, params: { userAction?: boolean; visibleWithAnimation?: boolean }) => void更新插件状态changeTagNormalById: (id: TagId, normal: ArrayPosition) => void修改标签位置信息changeDataById: (id: TagId, data: PartialDeep<Tag<C>['data']>, deepMerge = true) => void改变 datachangeTagById: (id: TagId,tag: PartialDeep<{ [P in keyof Pick<Tag<C>, 'enabled' | 'style' | 'dimensionType' | 'contentType' | 'data' | 'normal'>]: Tag[P] }>,deepMerge = true,) => void改变 tag 任意属性destroyTagById: (id: TagId | TagId[]) => void销毁 tagpauseCurrentMedia: () => void暂停当前标签内进行的所有多媒体
添加自定义热点标签
热点标签中有一个标签类型叫做“自定义热点标签”,使用这个标签类型,开发者可以根据自己的业务需要,自定义添加任意符合规范的标签样式。
可以参考下面的例子:
// 添加自定义热点
const addCustomerTag = () => {
  // 自定义Element
  const ele = document.createElement("div");
  ele.innerText = "这是一个自定义的热点标签";
  ele.style.color = "red";
  ele.style.width = "200px";
  ele.style.border = "1px solid #000";
  const tagData: Tag = {
    id: "03338b76-b64a-4e90-37fb-44e3c0ffeb88",
    pointType: "PointTag",
    dimensionType: "2D",
    position: [-1.7882169929208833, 1.022040232156752, -2.339700937271118],
    data: {
      text: "自定义热点标签",
    },
    element: ele,
    // ContentType设置为Custom
    contentType: "Custom",
  };
  pluginInstance.addTag(tagData);
};
数据结构
插件中最重要的一个结构是 Tag,添加热点标签,修改标签信息等操作都需要使用,其对应的数据结构如下:
export type Tag<
  C extends ContentType = any,
  P extends PointType = any,
  D extends DimensionType = any,
  CustomDataType extends Object = {}
> = {
  /** 开启/禁用 */
  enabled?: boolean;
  /** 唯一标识 */
  id: TagId;
  /** 一个点的标签/4个点的标签 */
  pointType: P;
  /** 2维/3维类型 */
  dimensionType: D;
  /** 内容类型,根据内容类型展示对应UI */
  contentType: C;
  /** 点 */
  position: P extends PointType.PointTag
    ? Position
    : P extends PointType.PlaneTag
    ? [Position, Position, Position, Position]
    : any;
  /** 自定义标签内容 */
  element?: string | Element | ElementRenderer;
  /** 标签数据 */
  data: C extends ContentType.Custom ? CustomDataType : ContentTypeMap[C];
  /** 「展开/收起」 「可见/不可见」 的策略配置 */
  config?: TagConfig<C, P, D, CustomDataType>;
  /** 法向量 */
  normal?: Position;
  /** 样式 */
  style?: {
    /** 小圆点样式 */
    point?:
      | { style: "Default" }
      | { style: "CustomIcon"; iconUrl: string }
      | { style: "noPoint" };
    /** 收起的时候的动画延时,单位:ms */
    foldedPointDelay?: number;
  };
} & (D extends DimensionType.Three
  ? P extends PointType.PointTag
    ? { normal: Position }
    : unknown
  : unknown); /** 三维标签需要法向量 */
标签类型定义
export enum ContentType {
  /** 音频标签 */
  Audio = "Audio",
  /** 文本标签 */
  Text = "Text",
  /** 图文标签 */
  ImageText = "ImageText",
  /** VR跳转标签 */
  Link = "Link",
  /** 营销标签 */
  Marketing = "Marketing",
  /** 图片视频贴片 */
  MediaPlane = "MediaPlane",
  /** 其他/自定义标签 */
  Custom = "Custom",
}
标签维度类型定义
export enum DimensionType {
  Two = "2D",
  Three = "3D",
}
标签点位类型定义
export enum PointType {
  PointTag = "PointTag",
  PlaneTag = "PlaneTag",
}