# 使用

在Tx3d Engine中可以使用 @tx3d/webxrexperiment 包开发AR或VR应用。

注意

由于WebXR目前处于草案阶段,API还在不断的变化和更新。因此@tx3d/webxr包目前属于实验性质,后续也许会有较大的变更!!!

# 功能

使用@tx3d/webxr构建AR或VR应用时需要先验证浏览器是否支持WebXR,接下来创建XR管理器(XRManager)然后使用XR管理器进入AR或VR场景。

import { XRManager } from '@tx3d/webxr';

// 创建XR管理器
const xrManager = new XRManager( engine );
1
2
3
4

# 验证浏览器是否支持AR

使用XR管理器(XRManager)的isARAvailable静态接口验证浏览器是否支持AR。

import { XRManager } from '@tx3d/webxr';

// 验证浏览器是否支持AR
XRManager.isARAvailable().then( ( supported ) => {

    // 判断是否支持
    if ( supported ) {

        // TODO:支持处理

    } else {

        // TODO:不支持处理

    }

}, ( error ) => {

    // TODO:报错处理

} );
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 验证浏览器是否支持VR

使用XR管理器(XRManager)的isVRAvailable静态接口验证浏览器是否支持VR。

import { XRManager } from '@tx3d/webxr';

// 验证浏览器是否支持VR
XRManager.isVRAvailable().then( ( supported ) => {

    // 判断是否支持
    if ( supported ) {

        // TODO:支持处理

    } else {

        // TODO:不支持处理

    }

}, ( error ) => {

    // TODO:报错处理

} );
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 进入AR场景

使用XR管理器(XRManager)的enterAR接口进入AR场景。

// 进入AR场景
xrManager.enterAR( {

    referenceSpaceType: 'local-floor',
    requiredFeatures: [ 'local-floor', 'hit-test' ]

} ).then( () => {

    // TODO:渐入成功处理

}, ( error ) => {

    // TODO:进入失败处理

} );
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

提示

进入AR场景参数,详见WebXRParameters

# 进入VR场景

使用XR管理器(XRManager)的enterVR接口进入VR场景。

// 进入VR场景
xrManager.enterVR( {

    referenceSpaceType: 'local-floor'

} ).then( () => {

    // TODO:渐入成功处理

}, ( error ) => {

    // TODO:进入失败处理

} );
1
2
3
4
5
6
7
8
9
10
11
12
13
14

提示

进入VR场景参数,详见WebXRParameters

# 退出AR/VR场景

使用XR管理器(XRManager)的exit接口退出AR/VR场景。

// 退出AR/VR场景
xrManager.exit().then( () => {

    // TODO:退出成功处理

}, ( error ) => {

    // TODO:退出出错处理

} );
1
2
3
4
5
6
7
8
9
10

# 事件

XR管理器(XRManager)目前可监听的事件如下:

🌏 sessionstart:WebXR会话开始事件,会话建立时触发。

// 监听'sessionstart'事件
xrManager.addEventListener( 'sessionstart', ( event ) => {

    // TODO:响应'sessionstart'事件

} );

// 移除'sessionstart'事件监听器
xrManager.removeEventListener( 'sessionstart', listener );
1
2
3
4
5
6
7
8
9

🌏 sessionend: WebXR会话结束事件,会话关闭时触发。

// 监听'sessionend'事件
xrManager.addEventListener( 'sessionend', ( event ) => {

    // TODO:响应'sessionend'事件

} );

// 移除'sessionend'事件监听器
xrManager.removeEventListener( 'sessionend', listener );
1
2
3
4
5
6
7
8
9

# 输入

通过输入模块可以监听AR/VR的外部输入事件,当前包含以下三种类型输入:

🌏 TargetRay:目标射线输入,使用XR管理器(XRManager)的getTargetRayInput接口获取。

// 获取0号TargetRay输入
const input0 = xrManager.getTargetRayInput( 0 );

// 获取1号TargetRay输入
const input1 = xrManager.getTargetRayInput( 1 );
1
2
3
4
5

🌏 Grip:挤压式输入,使用XR管理器(XRManager)的getGripInput接口获取。

// 获取0号Grip输入
const input0 = xrManager.getGripInput( 0 );

// 获取1号Grip输入
const input1 = xrManager.getGripInput( 1 );
1
2
3
4
5

🌏 Hand:手势输入,使用XR管理器(XRManager)的getHandInput接口获取。

// 获取0号Hand输入
const input0 = xrManager.getHandInput( 0 );

// 获取1号Hand输入
const input1 = xrManager.getHandInput( 1 );
1
2
3
4
5

提示

1️⃣ 输入需要由相应的硬件设备支持,通常手机仅支持"TargetRay"输入,头盔和眼镜等设备可能会支持所有类型输入。
2️⃣ AR场景通常只需要获取0号输入,VR场景0号和1号输入可能都需要获取(通常0号对应左手,1号对应右手)。

# 输入事件

目前可监听的输入事件如下:

🌏 connected:输入连接事件,所有类型输入都可监听。

// 监听'connected'事件
input.addEventListener( 'connected', ( event ) => {

    // TODO:响应'connected'事件

} );

// 移除'connected'事件监听器
input.removeEventListener( 'connected', listener );
1
2
3
4
5
6
7
8
9

🌏 disconnected:输入断开事件,所有类型输入都可监听。

// 监听'disconnected'事件
input.addEventListener( 'disconnected', ( event ) => {

    // TODO:响应'disconnected'事件

} );

// 移除'disconnected'事件监听器
input.removeEventListener( 'disconnected', listener );
1
2
3
4
5
6
7
8
9

🌏 selectstart: 选择开始事件,所有类型输入都可监听。

// 监听'selectstart'事件
input.addEventListener( 'selectstart', ( event ) => {

    // TODO:响应'selectstart'事件

} );

// 移除'selectstart'事件监听器
input.removeEventListener( 'selectstart', listener );
1
2
3
4
5
6
7
8
9

🌏 selectend:选择结束事件,所有类型输入都可监听。

// 监听'selectend'事件
input.addEventListener( 'selectend', ( event ) => {

    // TODO:响应'selectend'事件

} );

// 移除'selectend'事件监听器
input.removeEventListener( 'selectend', listener );
1
2
3
4
5
6
7
8
9

🌏 select:选择事件,所有类型输入都可监听。

// 监听'select'事件
input.addEventListener( 'select', ( event ) => {

    // TODO:响应'select'事件

} );

// 移除'select'事件监听器
input.removeEventListener( 'select', listener );
1
2
3
4
5
6
7
8
9

🌏 squeezestart: 挤压开始事件,所有类型输入都可监听。

// 监听'squeezestart'事件
input.addEventListener( 'squeezestart', ( event ) => {

    // TODO:响应'squeezestart'事件

} );

// 移除'squeezestart'事件监听器
input.removeEventListener( 'squeezestart', listener );
1
2
3
4
5
6
7
8
9

🌏 squeezeend:挤压结束事件,所有类型输入都可监听。

// 监听'squeezeend'事件
input.addEventListener( 'squeezeend', ( event ) => {

    // TODO:响应'squeezeend'事件

} );

// 移除'squeezeend'事件监听器
input.removeEventListener( 'squeezeend', listener );
1
2
3
4
5
6
7
8
9

🌏 squeeze:挤压事件,所有类型输入都可监听。

// 监听'squeeze'事件
input.addEventListener( 'squeeze', ( event ) => {

    // TODO:响应'squeeze'事件

} );

// 移除'squeeze'事件监听器
input.removeEventListener( 'squeeze', listener );
1
2
3
4
5
6
7
8
9

🌏 pinchstart:pinching开始事件,仅"Hand"类型输入可以监听。

// 监听'pinchstart'事件
input.addEventListener( 'pinchstart', ( event ) => {

    // TODO:响应'pinchstart'事件

} );

// 移除'pinchstart'事件监听器
input.removeEventListener( 'pinchstart', listener );
1
2
3
4
5
6
7
8
9

🌏 pinchend:pinching结束事件,仅"Hand"类型输入可以监听。

// 监听'pinchend'事件
input.addEventListener( 'pinchend', ( event ) => {

    // TODO:响应'pinchend'事件

} );

// 移除'pinchend'事件监听器
input.removeEventListener( 'pinchstart', listener );
1
2
3
4
5
6
7
8
9

# 查询

Last Updated: 3/9/2023, 10:53:06 AM