JSAR 入门教程:从零开始开发空间天气小摆件

简介: JSAR是Rokid推出的AR开发框架,支持Web技术栈构建空间应用。本文详解环境搭建、项目结构、3D天气小摆件实战及调试发布,助前端开发者快速入门AR开发。

一、JSAR 简介与开发环境搭建

1.1 什么是 JSAR?

JSAR(JavaScript Augmented Reality)是 Rokid 推出的空间小程序开发框架,允许开发者使用 Web 技术栈(JavaScript/TypeScript)构建可嵌入物理空间的 AR 应用。其核心优势在于:

  • 低门槛:无需学习 Unity 或 Unreal Engine,前端开发者可直接上手
  • 强隔离:空间组件独立运行,互不干扰
  • 跨平台:支持 Rokid AR 眼镜、手机等多设备

1.2 开发环境准备

必备工具(版本要求严格):

  • Visual Studio Code ≥ 1.80.0
  • Node.js ≥ 18.0.0(建议使用 18.12.1 LTS)
  • JSAR DevTools 插件(VS Code 商店搜索安装)

环境搭建步骤:

# 验证 Node.js 安装
node -v  # 需显示 ≥ v18.x.x
npm -v   # 配套版本 ≥ 8.0.0
# 安装 JSAR 脚手架
npm init @yodaos-jsar/widget@latest my-weather-widget
cd my-weather-widget
npm install  # 安装类型定义与依赖

二、JSAR 项目结构与核心概念

2.1 项目文件解析

my-weather-widget/
├── main.xsml        # 空间布局定义(类似 HTML)
├── package.json     # 项目配置
├── lib/main.ts      # TypeScript 逻辑
└── model/           # 3D 模型资源

关键文件详解:

  • main.xsml:使用空间标记语言定义 3D 场景结构
<xsml version="1.0">
    <head>
        <title>天气小摆件</title>
        <script src="./lib/main.ts"></script>
    </head>
    <space><!-- 3D 场景容器 --></space>
</xsml>
- package.json:需指定 xsml 入口文件
{
   
    "main": "main.xsml",
    "dependencies": {
    
        "@rokid/jsar": "^0.2.0" 
    }
}

2.2 核心概念图解

概念 说明 类比 Web 开发
可嵌入空间 划定的 3D 子空间区域 iframe 容器
XSML 空间标记语言,定义 3D 元素布局 HTML
JSAR-DOM 空间文档对象模型,操作 3D 元素 DOM API
Babylon.js 3D 渲染引擎,处理图形渲染与动画 CSS + Canvas

三、实战开发:3D 天气小摆件

3.1 基础场景搭建

在 lib/main.ts 中创建 Babylon.js 场景:

// 获取 JSAR 全局场景对象
const scene = spaceDocument.scene as BABYLON.Scene;
// 添加环境光
const light = new BABYLON.HemisphericLight("light", 
  new BABYLON.Vector3(0, 1, 0), 
  scene
);
light.intensity = 0.7;
// 创建地面
const ground = BABYLON.MeshBuilder.CreateGround("ground", 
  {
    width: 10, height: 10 }, 
  scene
);
const groundMat = new BABYLON.StandardMaterial("groundMat", scene);
groundMat.diffuseColor = new BABYLON.Color3(0.8, 0.8, 0.8);
ground.material = groundMat;

在这里插入图片描述

3.2 集成和风天气 API

步骤 1:获取 API Key

  1. 访问 和风天气开发者平台 注册账号
    在这里插入图片描述
  2. 创建应用获取 API Key(免费版每日可调用 1000 次)

在这里插入图片描述

步骤 2:编写 API 调用函数

async function fetchWeather(city: string): Promise<any> {
   
    const apiKey = "YOUR_API_KEY"; 
    // 替换为实际密钥
    const cityUrl = `https://geoapi.qweather.com/v2/city/lookup?location=${
    city}&key=${
    apiKey}`;
    try {
   
        // 获取城市 ID
        const cityRes = await fetch(cityUrl);
        const cityData = await cityRes.json();
        const cityId = cityData.location[0].id;
        // 获取天气数据
        const weatherUrl = `https://devapi.qweather.com/v7/weather/now?location=${
    cityId}&key=${
    apiKey}`;
        const weatherRes = await fetch(weatherUrl);
        return await weatherRes.json();
    } catch (error) {
   
        console.error("天气 API 调用失败:", error);
        return null;
    }
}

3.3 3D 天气可视化实现

创建动态更新的天气球体:

async function createWeatherSphere() {
   
    // 创建球体作为天气指示器
    const sphere = BABYLON.MeshBuilder.CreateSphere("weatherSphere", 
    {
    diameter: 2 }, 
    scene
  );
  sphere.position.y = 1;
  // 创建材质
  const sphereMat = new BABYLON.StandardMaterial("sphereMat", scene);
  sphere.material = sphereMat;
  // 更新天气数据
  setInterval(async () => {
   
      const weatherData = await fetchWeather("北京");
      if (weatherData && weatherData.code === "200") {
   
          const temp = weatherData.now.temp;
          const text = weatherData.now.text;
          // 根据天气状况改变球体颜色
          switch(text) {
   
              case "晴":
                  sphereMat.diffuseColor = new BABYLON.Color3(1, 0.8, 0); // 晴天-黄色
                  break;
              case "雨":
                  sphereMat.diffuseColor = new BABYLON.Color3(0.3, 0.5, 1); // 雨天-蓝色
                  break;
              case "阴":
                  sphereMat.diffuseColor = new BABYLON.Color3(0.6, 0.6, 0.6); // 阴天-灰色
                  break;
          }
          console.log(`当前温度: ${
    temp}℃, 天气: ${
    text}`);
      }
  }, 60000); // 每分钟更新一次
  return sphere;
}
// 初始化天气球体
createWeatherSphere();

四、调试与打包发布

4.1 本地调试

方法 1:VS Code 预览

  1. 打开 main.xsml 文件
  2. 点击右上角 "场景视图" 按钮启动预览
  3. 使用 WASD 键控制视角,鼠标滚轮缩放

    方法 2:浏览器测试

# 安装静态服务器
npm install -g serve
serve -p 8080 --cors
# 在 JSAR Playground 中打开
https://jsar.netlify.app/playground?url=http://localhost:8080/main.xsml

在这里插入图片描述

4.2 打包发布

# 构建项目
npm run build

# 生成的包位于 dist/ 目录
# 可通过 Rokid 开发者平台上传至 AR 应用商店

五、进阶技巧与注意事项

5.1 性能优化建议

  • 模型轻量化:3D 模型面数控制在 1000 以内
  • 减少绘制调用:合并静态模型,共享材质
  • 按需加载:非关键资源使用懒加载模式

5.2 常见问题排查

问题现象 可能原因 解决方案
场景无渲染 VS Code 扩展未激活 重启 VS Code 或重装 JSAR DevTools
API 调用失败 跨域问题 使用 Rokid 设备测试或配置代理
模型不显示 GLB 文件路径错误 检查 xsml 中 link 标签的 href 属性

5.3 创新拓展方向

  1. 多设备同步:结合 WebSocket 实现多 AR 眼镜间数据同步
  2. 语音交互:集成 Rokid 语音 SDK 实现语音控制天气查询
  3. 数据可视化:展示未来 7 天天气预报的 3D 时间轴

六、总结

本教程通过开发一个实时天气小摆件,介绍了 JSAR 开发的完整流程。从环境搭建到 API 集成,再到 3D 可视化实现,我们展示了如何将 Web 开发经验迁移到 AR 领域。JSAR 技术正在快速发展,建议持续关注 Rokid 开发者论坛 获取最新更新。

希望这个教程能帮助你迈出空间开发的第一步,期待看到更多创意十足的 JSAR 应用!

相关文章
|
C++
在C++语言中比较两个数的大小的方法
在C++语言中比较两个数的大小的方法
2698 1
|
存储 编解码 缓存
webgl系列之抗锯齿和深度缓存
前言 大家好我是Fly 哥, 这是今年webgl 系列的第三篇文章, 如果你之前的两篇文章没看的话,建议先看一下,然后再来看这一篇文章 Webgl 系列之buffer的使用 webgl系列之对光栅化的理解 上一篇文章,任何虚拟3维世界的转换到二维屏幕中通过「采样」 也就判断屏幕上的每个像素中心点是不是在三角形内部的得到了 下面这幅图: 图片 走样之前 这时候有同学问, 这不像三角形哇, 这个其实用个专业的词—— 「锯齿」 , 我的理解 一个三角形经过光栅化后, 得到屏幕上每一个像素点 组成的像素点的集合。那到底是经过什么样的处理得到下面这张图: 图片 final 反走样 其实出现上面
webgl系列之抗锯齿和深度缓存
查看 npm 包下载量(简单快捷,数据精确)
查看 npm 包下载量(简单快捷,数据精确)
1096 0
|
26天前
|
机器学习/深度学习 消息中间件 人工智能
活动邀请丨2025 全球机器学习技术大会
阿里云高级技术专家周礼受邀于 10 月 17 日下午分享议题《Apache RocketMQ x AI:面向异步化 Agent 的事件驱动架构》。
113 18
|
26天前
|
移动开发 开发工具 Android开发
Uniapp与原生App集成的流程
Uniapp与原生App集成的流程
355 3
|
监控 网络协议 数据安全/隐私保护
云MAS中CMPP3.0协议封装与移动短信状态报告状态码说明
云MAS中CMPP3.0协议封装与移动短信状态报告状态码说明
1524 1
|
4月前
|
机器学习/深度学习 人工智能 数据挖掘
基于YOLOv8的狗狗品种(多达60种常见犬类)品种鉴别识别项目|完整源码数据集+PyQt5界面+完整训练流程+开箱即用!
随着宠物经济的不断发展,狗狗已经成为众多家庭的重要成员。不同品种犬类在性格、饲养方式、健康管理上有显著差异,快速准确地识别狗狗品种有着重要应用价值。传统方式依赖人工识别,效率低且易出错。 本项目借助YOLOv8强大的目标检测能力,结合高质量数据集训练,实现60种犬类的高精度自动分类识别,并提供可交互图形界面,极大降低使用门槛。
基于YOLOv8的狗狗品种(多达60种常见犬类)品种鉴别识别项目|完整源码数据集+PyQt5界面+完整训练流程+开箱即用!
|
网络安全 开发工具 文件存储
在群晖NAS上快速搭建属于自己的Git Server
在群晖NAS上快速搭建属于自己的Git Server
3039 0
|
26天前
|
Web App开发 前端开发 JavaScript
如何调试和修复CSS代码中的问题?
如何调试和修复CSS代码中的问题?
388 137
|
26天前
|
人工智能 安全 Serverless
再看 AI 网关:助力 AI 应用创新的关键基础设施
AI 网关作为云产品推出已有半年的时间,这半年的时间里,AI 网关从内核到外在都进行了大量的进化,本文将从 AI 网关的诞生、AI 网关的产品能力、AI 网关的开放生态,以及新推出的 Serverless 版,对其进行一个全面的介绍,期望对正在进行 AI 应用落地的朋友,在 AI 基础设施选型方面提供一些参考。
373 36