npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@aibee/vr-workshop-devkit

v0.5.16

Published

基于*Owlly*的通用离线标注工具集

Downloads

15

Readme

VR Workshop DevKit

基于Owlly的通用离线标注工具集

起步

安装

# npm
$ npm i -S @aibee/vr-workshop-devkit

# yarn
$ yarn add @aibee/vr-workshop-devkit

使用

main.js

import VRLabelingTool from '@aibee/vr-workshop-devkit';
Vue.use(VRLabelingTool);
<template lang="html">
  <VRLabelingTool
    ref="labelingTool"
    :model-path="modelPath"
    :panorama-data="panoData"
    :initial-view-direction="initialViewDirection"
    :current-panorama-id.sync="currentPid"
    :show-map.sync="showMap"
    :svg-path="svgPath"
    :svg-align-params="svgAlignParams"
    :custom-content-types="customContentTypes"
    :panorama-videos="panoramaVideos"
    @stageInited="onStageInited"
    @eventEmitted="onEventEmitted">
    <template #transitionSelector>
      <el-cascader
        v-model="selectedTransitionTarget"
        class="dialog-cascader"
        :options="transitionOptions"
        size="mini"
        @change="onTransitionSelectedTargetChanged">
      </el-cascader>
    </template>
  </VRLabelingTool>
</template>

API 文档

参数

快速参考表格

复杂数据结构将在表格下方复杂数据小节说明

|参数|必填|说明|类型|可选值|默认值| |:--|:--|:--|:--|:--|:--| |model-path|✅|所标注VR场景的模型数据URI|string|-|-| |panorama-data|✅|所标注VR场景的全景图数据|array(详见下方说明)|-|-| |initial-view-direction|✅|所标注VR场景的默认视线方向, 数据为(x, y, z)组成的方向向量数组|[number, number, number]|-|-| |current-panorama-id|✅|当前全景点位id, 数据双向绑定|number|-|-| |show-map||是否显示地图, 数据双向绑定|boolean|-|false| |svg-path||地图对应svg的URI|string|-|-| |svg-align-params||地图与模型的对齐数据|object(详见下方说明)|-|-| |custom-content-types||自定义内容数据|array(详见下方说明)|-|-| |panorama-videos||全景视频数据|array(详见下方说明)|-|-|

复杂数据说明

panorama-data

type PanoramaData = {
    pid: number, // 必填, 点位id
    visible: boolean, // 必填, 全景点可见性
    position: number[], // 必填, 全景点点位坐标, 格式为 [x, y, z]
    quaternion: number[], // 必填, 全景点姿态四元数, 格式为 [x, y, z, w]
    neighbourPanoramaIDs: number[], // 必填, 临近全景点可见性数组, 数组元素为可见点位的点位id
    textureURLs: string[], // 必填, 低清全景图图片URI数组
    useLowTextureURLsOnly: boolean, // 可选, 仅使用低清全景图, 默认为false
    highTextureURLs: string[], // 可选, 高清全景图图片URI数组, 默认为null
}[];

svg-align-params

type SvgAlignParams = {
    img_height: number, // 地图svg高度,
    img_width: number, // 地图svg宽度,
    transformMatrices: {
        upTrans: number[], // svg坐标空间与模型坐标空间的对齐映射矩阵, 数组为16个元素, 描述一个4*4的矩阵
    },
};

custom-content-types

type CustomContentTypes = {
    value: number, // 类型id, 注意: 0为无类型值, 请勿使用
    thumb: string, // 缩略图URI, 用于在选择器内展示
    title: string, // 类型名称, 用于在选择器等位置展示
    component: VueComponentClass, // 编辑组件, 用于填充内容标签页的编辑内容, 传入类定义而不是实例,
    default: any, // 默认值, 若使用该字段, 默认值会传入组件的data属性内
};

panorama-videos

type PanoramaVideos = {
    pid: number, // 必填, 点位id
    src: string, // 必填, 全景视频链接
    name: string, // 必填, 视频名称
}[];

插槽

transitionSelector

过渡选择对话框内左上角所需填充的选择器组件, 需用户自行定义

接口

侧边栏设置

omitTools(toolnames: string | Array)

筛选掉不需要的工具。

switchTool(toolname)

设置默认选中工具。 可选项有 viewingAngle、pointVisibility、hotspot、imgTextLabel、signLabel、ruler

视角设置

setPerspective(perspectiveData: object)

设置视角数据

参数

|名称|说明| |:--|:--| |perspectiveData|标签数据数组, 数组元素数据结构参考"事件"部分viewing-angle``update中data的结构|

漫游热点

setHotspots(hotspotData: object[] || {short: object[], content: object[]})

设置热点数据.

参数

|名称|说明| |:--|:--| |hotspotData|热点数据数组或者对象。假设传入数组, 工具归类热点数据都为快捷导航热点。 数据元素数据结构参考"事件"部分hotspot``create中data的结构|

createHotspot(hotspotData: object)

新增热点

|名称|说明| |:--|:--| |hotspotData|热点数据 结构如下|

type hotspotData = {
    img: string, // 热点封面, 应该为base64格式的图片
    pid: number, // currentPid, 当前所在点位
    quaternion: {}, // 四元数
    type: string // 类型, 当前可选 content, short
};
updateHotspot(id: number, hotspotData: object)

更新热点

|名称|说明| |:--|:--| |id|标签id| |hotspotData|热点数据|

deleteHotspot(id: number, type?: short)

删除目标id的热点数据

参数

|名称|说明| |:--|:--| |id|热点id|

标签标注

set2DLabels(labelData: object[])

设置标签标注数据, 该操作将替换所有标签.

参数

|名称|说明| |:--|:--| |labelData|标签数据数组, 数组元素数据结构参考"事件"部分2d-label``create中labelData的结构|

add2DLabel(labelData: object)

在当前点位添加2D标签, 使用labelData作为模板.

参数

|名称|说明| |:--|:--| |labelData|标签数据, 数据结构参考"事件"部分2d-label``create中labelData的结构|

update2DLabel(id: number, labelData: object)

更新目标id的标签数据

参数

|名称|说明| |:--|:--| |id|标签id| |labelData|标签数据, 数据结构参考"事件"部分2d-label``create中labelData的结构|

delete2DLabel(id: number)

删除目标id的标签数据

参数

|名称|说明| |:--|:--| |id|标签id|

set2DTemplateLabels(templateData: object[])

设置标签标注标签库(模板)数据.

参数

|名称|说明| |:--|:--| |templateData|标签数据数组, 数组元素数据结构参考"事件"部分2d-label``create中labelData的结构|

set2DShortcuts(shortcutData: object[])

设置标签标注快速添加(模板)数据.

参数

|名称|说明| |:--|:--| |shortcutData|标签数据数组, 数组元素数据结构参考"事件"部分2d-label``create中labelData的结构|

add2DShortcut(labelData: object)

添加快速添加标签数据, 使用labelData作为模板.

参数

|名称|说明| |:--|:--| |labelData|标签数据, 数据结构参考"事件"部分2d-label``create中labelData的结构|

delete2DShortcut(labelData: object)

删除快速添加标签数据

参数

|名称|说明| |:--|:--| |labelData|标签数据, 数据结构参考"事件"部分2d-label``create中labelData的结构|

标牌标注

set3DLabels(labelData: object[])

设置3D标牌数据, 该操作将替换所有标牌.

参数

|名称|说明| |:--|:--| |labelData|标签数据数组, 数组元素数据结构参考"事件"部分3d-label``create中labelData的结构|

create3DLabel(labelData: object)

新建3D标牌并且自动选中该3D标牌. 完成后可在组件内通过 label-3d-created 监听到并进行自定义操作

参数

|名称|说明| |:--|:--| |labelData|3D标牌数据, 数组元素数据结构参考"事件"部分3d-label``create中labelData的结构。新建时可不含id / transition / content|

update3DLabel(id: number, labelData: object)

更新3D标牌. 完成后可在组件内通过 label-3d-updated 监听到并进行自定义操作

参数

|名称|说明| |:--|:--| |id|标牌id| |labelData|3D标牌数据, 数组元素数据结构参考"事件"部分3d-label``create中labelData的结构。|

delete3DLabel(id: number)

删除3D标牌。完成后可在组件内通过 label-3d-deleted 监听到并进行自定义操作

参数

|名称|说明| |:--|:--| |id|标牌id|

可见性

setPointVisibilities(pointsVisibility: object[])

设置点位可见性。

参数

|名称|说明| |:--|:--| |pointsVisibility|可见性数组。 数组元素数据结构参考"事件"部分point-visibility``current-update中pointVisibility的结构。|

setCurrentPointVisibility(pointVisibility: object)

设置当前点位可见性。

参数

|名称|说明| |:--|:--| |pointVisibility|可见性对象。 数组元素数据结构参考"事件"部分point-visibility``current-update中pointVisibility的结构。|

setCurrentPointNeighborVisibility(neighborPid: number, neighborVisible: boolean)

设置位于当前点位的时候, 相邻点位对于当前点位是否可见。

|名称|说明| |:--|:--| |neighborPid|相邻点位pid| |neighborVisible|相邻点位对于当前点位是否可见|

过渡相关

openTransitionDialog()

开启过渡选择对话框

setTransitionDialogVrData(panoData: object[], modelPath: string, pid: number, direction: number[])

设置过渡选择对话框内的VR场景数据

参数

|名称|说明| |:--|:--| |panoData|全景数据, 数据结构参考"参数"部分中PanoramaData的结构| |modelPath|模型数据URI| |pid|点位id| |direction|方向, 结构为[x, y, z]数组|

setTransitionInfo(info: object)

设置当前的过渡信息

参数

|名称|说明| |:--|:--| |info|标签数据, 数据结构参考getCurrentTransitionInfo()返回值|

getCurrentTransitionInfo(): object

获取当前的过渡信息

返回值: 过渡信息, 结构如下

{
    pid: number, // 点位id
    text: string, // 过渡提示信息文字
    thumb: string, // 过渡缩略图
    direction: number[], // 朝向方向向量
}

事件

目前标注工具仅使用一个事件接口进行广播, 但使用参数进行工具与类型的区分. 通用事件结构如下:

通用事件接口

事件名: @stageInited stage初始化完成后的生命周期。可在这个事件里执行自定义操作和工具侧边栏相关。

参数结构实例:

function onStageInited() {
    // ...
}

事件名: @eventEmitted

参数结构实例:

function onEventEmitted({
    tool: string, // 广播事件的工具名称
    type: string, // 事件的类型
    data: any, // 事件所包含的数据
}) {
    // ...
}

工具类型

|名称|说明| |:--|:--| |viewing-angle|视角设置| |hotspot|漫游热点| |label-2d|标签标注| |label-3d|标牌标注| |point-visibility|点位可见性|

各工具事件

viewing-angle 视角设置
update

初始视角更新

data结构:

{
    defaultFov: number, // 初始FOV
    fovRange: [number, number], // FOV范围
    initPid: number, // 初始点位id
    direction: [number, number, number], // 初始视角方向
    indicatorUrl: string, // 点位地面图标URI
    indicatorSize: number, // 点位地面图片尺寸, 以厘米为单位
    northPoint: number, // 指北方向角度
}
create

初始视角新建, 会在短期内移除该事件.

data结构参考update事件.

north-update

指北角更新, 会在短期内移除该事件.

data结构参考update事件.

north-create

指北角新建, 会在短期内移除该事件.

data结构参考update事件.

hotspot 漫游热点
create

热点新建

data结构:

{
    img: string, // 热点缩略图, 格式为Base64字符串
    pid: number, // 热点点位id
    quaternion: { // 方向四元数
        _x: number,
        _y: number,
        _z: number,
        _w: number,
    },
}
update

热点更新

data结构:

{
    img: string, // 热点缩略图, 格式为Base64字符串或URI
    pid: number, // 热点点位id
    quaternion: { // 方向四元数
        _x: number,
        _y: number,
        _z: number,
        _w: number,
    },
    sort: number, // 排序值
    text: string, // 热点名称
}
delete

热点删除

data结构:

{
    id: number, // 热点id
}
sort

热点排序

data结构:

{
  params: {
    target_sort: number, // 需要变更的排序值
    next_sort: number, // 变更后的排序值
  },
  type: string  // 热点所属类型
}
label-2d 标签标注
create

标签新建, 该事件在用户执行动作时广播, 工具会仅执行事件广播而不会进行其他操作

data结构:

{
    labelData: {
        id: number,  // 标签id (create事件不返回该值)
        position: [number, number, number], // 标签位置
        pid: number, // 标签所在点位id
        visible: boolean, // 可见性
        image: {
            src: string, // 图片URI
            height: number, // 高度
            width: number, // 宽度
            anchor: string, // 锚点位置
            offsetX: number, // X轴偏移量
            offsetY: number, // Y轴偏移量
            visible: boolean, // 可见性
        },
        text: {
            content: string, // 文字内容
            anchor: string, // 锚点位置
            offsetX: number, // X轴偏移量
            offsetY: number, // Y轴偏移量
            visible: boolean, // 可见性
            color: string, // 颜色 (CSS颜色)
            fontSize: number, // 字号
            align: string, // 文字(段落)对齐
            backgroundColor: string, // 背景颜色 (CSS颜色)
            borderColor: string, // 描边颜色 (CSS颜色)
            borderWidth: number, // 描边宽度
            borderRadius: number, // 圆角半径
        },
        transition: {
            // 暂时不记录VR id, 后期会增加
            pid: number, // 点位id
            text: string, // 过渡说明文字
            thumb: string, // 过渡缩略图, Base64 或 URI
            direction: { // 朝向方向向量
                x: number,
                y: number,
                z: number,
            },
        },
        content: {
            type: number, // 内容类型
            triggerType: number, // 触发类型,
            data: any, // 内容数据
        },
    }
}
added

标签已添加后广播.

data结构参考create事件.

update

标签更新前广播, 该事件在用户执行动作时广播, 工具会仅执行事件广播而不会进行其他操作

data结构参考create事件.

updated

标签更新后广播.

data结构参考create事件.

delete

标签删除前广播, 该事件在用户执行动作时广播, 工具会仅执行事件广播而不会进行其他操作

data结构参考create事件.

deleted

标签删除后广播.

data结构参考create事件.

shortcut-create

快捷添加新建前广播, 该事件在用户执行动作时广播, 工具会仅执行事件广播而不会进行其他操作

data结构参考create事件.

shortcut-created

快捷添加新建后广播.

data结构参考create事件.

shortcut-delete

快捷添加删除前广播, 该事件在用户执行动作时广播, 工具会仅执行事件广播而不会进行其他操作

data结构参考create事件.

shortcut-deleted

快捷添加删除后广播.

data结构参考create事件.

open-transition-dialog

用户打开点位跳转选择器对话框时广播, 该事件在用户执行动作时广播, 工具会仅执行事件广播而不会进行其他操作

data结构: 无

clear-transition-info

用户清空点位跳转信息时广播

data结构: 无

transition-selection-confirmed

用户确认跳转信息时广播

data结构:

{
    pid: number, // 点位id
    image: string, // 过渡缩略图, Base64
    direction: number[], // 朝向方向向量
}
transition-selection-cancelled

用户取消确认跳转信息时广播

data结构: 无

label-3d 标牌标注
create

标牌新建, 该事件在用户执行动作时广播, 工具会仅执行事件广播而不会进行其他操作

data结构:

{
    id: number,  // 标牌id (create事件不返回该值)
    position: [number, number, number], // 标牌位置
    pose: [number, number, number, number], // 标牌姿态
    poseType: 0 | 1, // 标牌姿态类型, 0为朝向镜头, 1为自由姿态
    srcType: 'image' | 'video' | 'model, // 资源类型, image为图片, video为视频, model为模型
    imgUrl: string, // 图片URI
    videoUrl: string, // 视频URI(srcType为model时,模型URI也使用此字段)
    videoRatio: number, // 视频比例, 只读属性, SDK不会对该数值进行任何改动, 数值为 宽度 / 高度 的结果
    imgHeight: number, // 高度
    imgWidth: number, // 宽度(模型缩放也使用此字段)
    visible: boolean, // 可见性
    title: string, // 标牌名称
    visibleDist: number, // 可见范围距离
    visiblePoints: number[], // 标牌可见点位id数组
    transitionId: number, // transitionId (create事件不返回该值, 没有transition时候标注工具默认 transitionId 为 -1)
    transition: {  // 过度 (create事件不返回该值)
        // 暂时不记录VR id, 后期会增加
        pid: number, // 点位id
        text: string, // 过渡说明文字
        thumb: string, // 过渡缩略图, Base64 或 URI
        direction: { // 朝向方向向量
            x: number,
            y: number,
            z: number,
        },
    },
    contentId: number, // contentId (create事件不返回该值, 没有content时候标注工具默认 contentId 为 -1)
    content: { // 内容 (cerate 事件不返回该值)
        type: number, // 内容类型
        triggerType: number, // 触发类型,
        data: any, // 内容数据
    },
}
created

标牌新建完成后广播

update

标牌更新前广播, 该事件在用户执行动作时广播, 工具会仅执行事件广播而不会进行其他操作

data结构参考create事件.

updated

标牌更新后广播

delete

标牌删除前广播, 该事件在用户执行动作时广播, 工具会仅执行事件广播而不会进行其他操作

data结构参考create事件.

deleted

标牌删除后广播

open-transition-dialog
clear-transition-info
transition-selection-confirmed
transition-selection-cancelled

与label-2d同名事件相同

point-visibility 点位可见性编辑
current-update

当前点位可见性更新

data结构:

{
    pid: number,
    visible: boolean, // 当前点位是否可见
    invisibleNeighbors: [...pids] // 位于当前点位不可见的neighborPids
}
neighbor-update

当前点位可见的相邻点更新

data结构:

{
    neighborPid: number, // 相邻点位pid
    neighborVisible: boolean, // 相邻点位相对当前点位是否可见
}