【征文计划】玩转 Rokid JSAR:基于 Web 技术栈的 AR 开发环境搭建、核心 API 应用与 3D 时钟等创意项目全流程解析

【征文计划】玩转 Rokid JSAR:基于 Web 技术栈的 AR 开发环境搭建、核心 API 应用与 3D 时钟等创意项目全流程解析

前言

随着 AR 技术在消费级场景的普及,开发者对 “低门槛、高兼容” AR 开发工具需求愈发迫切,传统 AR 开发往往依赖专属引擎或复杂语法,导致 Web 开发者难以快速切入,而 Rokid 推出的 JSAR 技术,恰好打破了这一壁垒:以 “可嵌入空间的 Web 运行时” 为核心,让开发者无需学习新的开发范式,仅用 JavaScript/TypeScript 等熟悉的 Web 技术栈,就能快速开发出支持 3D 物体、2D 界面的空间小程序

本文正是围绕 JSAR 技术展开的实战指南:从最基础的开发环境搭建到核心特性原理解析,再到地球项目、超级马里奥复刻、碰撞检测、动画缓动等场景的实战演练,最终以 “3D 时钟” 为创意案例,深入拆解 JSAR 项目的文件结构、逻辑实现与空间布局关联。无论你是刚接触 AR 开发的 Web 工程师,还是希望拓展技术边界的开发者,都能通过本文掌握 JSAR 开发的核心流程,真正实现 “用 Web 技术玩转 AR 空间应用”。

Rokid JSAR 介绍

对开发者来说,JSAR 就是个 “技术转换器” 不用学新东西,用熟悉的 JavaScript、TypeScript 这些 Web 技术,就能做能放进特定空间的小程序,还能在场景里划块区域放 3D 模型、2D 界面,写的代码跟在网页里一样能跑,直接把 Web 开发经验套到空间应用上就行

  • 可嵌入空间:是指在当前场景中通过定义长宽高划定一块子空间给一个单独的应用程序使用,空间组件可以是一个 3D 物体,也可以是一个 2D 界面,当然也可以是带 GUI 的 3D 物体
  • Web 运行时:代表 JSAR 可以运行基于 Web APIs 实现的 JavaScript / TypeScript 代码,同时也可以运行 WebAssembly

Rokid JSAR 开发环境搭建:基础地球项目开发

开发工具安装

1、VS Code安装插件 JSAR Devtools 和 gITF Tools

  • JSAR Devtools:辅助 JSAR 项目开发,提供 AR 场景调试、状态查看及性能优化等功能,提升开发效率
  • glTF Tools:处理 glTF/GLB 格式 3D 模型,支持在开发环境中预览和简单编辑,方便模型使用
项目资源准备

2、icon.png准备

3、通过gITF插件预览效果


4、main.xsml JSAR 项目中用于定义界面结构、资源关联和 3D 场景布局的描述文件,连接项目资源与场景元素,搭建起应用的基础框架

<xsml version="1.0">
  <head>
    <title>JSAR Widget</title>
    <link id="model" rel="mesh" type="octstream/glb" href="./model/wel***e.glb" />
    <script src="./lib/main.ts"></script>
  </head>
  <space>
    <mesh id="model" ref="model" selector="__root__" />
  </space>
</xsml>
本地服务器搭建

5、Web 浏览器运行

  • 安装 serve 工具
npm install serve -g
  • 使用 serve 工具启动静态服务器
serve -p 8080 --cors

6、浏览器地址如下显示则表示成功启动服务器

7、JSAR 演示场展示:https://jsar.***lify.app/playground?url=填写本地服务器地址

JSAR 实战项目演练:从基础到创意

交互功能实践:碰撞检测实现

<xsml version="1.0">
  <head>
    <title>JSAR Widget</title>
    <script src="./lib/main.ts"></script>
  </head>
  <space>
    <!-- nothing to do -->
  </space>
</xsml>

动效设计实践:动画缓动实现

<xsml version="1.0">
  <head>
    <title>Animation Easing</title>
    <script src="./lib/main.ts"></script>
  </head>
  <space>
  </space>
</xsml>

创意开发:3D 时钟项目全解析

文件路径 / 名称 文件角色定位 核心功能说明
lib/clock.ts 核心逻辑文件 封装坐标计算、时间获取、图形绘制函数,通过startClock实现模拟 + 数字时钟绘制
lib/main.ts 项目入口文件 获取画布、初始化时钟,每秒更新绘制与画布,实现动态走时
package-lock.json 依赖配置文件 管理@yodaos-jsar/types等依赖及版本,保障开发环境稳定
main.xsml 3D 页面配置文件 定义画布立方体样式、引入脚本、创建 3D 载体,关联逻辑与空间布局

1、clock.ts 封装了时钟绘制的核心逻辑,通过一系列函数如计算坐标的 x2y2,获取时间的 getTime,绘制圆形、线条、文字的 drawCircledrawLinedrawText 等,最终在 startClock 函数里实现了模拟时钟(含时针、分针、秒针及表盘)与数字时钟的绘制

function x2(n, i, x1, r) {
  return x1 + r * Math.sin(2 * Math.PI * n / i);
}

function y2(n, i, y1, r) {
  return y1 - r * Math.cos(2 * Math.PI * n / i);
}

function getTime() {
  var date = new Date();
  return {
    hours: date.getHours(),
    minutes: (date.getMinutes() < 10) ? "0" + date.getMinutes() : date.getMinutes(),
    seconds: (date.getSeconds() < 10) ? "0" + date.getSeconds() : date.getSeconds()
  };
}

function drawCircle(ctx, x, y, r, width, strokeColor, background) {
  ctx.beginPath();
  ctx.strokeStyle = strokeColor;
  ctx.fillStyle = background;
  ctx.lineWidth = width;
  ctx.arc(x, y, r, 0, 2 * Math.PI);
  ctx.fill();
  ctx.stroke();
  ctx.closePath();
}

function drawLine(ctx, xStart, yStart, xStop, yStop, width, color) {
  ctx.beginPath();
  ctx.strokeStyle = color;
  ctx.lineWidth = width;
  ctx.moveTo(xStart, yStart);
  ctx.li***o(xStop, yStop);
  ctx.stroke();
  ctx.closePath();
}

function drawText(ctx, text, x, y, maxWidth) {
  ctx.textAlign = "center";
  ctx.font = "36px Arial";
  ctx.fillStyle = "#EEE";
  ctx.fillText(text, x, y, maxWidth);
}

export function startClock(ctx) {
  var time = getTime();

  ctx.clearRect(0, 0, 500, 500); // reset canvas

  drawCircle(ctx, 250, 250, 245, 10, "#EEE", "#333");

  drawLine(ctx, 250, 250, x2(time.hours, 12, 250, 115), y2(time.hours, 12, 250, 115), 12, "#EEE"); // hours
  drawCircle(ctx, 250, 250, 10, 10, "#EEE", "#EEE");

  drawLine(ctx, 250, 250, x2(time.minutes, 60, 250, 165), y2(time.minutes, 60, 250, 165), 8, "#999"); // minutes
  drawCircle(ctx, 250, 250, 8, 10, "999", "999");

  drawLine(ctx, 250, 250, x2(time.seconds, 60, 250, 200), y2(time.seconds, 60, 250, 200), 5, "red"); // seconds
  drawCircle(ctx, 250, 250, 5, 10, "red", "red");

  drawText(ctx, time.hours + " : " + time.minutes + " : " + time.seconds, 250, 70, 500); // digital time
}

2、 main.ts 则作为项目入口,获取画布并借助 startClock 初始化时钟绘制,再通过 setInterval 每秒钟调用一次 startClock 并更新画布,从而让时钟实现动态走时效果。

import { startClock } from './clock';

const canvasPanel = spatialDocument.getSpatialObjectById('canvas');
const canvas = canvasPanel.attachCanvasTexture(512, 512);
const ctx = canvas.getContext();

startClock(ctx);
setInterval(() => {
  startClock(ctx);
  canvas.update();
}, 1000);

3、package-lock.json 配置 JSAR 3D 时钟项目的依赖树

{
  "name": "your-jsar-widget-name",
  "version": "1.0.0",
  "lockfileVersion": 3,
  "requires": true,
  "packages": {
    "": {
      "name": "your-jsar-widget-name",
      "version": "1.0.0",
      "license": "Apache-2.0",
      "devDependencies": {
        "@yodaos-jsar/types": "^0.2.0-alpha.5"
      }
    },
    "node_modules/@types/node": {
      "version": "18.18.8",
      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.8.tgz",
      "integrity": "sha512-OLGBaaK5V3VRBS1bAkMVP2/W9B+H8meUfl866OrMNQqt7wDgdpWPp5o6gmIc9pB+lIQHSq4ZL8ypeH1vPxcPaQ==",
      "dev": true,
      "dependencies": {
        "undici-types": "~5.26.4"
      }
    },
    "node_modules/@yodaos-jsar/types": {
      "version": "0.2.0-rc2",
      "resolved": "https://registry.npmjs.org/@yodaos-jsar/types/-/types-0.2.0-rc2.tgz",
      "integrity": "sha512-0vzmQqg9ELukDJPQUpTdNpHGI8Ceso7uK8tE06x6wfkrab5/aJsTTvbG9camZsF79V1RP4I8pwXzY53V9gMs7g==",
      "dev": true,
      "dependencies": {
        "@types/node": "^18.12.1"
      }
    },
    "node_modules/undici-types": {
      "version": "5.26.5",
      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
      "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
      "dev": true
    }
  }
}

4、main.xsml 项目页面配置核心,通过样式定义 #canvas 立方体的缩放与旋转,引入 main.ts 脚本,并以 <cube id="canvas"> 为载体,构建出 3D 时钟在空间展示的基础结构,关联样式与核心逻辑

<xsml version="1.0">
  <head>
    <title>Clock</title>
    <style type="text/scss">
      #canvas {
        scaling: 1 1 1;
        rotation: 0 180 30;
      }
    </style>
    <script type="module" src="lib/main.ts"></script>
  </head>
  <space>
    <cube id="canvas"></cube>
  </space>
</xsml>

总结

Rokid JSAR 最核心的价值就是帮 Web 开发者 “零门槛” 切入 AR 开发,不用学新引擎、开发流程清晰、项目架构可复用,不管是练手基础功能,还是做 3D 时钟这类创意项目都能高效落地,真正实现 Web 技术和 AR 空间场景互通,如果对这种低门槛 AR 开发感兴趣,不妨前往 Rokid 官网,获取更完整的开发文档、工具资源和场景示例,亲自体验从代码编写到空间应用落地的全流程!

技术门槛低:JSAR 核心是复用 Web 技术,无需学专属 AR 引擎语法,Web 开发者用 JavaScript/TypeScript、Web APIs 即可开发空间应用,且 main.xsml 场景定义、Canvas 纹理绘制等操作熟悉,大幅降低跨领域学习成本

开发流程清晰可复现:地球项目从工具配置、资源准备、服务器搭建到演示场验证,每步有具体操作与反馈,能快速搭环境;后续项目还提供场景模板,减少功能开发试错成本

项目架构可复用:3D 时钟项目的文件拆解逻辑、入口、布局等分离提供通用结构参考,契合模块化思维,可直接复用到其他 JSAR 项目

转载请说明出处内容投诉
CSS教程网 » 【征文计划】玩转 Rokid JSAR:基于 Web 技术栈的 AR 开发环境搭建、核心 API 应用与 3D 时钟等创意项目全流程解析

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买