@realsee/vreo 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +465 -0
- package/docs/.nojekyll +1 -0
- package/docs/assets/custom.css +52 -0
- package/docs/assets/highlight.css +127 -0
- package/docs/assets/icons.css +1043 -0
- package/docs/assets/icons.png +0 -0
- package/docs/assets/icons@2x.png +0 -0
- package/docs/assets/main.js +52 -0
- package/docs/assets/search.js +1 -0
- package/docs/assets/style.css +1388 -0
- package/docs/assets/widgets.png +0 -0
- package/docs/assets/widgets@2x.png +0 -0
- package/docs/classes/Player.Player-1.html +50 -0
- package/docs/enums/Player.InfoPanelTypeEnum.html +3 -0
- package/docs/enums/Player.PanoEffectEnum.html +5 -0
- package/docs/enums/Player.PanoTagEnum.html +3 -0
- package/docs/enums/Player.VreoKeyframeEnum.html +388 -0
- package/docs/enums/fivePlugins.CameraMovementEffect.html +1 -0
- package/docs/enums/fivePlugins.Rotation.html +1 -0
- package/docs/index.html +204 -0
- package/docs/interfaces/Player.PlayerConfigs.html +4 -0
- package/docs/interfaces/Player.Vertex.html +3 -0
- package/docs/interfaces/Player.VreoKeyframe.html +3 -0
- package/docs/interfaces/Player.VreoUnit.html +3 -0
- package/docs/interfaces/Player.VreoVideo.html +3 -0
- package/docs/interfaces/fivePlugins.CameraMovementOptsCallback.html +1 -0
- package/docs/interfaces/fivePlugins.CameraMovementPluginExportType.html +7 -0
- package/docs/interfaces/fivePlugins.CameraMovementPluginParameterType.html +1 -0
- package/docs/interfaces/fivePlugins.ModelTVVideoPluginData.html +1 -0
- package/docs/interfaces/fivePlugins.ModelTVVideoPluginExportType.html +1 -0
- package/docs/interfaces/fivePlugins.ModelTVVideoPluginParameterType.html +1 -0
- package/docs/interfaces/react.VreoActionCallbacks.html +15 -0
- package/docs/modules/Player.html +29 -0
- package/docs/modules/fivePlugins.html +3 -0
- package/docs/modules/react.html +1 -0
- package/docs/modules.html +1 -0
- package/lib/Player/App.d.ts +2 -0
- package/lib/Player/App.js +68 -0
- package/lib/Player/Controller.d.ts +39 -0
- package/lib/Player/Controller.js +226 -0
- package/lib/Player/hooks.d.ts +4 -0
- package/lib/Player/hooks.js +41 -0
- package/lib/Player/index.d.ts +15 -0
- package/lib/Player/index.js +191 -0
- package/lib/Player/modules/Drawer/index.d.ts +2 -0
- package/lib/Player/modules/Drawer/index.js +67 -0
- package/lib/Player/modules/VideoAgent/VideoAgentMesh.d.ts +30 -0
- package/lib/Player/modules/VideoAgent/VideoAgentMesh.js +324 -0
- package/lib/Player/modules/VideoAgent/VideoAgentScene.d.ts +10 -0
- package/lib/Player/modules/VideoAgent/VideoAgentScene.js +65 -0
- package/lib/Player/modules/VideoAgent/index.d.ts +4 -0
- package/lib/Player/modules/VideoAgent/index.js +44 -0
- package/lib/Player/modules/keyframes/CameraMovement/index.d.ts +2 -0
- package/lib/Player/modules/keyframes/CameraMovement/index.js +73 -0
- package/lib/Player/modules/keyframes/InfoPanel/index.d.ts +2 -0
- package/lib/Player/modules/keyframes/InfoPanel/index.js +89 -0
- package/lib/Player/modules/keyframes/ModelVideo/index.d.ts +2 -0
- package/lib/Player/modules/keyframes/ModelVideo/index.js +87 -0
- package/lib/Player/modules/keyframes/PanoEffect/index.d.ts +2 -0
- package/lib/Player/modules/keyframes/PanoEffect/index.js +142 -0
- package/lib/Player/modules/keyframes/PanoEffect/lineAnime.d.ts +5 -0
- package/lib/Player/modules/keyframes/PanoEffect/lineAnime.js +46 -0
- package/lib/Player/modules/keyframes/PanoTag/index.d.ts +2 -0
- package/lib/Player/modules/keyframes/PanoTag/index.js +168 -0
- package/lib/Player/modules/keyframes/PanoTextLabel/index.d.ts +2 -0
- package/lib/Player/modules/keyframes/PanoTextLabel/index.js +113 -0
- package/lib/Player/modules/keyframes/Prompter/index.d.ts +2 -0
- package/lib/Player/modules/keyframes/Prompter/index.js +105 -0
- package/lib/Player/modules/keyframes/UpdateVRPanorama/index.d.ts +2 -0
- package/lib/Player/modules/keyframes/UpdateVRPanorama/index.js +51 -0
- package/lib/Player/modules/keyframes/VideoEffect/index.d.ts +2 -0
- package/lib/Player/modules/keyframes/VideoEffect/index.js +176 -0
- package/lib/Player/typings.d.ts +14 -0
- package/lib/Player/typings.js +5 -0
- package/lib/fivePlugins/CameraMovementPlugin/index.d.ts +6 -0
- package/lib/fivePlugins/CameraMovementPlugin/index.js +307 -0
- package/lib/fivePlugins/CameraMovementPlugin/typings.d.ts +48 -0
- package/lib/fivePlugins/CameraMovementPlugin/typings.js +25 -0
- package/lib/fivePlugins/ModelTVVideoPlugin/index.d.ts +20 -0
- package/lib/fivePlugins/ModelTVVideoPlugin/index.js +305 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.js +13 -0
- package/lib/react/index.d.ts +42 -0
- package/lib/react/index.js +120 -0
- package/lib/shared-utils/Preloader.d.ts +6 -0
- package/lib/shared-utils/Preloader.js +51 -0
- package/lib/shared-utils/animationFrame/BetterTween.d.ts +11 -0
- package/lib/shared-utils/animationFrame/BetterTween.js +102 -0
- package/lib/shared-utils/animationFrame/index.d.ts +15 -0
- package/lib/shared-utils/animationFrame/index.js +68 -0
- package/lib/shared-utils/animationFrame/tween.d.ts +75 -0
- package/lib/shared-utils/animationFrame/tween.js +76 -0
- package/lib/typings/VreoUnit.d.ts +204 -0
- package/lib/typings/VreoUnit.js +65 -0
- package/package.json +55 -0
- package/resources/Player/App.tsx +57 -0
- package/resources/Player/Controller.ts +154 -0
- package/resources/Player/hooks.ts +28 -0
- package/resources/Player/index.tsx +115 -0
- package/resources/Player/modules/Drawer/index.tsx +40 -0
- package/resources/Player/modules/VideoAgent/VideoAgentMesh.ts +202 -0
- package/resources/Player/modules/VideoAgent/VideoAgentScene.ts +38 -0
- package/resources/Player/modules/VideoAgent/index.tsx +31 -0
- package/resources/Player/modules/keyframes/CameraMovement/index.tsx +33 -0
- package/resources/Player/modules/keyframes/InfoPanel/index.tsx +52 -0
- package/resources/Player/modules/keyframes/ModelVideo/index.tsx +44 -0
- package/resources/Player/modules/keyframes/PanoEffect/index.tsx +99 -0
- package/resources/Player/modules/keyframes/PanoEffect/lineAnime.ts +31 -0
- package/resources/Player/modules/keyframes/PanoTag/index.tsx +127 -0
- package/resources/Player/modules/keyframes/PanoTextLabel/index.tsx +65 -0
- package/resources/Player/modules/keyframes/Prompter/index.tsx +65 -0
- package/resources/Player/modules/keyframes/UpdateVRPanorama/index.tsx +36 -0
- package/resources/Player/modules/keyframes/VideoEffect/index.tsx +115 -0
- package/resources/Player/typings.ts +15 -0
- package/resources/fivePlugins/CameraMovementPlugin/index.ts +203 -0
- package/resources/fivePlugins/CameraMovementPlugin/typings.ts +57 -0
- package/resources/fivePlugins/ModelTVVideoPlugin/index.ts +278 -0
- package/resources/index.ts +1 -0
- package/resources/react/index.tsx +95 -0
- package/resources/shared-utils/Preloader.ts +35 -0
- package/resources/shared-utils/animationFrame/BetterTween.ts +33 -0
- package/resources/shared-utils/animationFrame/index.ts +48 -0
- package/resources/shared-utils/animationFrame/tween.ts +51 -0
- package/resources/typings/VreoUnit.ts +225 -0
- package/stylesheets/default.css +497 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2021 BEIKE REALSEE TECHNOLOGY (HK) LIMITED
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,465 @@
|
|
|
1
|
+
# @realsee/vreo
|
|
2
|
+
|
|
3
|
+
Vreo (VR Video 缩写) 是基于如视三维渲染引擎 [Five](https://unpkg.com/@realsee/five/docs/index.html) 和 用户界面构建库 [React](https://reactjs.org/) 实现的如视 3D 空间剧本播放器。
|
|
4
|
+
|
|
5
|
+
## 特性
|
|
6
|
+
|
|
7
|
+
- 相机运镜:支持 3D 空间全景游走、旋转、分镜切换等类似于电影运镜的效果。
|
|
8
|
+
- 定制模块:提供弹幕提词、全景标签、视频广告、空间文本等模块定制能力。
|
|
9
|
+
- 内置特效:提供全景特效、视频特效、户改动画、模型特效等丰富动态效果。
|
|
10
|
+
- 独特的虚拟形象渲染能力:支持用户在 Web 页面模拟虚拟形象,配合语音讲解、相机运镜和定制特效,可实现智能化讲房功能。
|
|
11
|
+
|
|
12
|
+
> 访问 [Vreo Demo](https://vrlab-static.ljcdn.com/release/web/vreo/index.html?v=1) 体验功能。
|
|
13
|
+
|
|
14
|
+
## 安装说明
|
|
15
|
+
|
|
16
|
+
推荐使用 `npm` 或 `yarn` 的方式进行安装。由于 `@realsee/vreo` 依赖 [Five](https://unpkg.com/@realsee/five/docs/index.html) 和 [React](https://reactjs.org/) ,请务必同时安装相关依赖:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
$ npm install @realsee/vreo @realsee/five react react-dom --save
|
|
20
|
+
# or
|
|
21
|
+
$ yarn add @realsee/vreo @realsee/five react react-dom
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## 快速上手
|
|
25
|
+
|
|
26
|
+
```jsx
|
|
27
|
+
import * as React from 'react'
|
|
28
|
+
import { Five } from '@realsee/five'
|
|
29
|
+
import { Player } from '@realsee/vreo'
|
|
30
|
+
|
|
31
|
+
// 创建 Five 实例
|
|
32
|
+
const five = new Five({
|
|
33
|
+
/* Five 配置项 */
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
// 创建 Player 实例
|
|
37
|
+
const vreoplayer = new Player(five)
|
|
38
|
+
|
|
39
|
+
// 异步请求剧本数据
|
|
40
|
+
const vreoUnit = await fetch('api/**/**')
|
|
41
|
+
|
|
42
|
+
// 加载剧本数据(剧本数据见下文)
|
|
43
|
+
vreoplayer.load(vreoUnit)
|
|
44
|
+
|
|
45
|
+
// 播放
|
|
46
|
+
vreoplayer.play()
|
|
47
|
+
|
|
48
|
+
// 暂停
|
|
49
|
+
vreoplayer.pause()
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
组件样式入样式:
|
|
53
|
+
|
|
54
|
+
```css
|
|
55
|
+
@import '@realsee/vreo/stylesheets/default.css';
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## React Context & Hooks 模式使用
|
|
59
|
+
|
|
60
|
+
Vreo 支持 [React Context](https://reactjs.org/docs/context.html) 与 [Hooks](https://reactjs.org/docs/hooks-intro.html) 相配合的模式使用,简单样例如下:
|
|
61
|
+
|
|
62
|
+
```jsx
|
|
63
|
+
import * as React from 'react'
|
|
64
|
+
import * as ReactDOM from 'react-dom'
|
|
65
|
+
import { Five, Work, parseWork } from '@realsee/five'
|
|
66
|
+
import { createFiveProvider, FiveCanvas } from '@realsee/five/react'
|
|
67
|
+
import { VreoProvider, useVreoAction } from '@realsee/vreo/react'
|
|
68
|
+
|
|
69
|
+
// 创建 FiveProvider
|
|
70
|
+
const FiveProvider = createFiveProvider({
|
|
71
|
+
/* Five 配置项 */
|
|
72
|
+
})
|
|
73
|
+
|
|
74
|
+
// 播放组件
|
|
75
|
+
const PlayButton: React.FC = () => {
|
|
76
|
+
const { load, play, pause } = useVreoAction()
|
|
77
|
+
|
|
78
|
+
return (
|
|
79
|
+
<button
|
|
80
|
+
onClick={async () => {
|
|
81
|
+
// 获取讲房数据
|
|
82
|
+
const vreoUnit = await fetch('api/**/**')
|
|
83
|
+
// 载入数据
|
|
84
|
+
await load(vreoUnit)
|
|
85
|
+
// 播放
|
|
86
|
+
play()
|
|
87
|
+
// 暂停
|
|
88
|
+
pause()
|
|
89
|
+
}}
|
|
90
|
+
>
|
|
91
|
+
讲解
|
|
92
|
+
</button>
|
|
93
|
+
)
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const App: React.FC = () => {
|
|
97
|
+
return (
|
|
98
|
+
<FiveProvider initialWork={work}>
|
|
99
|
+
<FiveCanvas width={width} height={height} />
|
|
100
|
+
<VreoProvider>
|
|
101
|
+
{/* React 渲染的其他模块 */}
|
|
102
|
+
<PlayButton />
|
|
103
|
+
</VreoProvider>
|
|
104
|
+
</FiveProvider>
|
|
105
|
+
)
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
ReactDOM.render(<App></App>, document.getElementById('app'))
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## 剧本数据结构
|
|
112
|
+
|
|
113
|
+
### 结构描述
|
|
114
|
+
|
|
115
|
+
**VreoUnit** 是剧本数据结构的最小单元,用以描述音视频、关键帧序列等信息。
|
|
116
|
+
|
|
117
|
+
**VreoUnit** 数据结构样例如下:
|
|
118
|
+
|
|
119
|
+
```json
|
|
120
|
+
{
|
|
121
|
+
"categoryId": "257ac7a8-b00a-4a1b-88b8-76f93362c0dc",
|
|
122
|
+
"categoryText": "讲房源户型",
|
|
123
|
+
"video": {
|
|
124
|
+
"duration": 106278,
|
|
125
|
+
"start": 0,
|
|
126
|
+
"end": 106278,
|
|
127
|
+
"url": "//url-host/***/xxx.mp4"
|
|
128
|
+
},
|
|
129
|
+
"keyframes": [
|
|
130
|
+
{
|
|
131
|
+
"uuid": "ac70621b-4e00-442e-311c-befb5bd3f87f",
|
|
132
|
+
"type": "PanoTextLabel",
|
|
133
|
+
"start": 27060,
|
|
134
|
+
"end": 42351,
|
|
135
|
+
"parsed": false,
|
|
136
|
+
"data": {
|
|
137
|
+
"text": "戏剧人生",
|
|
138
|
+
"vertex": {
|
|
139
|
+
"x": -0.8879207391906447,
|
|
140
|
+
"y": 0.3829881941156301,
|
|
141
|
+
"z": -1.8068334368800785
|
|
142
|
+
},
|
|
143
|
+
"fontSize": 16
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
"uuid": "ec1bbe11-ffee-4fe1-5823-46b6cad4e7d8",
|
|
148
|
+
"type": "ModelVideo",
|
|
149
|
+
"start": 17452,
|
|
150
|
+
"end": 74901,
|
|
151
|
+
"parsed": false,
|
|
152
|
+
"data": {
|
|
153
|
+
"videoSrc": "//url-host/release/web/videos/tv_ads/360/009.mp4",
|
|
154
|
+
"videoPosterSrc": "//url-host/release/web/videos/posters/002.9203cf99.jpg",
|
|
155
|
+
"vertexs": [
|
|
156
|
+
{
|
|
157
|
+
"x": 0.07203829865103632,
|
|
158
|
+
"y": 0.8215782650149405,
|
|
159
|
+
"z": -1.7994856093044471
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
"x": 0.08971605109132826,
|
|
163
|
+
"y": -0.2930481300912484,
|
|
164
|
+
"z": -1.798372293401237
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
"x": 2.367235599574914,
|
|
168
|
+
"y": -0.296526676652792,
|
|
169
|
+
"z": -1.7934272967593008
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
"x": 2.3601990173854315,
|
|
173
|
+
"y": 0.8691239478108612,
|
|
174
|
+
"z": -1.7949685793090848
|
|
175
|
+
}
|
|
176
|
+
]
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
"uuid": "f9245b1b-ca8d-4a6c-5616-d53cd9cf8c3c",
|
|
181
|
+
"type": "PanoTag",
|
|
182
|
+
"start": 988,
|
|
183
|
+
"end": 69803,
|
|
184
|
+
"parsed": false,
|
|
185
|
+
"data": {
|
|
186
|
+
"text": "一蓑烟雨任平生",
|
|
187
|
+
"vertex": {
|
|
188
|
+
"x": 3.4119340861387304,
|
|
189
|
+
"y": 0.1283617853353691,
|
|
190
|
+
"z": -0.6533418002816742
|
|
191
|
+
},
|
|
192
|
+
"type": "Image",
|
|
193
|
+
"imgUrl": "//url-host/release/web/cat_music.f68fb9bb.gif"
|
|
194
|
+
}
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
"uuid": "d16138f3-fad1-412e-2df0-f66b61e0b38e",
|
|
198
|
+
"type": "PanoEffect",
|
|
199
|
+
"start": 2598,
|
|
200
|
+
"end": 7955,
|
|
201
|
+
"parsed": false,
|
|
202
|
+
"data": {
|
|
203
|
+
"twoVertexs": [
|
|
204
|
+
{
|
|
205
|
+
"x": 0.04138994383630945,
|
|
206
|
+
"y": -1.323667318114752,
|
|
207
|
+
"z": 2.7873723200461096
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
"x": -2.804123324007684,
|
|
211
|
+
"y": -1.3249364005914073,
|
|
212
|
+
"z": 3.068840643805892
|
|
213
|
+
}
|
|
214
|
+
],
|
|
215
|
+
"effect": "Distance"
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
]
|
|
219
|
+
}
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
**ProofUnit** 的字段说明:
|
|
223
|
+
|
|
224
|
+
- `categoryId`、`categoryText`: 讲解的类别标识符和描述。
|
|
225
|
+
- `video`: 虚拟视频人物视频素材。
|
|
226
|
+
|
|
227
|
+
- `duration`: 视频长度。
|
|
228
|
+
- `start`: 开始时间戳。
|
|
229
|
+
- `end`: 结束时间戳。
|
|
230
|
+
- `url`: 视频 CDN 地址。
|
|
231
|
+
|
|
232
|
+
> 注意事项:**视频素材必须是绿幕背景**。
|
|
233
|
+
|
|
234
|
+
- `keyframes`:关键帧集合。
|
|
235
|
+
|
|
236
|
+
- `uuid`: 关键帧 `uuid`。
|
|
237
|
+
- `type`: 关键帧类别枚举,详见下文 **剧本关键帧** 部分。
|
|
238
|
+
- `start`: 触发时间戳。
|
|
239
|
+
- `end`: 结束时间戳。
|
|
240
|
+
- `parsed`: 解析状态。
|
|
241
|
+
- `data`: 当前关键帧类别数据依赖。
|
|
242
|
+
|
|
243
|
+
> **如何获取剧本数据?**
|
|
244
|
+
> 剧本服务及剧本编辑器公开版本尚在开发中,预计 2022 年 2 月份中旬发布,敬请期待。
|
|
245
|
+
|
|
246
|
+
### 关键帧说明
|
|
247
|
+
|
|
248
|
+
Vreo 剧本行为是按照剧本关键帧来执行的,即根据音视频播放的时间序列命中关键帧后,按照关键帧的类型执行相机运镜、全景标签、模型特效等动作。
|
|
249
|
+
|
|
250
|
+
> 目前支持九种类型剧本关键帧,后续会不断完善及添加新的剧本关键帧行为。
|
|
251
|
+
|
|
252
|
+
Vreo 内置了每一个剧本关键帧的 UI 动作行为,通过 `vreoplayer.on()` 可监听到相应的剧本关键帧的命中时机,并按需添加业务逻辑。
|
|
253
|
+
|
|
254
|
+
### 剧本关键帧
|
|
255
|
+
|
|
256
|
+
#### 相机运镜
|
|
257
|
+
|
|
258
|
+
**相机运镜** 控制相机实现镜头位移、旋转、模态切换等模拟如视 3D 空间漫游的能力。
|
|
259
|
+
|
|
260
|
+
```ts
|
|
261
|
+
type CameraMovementData = {
|
|
262
|
+
effect: CameraMovementEffect // 运镜效果
|
|
263
|
+
mode: Mode // Five.Mode
|
|
264
|
+
panoIndex: number // 目标点位
|
|
265
|
+
loop?: boolean // 是否循环
|
|
266
|
+
rotateSpeed?: number // 旋转速度
|
|
267
|
+
rotation?: Rotation // 旋转方向
|
|
268
|
+
} & Partial<Pose> // Partial<Pose> 视角信息
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
#### 弹幕提词
|
|
272
|
+
|
|
273
|
+
**弹幕提词** 提供语音字幕文本,多用于强调某一句文本。
|
|
274
|
+
|
|
275
|
+
```ts
|
|
276
|
+
type PrompterData = {
|
|
277
|
+
text: string // 文本,建议长度 32(汉字) 以内
|
|
278
|
+
}
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
#### 空间文本
|
|
282
|
+
|
|
283
|
+
**空间文本** 在如视 3D 模型空间中某一个三维坐标点上展示的一段文本。
|
|
284
|
+
|
|
285
|
+
```ts
|
|
286
|
+
type PanoTextLabelData = {
|
|
287
|
+
text: string // 空间文本
|
|
288
|
+
vertex: Vertex // 三维坐标点
|
|
289
|
+
fontSize?: number // 文本字体大小,默认 16px
|
|
290
|
+
}
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
#### 信息面板
|
|
294
|
+
|
|
295
|
+
**信息面板** 以弹框或抽屉面板的形式展示图片、音视频等素材内容。
|
|
296
|
+
|
|
297
|
+
```ts
|
|
298
|
+
type InfoPanelData = {
|
|
299
|
+
type: InfoPanelTypeEnum // 面板类型
|
|
300
|
+
url: string // 素材静态资源地址
|
|
301
|
+
}
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
#### 全景标签
|
|
305
|
+
|
|
306
|
+
**全景标签** 在如视 3D 空间全景游走模态下展示文本、图片、视频等标签内容。全景标签的出现会附带一个生长动画。
|
|
307
|
+
|
|
308
|
+
```ts
|
|
309
|
+
enum PanoTagEnum { // 标签类型枚举
|
|
310
|
+
Text = 'Text',
|
|
311
|
+
Image = 'Image',
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
type PanoTagData = {
|
|
315
|
+
type: PanoTagEnum // 标签类型
|
|
316
|
+
text: string // 文本
|
|
317
|
+
vertex: Vertex // 标签在全景游走模态中的三维坐标点
|
|
318
|
+
imgUrl?: string // 图片资源地址
|
|
319
|
+
}
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
#### 全景特效
|
|
323
|
+
|
|
324
|
+
**全景特效** 指在如视 3D 空间全景游走模态下执行某些特效。
|
|
325
|
+
|
|
326
|
+
目前仅支持测量长度的特效。比如,在全景游走模态下标注出窗户的宽度信息。
|
|
327
|
+
|
|
328
|
+
```ts
|
|
329
|
+
enum PanoEffectEnum { // 特效枚举
|
|
330
|
+
// 两点距离
|
|
331
|
+
Distance = 'Distance',
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
type PanoEffectData = {
|
|
335
|
+
effect: PanoEffectEnum // 特效类型
|
|
336
|
+
twoVertexs: [Vertex, Vertex] // 两个点坐标值
|
|
337
|
+
}
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
#### 模型特效
|
|
341
|
+
|
|
342
|
+
> 规划中,敬请期待。
|
|
343
|
+
|
|
344
|
+
#### 户改动画
|
|
345
|
+
|
|
346
|
+
> 规划中,敬请期待。
|
|
347
|
+
|
|
348
|
+
#### 更换全景
|
|
349
|
+
|
|
350
|
+
**更换全景** 可以动态修改某个点位的全景图片。
|
|
351
|
+
|
|
352
|
+
```ts
|
|
353
|
+
export type UpdateVRPanoramaData = {
|
|
354
|
+
panoIndex: number // 点位
|
|
355
|
+
images: WorkCubeImage // 全景贴图
|
|
356
|
+
}
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
比如,您可以拍摄某个房间开灯与关灯两个场景的全景,通过动态切换可以营造出全景中开灯、关灯的效果。
|
|
360
|
+
|
|
361
|
+
同样的,如果您在同一个位置分别拍摄了早晨、上午、中午、下午、傍晚、深夜的全景图片,就可以营造出该位置在一天中不同时间段的光照效果。
|
|
362
|
+
|
|
363
|
+
#### 视频广告
|
|
364
|
+
|
|
365
|
+
**视频广告** 如果在如视 3D 空间模型中有电视、显示器、壁画等这类物品,可以在这些矩形区域播放一段视频。
|
|
366
|
+
|
|
367
|
+
```ts
|
|
368
|
+
// 四个顶点元组
|
|
369
|
+
type QuadrangleVertexs = [Vertex, Vertex, Vertex, Vertex]
|
|
370
|
+
|
|
371
|
+
type ModelVideoData = {
|
|
372
|
+
videoSrc: string // 视频素材
|
|
373
|
+
videoPosterSrc: string // 视频封面
|
|
374
|
+
vertexs: QuadrangleVertexs // 视频映射在模型中的坐标点
|
|
375
|
+
}
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
#### 视频特效
|
|
379
|
+
|
|
380
|
+
**视频特效** 是基于视频实现的动画效果,视频的每一帧都与 VR 全景位置完全贴合。
|
|
381
|
+
|
|
382
|
+
某些变形动画(比如开冰箱动作这类)可以采用视频特效来实现。
|
|
383
|
+
|
|
384
|
+
```ts
|
|
385
|
+
type VideoEffectData = {
|
|
386
|
+
videoSrc: string // 视频地址
|
|
387
|
+
panoIndex: number // 所处点位
|
|
388
|
+
fov: number // 镜头远近
|
|
389
|
+
direction?: Vertex // 方向向量: {x, y, z} 形式
|
|
390
|
+
vector?: Pick<Pose, 'longitude' | 'latitude'> // 方向向量: 向量坐标
|
|
391
|
+
}
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
### 自定义关键帧行为
|
|
395
|
+
|
|
396
|
+
Vreo 中的关键帧行为是内置的,但如果您有强烈的诸如统一 UI 风格类的诉求,不想使用内置剧本逻辑,也可以通过 `new Player(five, {keyframeMap: {PanoTag: false}})` 来禁用内置关键帧解析,然后通过监听关键帧触发事件来补充您自己的剧本 UI 行为。
|
|
397
|
+
|
|
398
|
+
比如,禁用全景标签的解析:
|
|
399
|
+
|
|
400
|
+
```ts
|
|
401
|
+
const vreoplayer = new Player(five, {
|
|
402
|
+
keyframeMap: {
|
|
403
|
+
PanoTag: false /* 禁用了全景标签的解析 */,
|
|
404
|
+
},
|
|
405
|
+
})
|
|
406
|
+
|
|
407
|
+
const callback = (keyframe: VreoKeyframe) => {
|
|
408
|
+
/* 您自己的业务逻辑:全景标签的模块 */
|
|
409
|
+
}
|
|
410
|
+
// 添加监听
|
|
411
|
+
vreoplayer.on(VreoKeyframeEnum.PanoTag, callback)
|
|
412
|
+
// 关闭监听
|
|
413
|
+
vreoplayer.off(VreoKeyframeEnum.PanoTag, callback)
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
目前仅 DOM 相关的剧本关键帧支持自定义,与 3D 空间模型相关的内容(如:运镜、特效等)尚不支持用户自定义,请采用内置方案。
|
|
417
|
+
|
|
418
|
+
## 注意事项
|
|
419
|
+
|
|
420
|
+
浏览器对视频自动播放有严格的限制(播放行为必须由用户触发),`@realsee/vreo` 内部已经最大限度规避了浏览器对视频自动播放的限制。
|
|
421
|
+
|
|
422
|
+
但是规避 [微信浏览器中音视频自动播放限制](https://developers.weixin.qq.com/community/develop/doc/000e640d77cfa001132a6cb8456c01) 需要调用 [微信 JS-SDK](https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html) 触发`WeixinJSBridgeReady`事件后才能实现。
|
|
423
|
+
|
|
424
|
+
虽然 `@realsee/vreo` 并不依赖 [微信 JS-SDK](https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html) ,但您可以提前创建`HTMLVideoElement`实例,然后再在初始化`vreoplayer`实例时通过配置项指定 `HTMLVideoElement`实例,可参考:
|
|
425
|
+
|
|
426
|
+
```ts
|
|
427
|
+
// 创建 HTMLVideoElement 实例
|
|
428
|
+
const creatVideo = (): HTMLVideoElement => {
|
|
429
|
+
const video = document.createElement('video')
|
|
430
|
+
|
|
431
|
+
video.setAttribute('playsinline', 'true')
|
|
432
|
+
video.setAttribute('webkit-playsinline', 'true')
|
|
433
|
+
video.setAttribute('autoplay', 'true')
|
|
434
|
+
|
|
435
|
+
return video
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
// 提前创建 Video
|
|
439
|
+
const videoEffect = creatVideo()
|
|
440
|
+
const modelTVVideo = creatVideo()
|
|
441
|
+
|
|
442
|
+
// 微信限制:需在 WeixinJSBridgeReady 回调中触发一次
|
|
443
|
+
document.addEventListener(
|
|
444
|
+
'WeixinJSBridgeReady',
|
|
445
|
+
() => {
|
|
446
|
+
videoEffect.play()
|
|
447
|
+
modelTVVideo.play()
|
|
448
|
+
},
|
|
449
|
+
false
|
|
450
|
+
)
|
|
451
|
+
|
|
452
|
+
// 创建 Player 实例
|
|
453
|
+
const vreoplayer = new Player(five, {
|
|
454
|
+
videos: {
|
|
455
|
+
videoEffect, // 视频特效 时依赖的 HTMLVideoElement
|
|
456
|
+
modelTVVideo, // 视频广告 时依赖的 HTMLVideoElement
|
|
457
|
+
},
|
|
458
|
+
})
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
这样,在微信浏览器或微信小程序 `WebView` 中也能正常使用自动播效果。
|
|
462
|
+
|
|
463
|
+
## API 文档
|
|
464
|
+
|
|
465
|
+
详细的 API 文档请参考:[unpkg.com/@realsee/vreo](https://unpkg.com/@realsee/vreo/docs/index.html) 。
|
package/docs/.nojekyll
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
body {
|
|
2
|
+
font-family: 'Trebuchet MS', 'Lucida Sans Unicode', 'Lucida Grande', 'Lucida Sans', Arial, sans-serif;
|
|
3
|
+
font-size: 14px;
|
|
4
|
+
color: #2e2e2e;
|
|
5
|
+
}
|
|
6
|
+
blockquote {
|
|
7
|
+
color: #7f8fa4;
|
|
8
|
+
padding: 8px 12px;
|
|
9
|
+
margin: 16px 0;
|
|
10
|
+
border-left: 3px solid #eaeaea;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
blockquote p {
|
|
14
|
+
color: #7f8fa4 !important;
|
|
15
|
+
font-size: inherit;
|
|
16
|
+
line-height: 1.5;
|
|
17
|
+
margin: 0 !important;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.tsd-typography {
|
|
21
|
+
font-size: 14px;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.tsd-typography h4 {
|
|
25
|
+
line-height: 2;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.hljs {
|
|
29
|
+
background-color: transparent;
|
|
30
|
+
font-family: monospace;
|
|
31
|
+
font-size: 0.75rem;
|
|
32
|
+
}
|
|
33
|
+
code {
|
|
34
|
+
font-size: 12px;
|
|
35
|
+
background-color: rgb(96 125 139 / 10%);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
pre {
|
|
39
|
+
background-color: rgb(205 220 57 / 8%);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
p {
|
|
43
|
+
line-height: 1.5;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
a {
|
|
47
|
+
color: #3832cf;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
a:hover {
|
|
51
|
+
color: darkred;
|
|
52
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
--light-hl-0: #000000;
|
|
3
|
+
--dark-hl-0: #D4D4D4;
|
|
4
|
+
--light-hl-1: #008000;
|
|
5
|
+
--dark-hl-1: #6A9955;
|
|
6
|
+
--light-hl-2: #AF00DB;
|
|
7
|
+
--dark-hl-2: #C586C0;
|
|
8
|
+
--light-hl-3: #0000FF;
|
|
9
|
+
--dark-hl-3: #569CD6;
|
|
10
|
+
--light-hl-4: #001080;
|
|
11
|
+
--dark-hl-4: #9CDCFE;
|
|
12
|
+
--light-hl-5: #A31515;
|
|
13
|
+
--dark-hl-5: #CE9178;
|
|
14
|
+
--light-hl-6: #0070C1;
|
|
15
|
+
--dark-hl-6: #4FC1FF;
|
|
16
|
+
--light-hl-7: #795E26;
|
|
17
|
+
--dark-hl-7: #DCDCAA;
|
|
18
|
+
--light-hl-8: #267F99;
|
|
19
|
+
--dark-hl-8: #4EC9B0;
|
|
20
|
+
--light-hl-9: #800000;
|
|
21
|
+
--dark-hl-9: #808080;
|
|
22
|
+
--light-hl-10: #800000;
|
|
23
|
+
--dark-hl-10: #569CD6;
|
|
24
|
+
--light-hl-11: #FF0000;
|
|
25
|
+
--dark-hl-11: #9CDCFE;
|
|
26
|
+
--light-hl-12: #000000FF;
|
|
27
|
+
--dark-hl-12: #D4D4D4;
|
|
28
|
+
--light-hl-13: #0451A5;
|
|
29
|
+
--dark-hl-13: #9CDCFE;
|
|
30
|
+
--light-hl-14: #098658;
|
|
31
|
+
--dark-hl-14: #B5CEA8;
|
|
32
|
+
--light-code-background: #FFFFFF;
|
|
33
|
+
--dark-code-background: #1E1E1E;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
@media (prefers-color-scheme: light) { :root {
|
|
37
|
+
--hl-0: var(--light-hl-0);
|
|
38
|
+
--hl-1: var(--light-hl-1);
|
|
39
|
+
--hl-2: var(--light-hl-2);
|
|
40
|
+
--hl-3: var(--light-hl-3);
|
|
41
|
+
--hl-4: var(--light-hl-4);
|
|
42
|
+
--hl-5: var(--light-hl-5);
|
|
43
|
+
--hl-6: var(--light-hl-6);
|
|
44
|
+
--hl-7: var(--light-hl-7);
|
|
45
|
+
--hl-8: var(--light-hl-8);
|
|
46
|
+
--hl-9: var(--light-hl-9);
|
|
47
|
+
--hl-10: var(--light-hl-10);
|
|
48
|
+
--hl-11: var(--light-hl-11);
|
|
49
|
+
--hl-12: var(--light-hl-12);
|
|
50
|
+
--hl-13: var(--light-hl-13);
|
|
51
|
+
--hl-14: var(--light-hl-14);
|
|
52
|
+
--code-background: var(--light-code-background);
|
|
53
|
+
} }
|
|
54
|
+
|
|
55
|
+
@media (prefers-color-scheme: dark) { :root {
|
|
56
|
+
--hl-0: var(--dark-hl-0);
|
|
57
|
+
--hl-1: var(--dark-hl-1);
|
|
58
|
+
--hl-2: var(--dark-hl-2);
|
|
59
|
+
--hl-3: var(--dark-hl-3);
|
|
60
|
+
--hl-4: var(--dark-hl-4);
|
|
61
|
+
--hl-5: var(--dark-hl-5);
|
|
62
|
+
--hl-6: var(--dark-hl-6);
|
|
63
|
+
--hl-7: var(--dark-hl-7);
|
|
64
|
+
--hl-8: var(--dark-hl-8);
|
|
65
|
+
--hl-9: var(--dark-hl-9);
|
|
66
|
+
--hl-10: var(--dark-hl-10);
|
|
67
|
+
--hl-11: var(--dark-hl-11);
|
|
68
|
+
--hl-12: var(--dark-hl-12);
|
|
69
|
+
--hl-13: var(--dark-hl-13);
|
|
70
|
+
--hl-14: var(--dark-hl-14);
|
|
71
|
+
--code-background: var(--dark-code-background);
|
|
72
|
+
} }
|
|
73
|
+
|
|
74
|
+
body.light {
|
|
75
|
+
--hl-0: var(--light-hl-0);
|
|
76
|
+
--hl-1: var(--light-hl-1);
|
|
77
|
+
--hl-2: var(--light-hl-2);
|
|
78
|
+
--hl-3: var(--light-hl-3);
|
|
79
|
+
--hl-4: var(--light-hl-4);
|
|
80
|
+
--hl-5: var(--light-hl-5);
|
|
81
|
+
--hl-6: var(--light-hl-6);
|
|
82
|
+
--hl-7: var(--light-hl-7);
|
|
83
|
+
--hl-8: var(--light-hl-8);
|
|
84
|
+
--hl-9: var(--light-hl-9);
|
|
85
|
+
--hl-10: var(--light-hl-10);
|
|
86
|
+
--hl-11: var(--light-hl-11);
|
|
87
|
+
--hl-12: var(--light-hl-12);
|
|
88
|
+
--hl-13: var(--light-hl-13);
|
|
89
|
+
--hl-14: var(--light-hl-14);
|
|
90
|
+
--code-background: var(--light-code-background);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
body.dark {
|
|
94
|
+
--hl-0: var(--dark-hl-0);
|
|
95
|
+
--hl-1: var(--dark-hl-1);
|
|
96
|
+
--hl-2: var(--dark-hl-2);
|
|
97
|
+
--hl-3: var(--dark-hl-3);
|
|
98
|
+
--hl-4: var(--dark-hl-4);
|
|
99
|
+
--hl-5: var(--dark-hl-5);
|
|
100
|
+
--hl-6: var(--dark-hl-6);
|
|
101
|
+
--hl-7: var(--dark-hl-7);
|
|
102
|
+
--hl-8: var(--dark-hl-8);
|
|
103
|
+
--hl-9: var(--dark-hl-9);
|
|
104
|
+
--hl-10: var(--dark-hl-10);
|
|
105
|
+
--hl-11: var(--dark-hl-11);
|
|
106
|
+
--hl-12: var(--dark-hl-12);
|
|
107
|
+
--hl-13: var(--dark-hl-13);
|
|
108
|
+
--hl-14: var(--dark-hl-14);
|
|
109
|
+
--code-background: var(--dark-code-background);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.hl-0 { color: var(--hl-0); }
|
|
113
|
+
.hl-1 { color: var(--hl-1); }
|
|
114
|
+
.hl-2 { color: var(--hl-2); }
|
|
115
|
+
.hl-3 { color: var(--hl-3); }
|
|
116
|
+
.hl-4 { color: var(--hl-4); }
|
|
117
|
+
.hl-5 { color: var(--hl-5); }
|
|
118
|
+
.hl-6 { color: var(--hl-6); }
|
|
119
|
+
.hl-7 { color: var(--hl-7); }
|
|
120
|
+
.hl-8 { color: var(--hl-8); }
|
|
121
|
+
.hl-9 { color: var(--hl-9); }
|
|
122
|
+
.hl-10 { color: var(--hl-10); }
|
|
123
|
+
.hl-11 { color: var(--hl-11); }
|
|
124
|
+
.hl-12 { color: var(--hl-12); }
|
|
125
|
+
.hl-13 { color: var(--hl-13); }
|
|
126
|
+
.hl-14 { color: var(--hl-14); }
|
|
127
|
+
pre, code { background: var(--code-background); }
|