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 应用!

相关文章
|
6月前
|
人工智能 JavaScript 机器人
Coze vs Dify vs n8n:三大AI智能体开发平台全面对比
2025年三大AI智能体平台深度对比:Coze零代码快速搭建,适合个人与轻量应用;Dify专注企业级大模型应用,平衡易用与灵活;n8n强在自动化集成,支持高度定制。根据需求选型,助力高效开发。
Swagger问题:No mapping for GET /swagger-ui.html报错
Swagger问题:No mapping for GET /swagger-ui.html报错
1740 0
|
6月前
|
存储 弹性计算 人工智能
最新:阿里云服务器租用价格表(年 /月付/按小时报价明细、新购/续费/升级政策)
阿里云服务器凭借弹性伸缩、安全可靠的特性,覆盖个人开发、企业业务及高性能计算等多场景需求。其产品体系主要包含轻量应用服务器、云服务器 ECS 及 GPU 服务器,不同机型在配置、定价及适用场景上存在差异。本文将从各类型服务器的配置规格、价格体系(年付、月付、按小时计费)、续费政策及附加资源(带宽、存储)定价展开详细说明,为用户提供清晰的成本参考。
|
缓存 资源调度 JavaScript
nodejs全局(npm、cnpm、yarn)及缓存基本配置,一篇就搞定
nodejs全局(npm、cnpm、yarn)及缓存基本配置,一篇就搞定
|
4月前
|
人工智能 安全 Go
使用MCP官方 Go SDK实现自己的MCP server
MCP(Model Context Protocol)是Anthropic推出的标准化协议,让AI安全调用外部工具。本文带你用官方Go SDK从零实现MCP服务器,支持“获取当前时间”和“读取本地文件”两个工具,并在VS Code中快速测试调用。(239字)
637 1
|
11月前
|
机器学习/深度学习 人工智能 数据挖掘
基于YOLOv8的狗狗品种(多达60种常见犬类)品种鉴别识别项目|完整源码数据集+PyQt5界面+完整训练流程+开箱即用!
随着宠物经济的不断发展,狗狗已经成为众多家庭的重要成员。不同品种犬类在性格、饲养方式、健康管理上有显著差异,快速准确地识别狗狗品种有着重要应用价值。传统方式依赖人工识别,效率低且易出错。 本项目借助YOLOv8强大的目标检测能力,结合高质量数据集训练,实现60种犬类的高精度自动分类识别,并提供可交互图形界面,极大降低使用门槛。
基于YOLOv8的狗狗品种(多达60种常见犬类)品种鉴别识别项目|完整源码数据集+PyQt5界面+完整训练流程+开箱即用!
|
8月前
|
数据采集 缓存 监控
阿里云CDN流量超额怎么办?
使用阿里云CDN时,流量超额易致额外费用。本文教你三招应对:实时监控并设置报警、优化配置减少消耗、购买流量包降低成本。常见原因包括访问突增、配置不当或网络攻击。
|
自然语言处理 监控 安全
2025年阿里云短信验证码价格多少钱?计费模式与场景选型指南
随着企业数字化转型,短信验证码作为用户身份验证的重要工具,其成本与效率的平衡至关重要。阿里云短信服务以高可靠性、灵活计费和多场景适配著称。按量付费模式适合需求波动大的场景,而短信套餐包则为长期稳定需求提供了成本优势。针对不同业务场景,如高频验证、跨境业务及中小型企业轻量级需求,阿里云提供了定制化的选型策略。此外,通过阶梯定价、防盗刷监控等措施实现成本优化与风险规避,并不断进行技术升级以确保服务的安全性和稳定性。根据2025年最新数据,企业可根据自身需求选择最适合的阿里云短信验证码服务方案。
|
运维 Kubernetes 调度
阿里云容器服务 ACK One 分布式云容器企业落地实践
3年前的云栖大会,我们发布分布式云容器平台ACK One,随着3年的发展,很高兴看到ACK One在混合云,分布式云领域帮助到越来越多的客户,今天给大家汇报下ACK One 3年来的发展演进,以及如何帮助客户解决分布式领域多云多集群管理的挑战。
阿里云容器服务 ACK One 分布式云容器企业落地实践
|
弹性计算 移动开发 安全
阿里云域名注册、续费收费标准价格表及最新优惠口令获取及使用教程参考
阿里云域名注册和续费收费标准在9月份随着全球域名价格的上涨,域名收费标准也做了调整,目前阿里云的.com英文域名的注册价格为83元,续费收费标准为90元,为了让更多用户在注册和续费时价格能更加实惠,阿里云推出了域名优惠口令活动,域名优惠口令适合在域名注册和续费时使用,使用优惠口令通常可以使注册和续费价格减免几元到十几元不等,例如使用优惠口令续费.com域名就可减少5元。本文为大家展示目前阿里云域名注册和续费的最新收费标准以及如何领取和使用域名优惠口令的相关教程,以供参考。
4252 11