Skip to main content

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()拿到控制器,做playpausestopseek操作。

精灵图

在 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), 按照从左到右、从上到下一次排列。
clearAreatrue: 清理当前指定区域;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)

事件

参考 事件处理章节