如果不了解 JSAR 的小伙伴可以先通过 Yorkie:JSAR 新版本预览:8个月到底写了个啥 了解。
简单的说 JSAR 就是一个以 XR(比如 Apple Vision Pro、Pico 或 Rokid ARLite)设计优先的 Web 运行时(或者自大一点叫浏览器),它可以将不同的 WebXR 应用渲染到同一个场景,并且可以交互。
JSAR 在 0.6.0 的版本中,在上个版本的基础上,开始支持使用 HTML 去替代原来 XSML 的功能,好处是向后兼容性更好,让开发者可以使用一套代码同时运行在 Web 浏览器和 JSAR 环境中。
同时,为了让开发者可以及时的体验到新版本功能,我开发了一个 Play WebXR 的应用(已同时发布到 AR Studio 和 ARLite 应用商店,由于精力有限,后面完善后会再考虑非 Rokid 设备),它相当于一个 WebXR 应用的浏览器,通过输入你的 URL 就可以在当前场景打开多个 WebXR 应用,同时也内置了一些我们提供好的应用和模型。话不多说,先看下面的录屏:
Play WebXR 应用介绍
Play WebXR 是同时发布在 AR Studio 和 ARLite 应用商店的一个空间应用,它集成最新的 JSAR SDK,可以实现在打开的应用空间中同时预览和使用多个 WebXR 应用(也包括模型)。
因此开发者/用户可以使用 Play WebXR 应用实现:
- 调试自己的 WebXR 应用(JSAR 环境)
- 浏览其他 WebXR 应用(JSAR 环境)
- 3D 模型浏览器
输入框(URL)支持的格式:
- .xsml 文件
- .html 文件
- .glb/.gltf 文件
JSAR 0.6 新功能
支持 HTML
现在 JSAR 可以直接运行 HTML 文件,比如:
<html>
<head>
<title>My First WebXR</title>
<script type="importmap">
{
"imports": {
"three": "https://ar.rokidcdn.com/web-assets/yodaos-jsar/dist/three/build/three.module.js"
}
}
</script>
<script type="module">
import * as THREE from 'three';
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, 1.0, 0.1, 1000);
const light = new THREE.DirectionalLight(0xffffff, 0.5);
light.position.set(0, 1, 1);
scene.add(light);
const geometry = new THREE.TorusKnotGeometry(0.2, 0.05, 50, 16);
const material = new THREE.MeshLambertMaterial({ color: 0x00ffff, wireframe: false });
const obj = new THREE.Mesh(geometry, material);
scene.add(obj);
navigator.xr.requestSession('immersive-ar', {}).then((session) => {
const baseLayer = new XRWebGLLayer(session, navigator.gl);
session.updateRenderState({ baseLayer });
const renderer = new THREE.WebGLRenderer({
canvas: {
// mock the canvas
addEventListener() { },
},
context: navigator.gl,
});
renderer.xr.enabled = true;
renderer.xr.setReferenceSpaceType('local');
renderer.xr.setSession(session);
function animate() {
obj.rotation.x += 0.01;
obj.rotation.y += 0.01;
renderer.render(scene, camera);
}
camera.position.z = 5;
renderer.setAnimationLoop(animate);
}, (err) => {
console.warn('Failed to start XR session:', err);
});
</script>
</head>
<body>
</body>
</html>
HTML 与之前 XSML 的区别在于:它不支持 XSML 内置的 3D 元素,因此你需要使用 Three.js 或者 Babylon.js 的 API 自己实现相关的定义。
但使用 HTML 可以让开发者用同一个 HTML 内容支持浏览器环境和 JSAR 环境运行,开发者可以通过 navigator.gl 判断环境。
如果你好奇为什么我要支持 HTML,请阅读这边文章:jsar.netlify.app/manual/0.6.…。简单来说就是 HTML 和 CSS 本身就已经可以描述 3D 空间了,因此就完全没必要引入一个新的标记语言了。
TypeScript 支持
在 HTML 中,仍然可以继续使用 TypeScript,并且具备更快的编译速度,不过唯一的区别是通过
比如可以创建文件 foo.ts
export class Foo {
bar: string = 'bar';
constructor() {
console.log(this.bar, 'from TypeScript');
}
}
然后在 HTML 中导入:
<html>
<head>
<script type="module">
import { Foo } from './foo.ts';
new Foo();
</script>
</head>
</html>
更多用法和介绍可查阅文档:jsar.netlify.app/zh/manual/0…
Three.js 支持
正如上面小节中所见,在新版本中,开发者可以在 HTML 中使用 Three.js 来编写你的应用,不过有几点需要注意:
1)请使用 JSAR 提供的 Three.js 版本:ar.rokidcdn.com/web-assets/… (原因:官方版本未对 multiview 渲染做支持)
2)使用 navigator.gl 创建渲染器
3)使用 navigator.xr.requestSession 直接创建 WebXR Session,不需要添加任何 VR Button。
具体可以查看 Three.js 支持文档:jsar.netlify.app/zh/manual/0…
Babylon.js 支持
在 HTML 中,你仍然可以使用 Babylon.js 开发,但仍然有几点需要注意:
1)需使用 JSAR 提供的 Babylon.js 版本:ar.rokidcdn.com/web-assets/…
2)使用 navigator.gl 创建 Engine
具体可以查看 Babylon.js 支持文档:jsar.netlify.app/zh/manual/0…
原生框架支持
如果你没有使用 Three.js 或 Babylon.js,而是自己实现的渲染器,JSAR 也提供了相关的支持帮助你可以适配你的3D引擎运行在 JSAR 环境中,具体支持文档请阅读:jsar.netlify.app/zh/manual/0…
模块系统
与 Web 和 Node.js 应用一样,在 JSAR 中你可以使用 ECMAScript Module 来组织你的项目结构,除此之外,JSAR 还内置了资源加载器用于加载比如像音频、图片、二进制和配置等文件。
import screenshot from './screenshot.png';
import music from './music.mp3';
console.info(screenshot); // prints the screenshot as ArrayBuffer
console.info(music); // prints the music as ArrayBuffer
同时在 JSAR 中,可以直接在 HTML 中配置 importmap 来配置你的第三方模块路径。
具体细节可查看文档:jsar.netlify.app/zh/manual/0…
Web Workers
由于 Three.js 的 draco 解压器依赖 Web Workers,为此,在 0.6.0 的版本也对 Web Workers 做了最小支持,开发者也可以使用它来帮助你实现一些异步的 CPU 任务。
具体细节可查看文档:jsar.netlify.app/zh/manual/0…
音频与空间音频
尽管在之前的版本也可以通过 API 播放音乐,但新版本中音乐/音频播放开始变得有趣了,由于每个应用现在都具备一个位置,因此要实现空间音频的效果变得异常简单:
const audio = new Audio('https://example.com/audio.mp3');
audio.play();
JSAR 在运行时,会根据应用的位置去进行音频空间化处理,这样随着应用和用户位置的变化,声音也会不同。
0.7 版本计划
在下个版本中,JSAR 会继续 HTML 化,主要为:
- 将 XSML 之前的空间标签(如 cube、sphere 等)迁移到 HTML 中(类似于在 HTML 中使用 svg 的用法)
- 将开始实现 HTML 部分 2D 标签(如 div、span、p、h1、h2 等)在空间中的渲染,以及支持少部分 CSS 布局和样式属性