RichSurface
RichSurface 是 3D 场景中的一个可交互部件,可在上面设置多媒体资源,SDK 内置的功能包括视频源、静态贴图、呼吸点、文本板。也是继承自 actor
Richsurface 由两个部分组成,一个是模型(Mesh),一个是媒体资源(mediaSource)。通过特定接口,可以给模型设定任意符合规范的媒体资源。
模型部分
实例化 RichSurface 和其他 Actor 一致。
import { RichSurface } from '@xverse/core'
const surface = world.spawn(RichSurface)
模型和媒体资源初始化
可以通过 create
方法,初始化一个任意媒体类型的 RichSurface
,指定模型类型和配置参数之后,create
方法内部会生成对应类型的媒体资源,并设置到一个新建的 richsurface 模型上。
媒体资源全部继承自基类XMediaSource
,目前实现的媒体资源包括
媒体资源 | 说明 |
---|---|
XVideoSource | 视频类媒体资源 |
XStaticTextureSource | 静态图资源 |
XTextSource | 文本资源 |
XSpriteImgSource | 精灵图资源 |
下面代码描述了生成一个静态图资源,并设置到一个 richsurface 模型上的过程
//EMediaSourceType 包括上述四种资源类型
import { RichSurface, EMediaSourceType } from '@xverse/core'
const surface = world.spawn(RichSurface)
//richsurface需要挂载的模型
const addMeshOption = {
defaultMeshOption: {
type: EDefaultMeshType.Plane,
position: point?.point.position,
rotation: point?.point.rotation,
width: 2 * 100,
height: 2 * 100,
},
}
//richsurface挂载的富媒体资源
const media = 'https://static.xverse.cn/playground/demo.jpg'
//媒体参数
const mediaOptions = {
fps: fps,
lifeTime: lifeTime,
spriteWidthNumber: spriteWidthNumber,
spriteHeightNumber: spriteHeightNumber,
}
surface.create({
type: EMediaSourceType.XStaticTextureSource,
mediaData: media,
addMeshOption,
mediaOptions,
billboardMode: EBillboardMode.All,
})
改变 richsurface 绑定的媒体资源及其内容
import { RichSurface,EMediaSourceType} from '@xverse/core'
const surface = world.spawn(RichSurface)
surface.create(...)
//richsurface挂载的富媒体资源
const media = 'https://static.xverse.cn/playground/demo.jpg'
//媒体资源参数
const options = {
mediaOptions: {
fps: fps,
lifeTime: lifeTime,
spriteWidthNumber: spriteWidthNumber,
spriteHeightNumber: spriteHeightNumber
}
}
interface IChangeOptions {
/**
* mediaSource类型
*/
changeType?: EMediaSourceType
/**
* mediaSource的选项
*/
mediaOptions?: IRichsurfaceTextureOption | ISpriteImgOptions | ITextSourceOption | IVideoOptions
/**
* 文本canvas的选项
* 当type为ITextSourceOption时需要设置
*/
textCanvasOptions?: ITextCanvasOption
}
/**
* 切换mediaSource和media
* 如果只传入mediaData则只切换media
* 传入options则判定类型有无改变,有改变就创建新的mediaSource并设置其media
* @param mediaData mediaData,IRichsurfaceTextureOption/ISpriteImgOptions对应url, ITextSourceOption对应文本,IVideoOptions对应videoElement
* @param options 选项,IChangeOptions类型
*/
surface.changeMediaSource(media, options)
事件监听
目前支持方法有 beginLoading
, beginOverlap
, beginPlay
, click
, doubleClick
,endLoading
, endOverlap
, endPlay
, longPress
, mouseEnter
, mouseLeave
, pointerDown
, pointerOut
, pointerUp
/**
* surface事件监听方法
*/
surface.on('click', (e) => {
// do something
})
静态贴图
在 new XStaticTextureSource
之后,使用setMedia(data: string)
设置静态图资源,此处的 data 可以是 base64、url、blob 等。静态图没有什么控制器,因此getController()
拿到的是 null
视频流
在 new XVideoSource
之后,使用setMedia(data: HTMLVideoElement)
设置 tv 资源。通过getController()
拿到控制器,做play
、pause
、stop
、seek
操作。
精灵图
在 new XSpriteImgSource
之后,使用setMedia(data: string, options: ISpriteImgOptions)
来设置精灵图资源,通过getController()
拿到精灵图控制器,主要为控制精灵图的播放play()
与暂停pause()
"每循环播放完一次"后会抛出onLoop
事件
在下面的代码中,创建一份精灵图媒体资源,并指定声明周期为 1s,闪烁频率 15fps,精灵图中的水平精灵数量与垂直精灵数量分别为 4 和 5。当设置声明周期为-1 时,会永久显示。 XSpriteImgSource 中每次播放完成所有序列帧之后,会触发回调, 参考下面的代码
//创建surface
const surface = world.spawn(RichSurface)
surface.create(.....)
// 添加回调,每次循环一次之后,就会触发
surface.getMediaSource().on('onLoop',()=>{
console.log('===> loop')
})
文字
在 new XTextSource
之后,首先需要使用init(option: ITextCanvasOption)
来做本文资源的初始化,此处主要设置文本绘制画面的大小、画面区域划分等信息。然后通过setMedia(data: string, options: ITextSourceOption)
来填写实际的文本内容。初始化只要做一次即可,之后的setMedia
可以执行多次,来完成文本更新等内容。文本的 demo 在 playground/src/simpleLevelDemo/test/demo_richsurface.ts 中 DemoCreateWordSource() 函数部分。
ITextCanvasOption
类型 | 说明 |
---|---|
width | 用于承载文字绘制区域的画布的宽(像素) |
height | 用于承载文字绘制区域的画布的高(像素) |
widthSlotNum | 画布区域水平均匀划分数量 |
heightSlotNum | 画布区域垂直均匀划分数量 |
之所以需要设置画布水平、垂直区域划分,是为了在同一块画布中,可以同时指定不同区域,绘制不同文字。
一些情况说明:
- 当设置背景图的大小,小于画布的宽高时,可能出现背景图只展示了一部分的问题;
- 当文字比较模糊时,需要增大画布的宽高,同时需要增大文字字体大小
- 当只增大画布宽高,不改变文字大小时,会发现文字相对于画布缩小了,原因是文字绘制是按照像素绘制,而不是比例绘制
ITextSourceOption
类型 | 说明 |
---|---|
currentSlot | 当前需要绘制文字的区域编号,从 0 开始,最大为 (widthSlotNum*heightSlotNum-1), 按照从左到右、从上到下一次排列。 |
clearArea | true: 清理当前指定区域;false:不清理,直接在现有区域中继续绘制 |
fontSize | 字体大小 |
font | 字体类型 |
color | 字体颜色 |
fontWeight | 字体粗细 |
backgroundUrl | 背景图片 |
通过 ITextSourceOption 中的 currentSlot 来指定当前绘制作用于哪个区域。背景图片会直接在整张画布中展示,而文字本身会在指定区域中绘制。
Billboard 模式
目前提供了 5 种模式,具体见文档中关于 EBillboardMode 的描述;
export enum EBillboardMode {
/**
* 只有X轴朝向相机
*/
X = "x",
/**
* 只有Y轴朝向相机
*/
Y = "y",
/**
* 只有Z轴朝向相机
*/
Z = "z",
/**
* 所有轴都朝向相机
*/
All = "all",
/**
* 关闭billboard
*/
None = "none",
}
下面表示在各个方向上,都开启 billboard
surface.rootComponent.billboardMode = EBillboardMode.All
通过create()
方法创建的 richsurface,可以自行设置 EBillboardMode
参数
AttachToActor
开发者可以选择将创建好的 RichSurface 附着到其他的 Actor 之上,比如 Avatar,实现一些自定义的组合。
可视距离
RichSurface
实例的 maxVisibleValue
属性可以获取和设置最大可视距离
RichSurface
实例的 minVisibleValue
属性可以获取和设置最小可视距离
可通过 world 实例上统一设置可视距离,使用方式如下
world.setVisibilityCullingDistance(min:number, max:number)
事件
参考 事件处理章节