HarmonyOS 6.1 空间计算初探:把电商展厅搬进“虚实融合”新世界
系列番外·空间计算篇。终章发布后有读者留言“现在都在聊Vision Pro和空间计算鸿蒙在这方面有布局吗能不能把我们这个电商Demo弄成3D的” 答案是肯定的。HarmonyOS NEXT的ArkUI 3D和Spatial Computing Kit正是为此而生。今天作为系列的第一个番外篇我们跳出手机屏幕的限制将电商Demo升级为3D沉浸式购物空间。用户不再只是“刷列表”而是可以走进虚拟展厅“拿起”商品查看细节甚至把家具“摆放”在自己家里。全程基于API23解决3D模型加载、手势交互、虚实锚定三大核心技术点。这是通往下一代操作系统的入场券。一、前言为什么电商是空间计算的“杀手级场景”回顾我们之前的系列所有的交互都被局限在6英寸的矩形屏幕里。无论是滑动列表还是点击按钮本质上都是在操作二维平面上的像素。空间计算Spatial Computing打破了这个界限从“看图片”到“看展品”以前的详情页是几张平面图现在是一个可以720°旋转的3D模型。从“想象摆放”到“真实预览”买沙发不用凭空想象直接把虚拟沙发“放”在客厅里看看尺寸和风格是否合适。从“手指点击”到“自然交互”用手捏合来缩放商品用手抛动作来切换视角就像在现实世界一样自然。HarmOS 6.1提供了低门槛的3D开发能力。我们不需要学习OpenGL或Unity复杂的Shader语言直接用熟悉的ArkTS和类Compose的声明式语法就能构建3D场景。今天我们就来给电商Demo加一个“3D展厅”页面。二、核心概念辨析2D UI vs 3D Scene很多前端开发者对3D有畏难情绪其实只要理清这几个核心概念上手非常快概念2D UI (传统)3D Scene (空间计算)类比说明坐标系​X(横), Y(纵)X(横), Y(纵),Z(深)​从画纸变成了雕塑台基本单元​Column,Text,ImageScene,Node3D,Mesh积木块变成了3D模型位置​position({x:0, y:0})position({x:0, y:0, **z:-5**})Z轴负值表示远离镜头旋转​rotate({angle: 90})rotation({x:0, y:1, z:0, angle:90})指定绕哪个轴旋转相机​屏幕即是相机Camera组件导演的眼睛决定看哪里核心认知ArkUI 3D的本质是把3D场景当作一个特殊的UI组件来渲染。我们可以在3D场景里嵌套2D的按钮Overlay也可以在2D页面里嵌入3D视口。这种混合渲染能力是鸿蒙的独特优势。三、代码实现构建3D商品展厅3.1 环境准备与资源引入模型准备3D开发离不开模型文件。常用的格式是.glb或.gltf。我们可以从Sketchfab等网站下载免费的电商产品模型如椅子、包包放入entry/src/main/resources/rawfile/models/目录。权限配置空间计算可能需要相机权限用于虚实融合在module.json5中添加{ module: { requestPermissions: [ { name: ohos.permission.CAMERA, reason: AR空间锚定需要 } ] } }3.2 构建3D场景组件创建entry/src/main/ets/pages/SpatialShowroom.ets。这是我们的核心3D页面。import { scene } from kit.ArkGraphics3D import { abilityAccessCtrl } from kit.AbilityKit Entry Component struct SpatialShowroom { private scene: scene.Scene null! private modelNode: scene.Node3D null! State rotationY: number 0 // 控制模型Y轴旋转 State scale: number 1.0 // 控制模型缩放 aboutToAppear(): void { // 请求相机权限用于AR模式 this.requestCameraPermission() } async requestCameraPermission(): Promisevoid { let atManager abilityAccessCtrl.createAtManager() try { await atManager.requestPermissionsFromUser(getContext(this), [ohos.permission.CAMERA]) } catch (err) { console.error(相机权限申请失败:, err) } } /** * 加载3D场景 */ onSceneCreated(scene: scene.Scene): void { this.scene scene console.log(3D场景加载成功) // 1. 设置环境光让模型更清晰 const light scene.getNode(EnvLight) as scene.Light if (light) { light.intensity 20000 } // 2. 加载商品模型例如一把椅子 scene.loadModel({ path: models/chair.glb, // rawfile目录下的路径 onLoaded: (node: scene.Node3D) { this.modelNode node console.log(模型加载成功:, node.name) // 调整模型位置和大小 node.position { x: 0, y: -1, z: -5 } // 稍微下移后退 node.scale { x: 0.5, y: 0.5, z: 0.5 } // 缩小一半 }, onError: (err: Error) { console.error(模型加载失败:, err) } }) } build() { Stack() { // 3D场景视口铺满全屏 SceneView({ sceneOptions: { environment: scene.EnvironmentPreset.STUDIO // 使用工作室光照环境 }, onSceneCreated: (scene: scene.Scene) this.onSceneCreated(scene) }) .width(100%) .height(100%) // 叠加在3D场景上的2D UI操作面板 Column() { // 标题 Text(3D商品展厅) .fontSize(24) .fontColor(Color.White) .fontWeight(FontWeight.Bold) .shadow({ radius: 10, color: Color.Black }) .margin({ top: 40 }) Blank() // 底部操作栏 Row() { // 旋转按钮 Button(↻) .onClick(() { this.rotationY 45 if (this.modelNode) { this.modelNode.rotation { x: 0, y: 1, z: 0, angle: this.rotationY } } }) .width(60) .height(60) .borderRadius(30) .backgroundColor(#0A59F7) // 缩放控制 Slider({ value: this.scale, min: 0.5, max: 2.0, step: 0.1 }) .width(150) .onChange((value: number) { this.scale value if (this.modelNode) { this.modelNode.scale { x: value, y: value, z: value } } }) // AR放置按钮进阶功能 Button(AR) .onClick(() { this.enterARMode() }) .width(60) .height(60) .borderRadius(30) .backgroundColor(#4CAF50) } .width(90%) .justifyContent(FlexAlign.SpaceBetween) .margin({ bottom: 40 }) } .width(100%) .height(100%) } .width(100%) .height(100%) .backgroundColor(Color.Black) } /** * 进入AR放置模式虚实融合 */ enterARMode(): void { if (!this.scene) return // 切换到AR环境需要设备支持如Mate 60 Pro this.scene.switchEnvironment(scene.EnvironmentPreset.AR) // 提示用户点击地面放置模型 promptAction.showToast({ message: 请点击地面放置商品 }) // 监听点击事件在点击位置放置模型 this.scene.on(touch, (hitResult: scene.HitResult) { if (hitResult.type scene.HitType.PLANE) { if (this.modelNode) { // 将模型移动到点击的平面位置 this.modelNode.position hitResult.point promptAction.showToast({ message: 商品已放置 }) } } }) } }四、踩坑记录官方文档没写的5个细节模型格式陷阱一定要用.glb格式不要用.obj或.fbx。.glb是二进制格式体积小加载快且支持PBR材质金属、粗糙度鸿蒙对其支持最好。.gltf是JSON格式加载慢不推荐。坐标系手性鸿蒙3D使用的是右手坐标系Y轴向上而Unity等引擎常用左手坐标系。导入模型后如果发现上下颠倒记得在Blender等建模软件中调整坐标轴方向或者在代码里旋转90度。性能瓶颈3D渲染非常耗电耗性能。不要在列表页一次性加载多个复杂3D模型。建议只在详情页进入全屏3D模式。同时务必给模型做LOD多层次细节处理远看用低模近看用高模。AR模式的设备限制目前的EnvironmentPreset.AR主要依赖华为自研的Cyberverse技术并非所有鸿蒙设备都支持主要是旗舰机如Mate 60系列、Pura 70系列。赶稿时如果设备不支持可以用下面的浏览器模拟方案。触摸事件穿透3D场景的触摸事件默认会吃掉所有点击导致后面的2D按钮点不了。需要在SceneView上设置.hitTestBehavior(HitTestMode.None)或者在3D场景里手动转发事件给UI层。

相关新闻

STM32 SysTick定时器原理与应用实践

STM32 SysTick定时器原理与应用实践

1. STM32 SysTick定时器基础解析SysTick是ARM Cortex-M内核提供的一个24位递减计数器,作为STM32微控制器的标准外设,它主要承担操作系统节拍定时器的角色。这个看似简单的定时器在实际工程中却承担着关键任务——从最基本的延时函数到RTOS的任务调度都依…

2026/9/24 9:21:20 阅读更多 →
总纲:把不确定性从 LLM 侧转移到工程侧

总纲:把不确定性从 LLM 侧转移到工程侧

结论先说 准确率从 65% 提升到 85%,三四周,由我独立完成。 核心思路——把不确定性从 LLM 侧转移到工程侧。 这不是事后总结,是多次迭代提示词、发现收益递减后,形成的整套调优思路; 它覆盖全部 11 个模块,可拆分为四层逻辑:前置拦截 LLM、收窄 LLM 决策空间、兜底修复 LLM 异常…

2026/9/23 5:11:05 阅读更多 →
电容器动态分析:电量不变模型原理与典型例题详解

电容器动态分析:电量不变模型原理与典型例题详解

在电路分析与电子技术的学习中,电容器的动态分析往往是学生和工程师们遇到的一个难点,尤其是当电路状态发生突变时,电容器的电压和电荷量如何变化,直接关系到整个电路的工作特性。上节课我们重点讲解了电容器动态分析的基本原理和…

2026/9/19 2:44:14 阅读更多 →

最新新闻

新手搞懂 HLS 的 DVR 回看,直播时移常见踩坑

新手搞懂 HLS 的 DVR 回看,直播时移常见踩坑

一、什么是直播 DVR 时移回看 很多监控直播、网课直播产品有回看功能,也就是 DVR 时移。通俗讲:直播正在播出,用户可以拖动进度条,回看几分钟、几十分钟之前已经播过的历史画面。点播视频全部分片提前生成好;而直播 D…

2026/9/24 9:21:35 阅读更多 →
ROS 2神经系统拆解:DDS与QoS如何保障机器人通信可靠性

ROS 2神经系统拆解:DDS与QoS如何保障机器人通信可靠性

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 9:21:35 阅读更多 →
2026 年度南京 GEO 推广公司|5 家本地生成式引擎优化服务商测评榜单

2026 年度南京 GEO 推广公司|5 家本地生成式引擎优化服务商测评榜单

本文面向南京制造工厂、B2B 工贸企业、商贸公司、中小服务商、政企单位的 GEO 推广项目采购,整理 5 家具备本地落地能力服务商:江苏企裕集团、旗下南京区域运营主体南京企裕,以及云蝠智能(南京星蝠科技)、南京智子互联…

2026/9/24 9:21:35 阅读更多 →
用SerialPlot实现STM32 PID参数可视化调试

用SerialPlot实现STM32 PID参数可视化调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 9:21:35 阅读更多 →
Win10/Win11下CH340/CH341驱动异常识别与修复全指南

Win10/Win11下CH340/CH341驱动异常识别与修复全指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 9:21:35 阅读更多 →
RedwoodJS 官方教程开篇导读:从零构建一个数据库驱动的全栈博客应用

RedwoodJS 官方教程开篇导读:从零构建一个数据库驱动的全栈博客应用

后端前端Web框架开发工具 【免费下载链接】redwood RedwoodGraphQL 项目地址: https://gitcode.com/gh_mirrors/re/redwood 点击查看 免费下载 这篇导读基于 Redwood 仓库中 version-4.x 的教程前言 展开。RedwoodJS 是一个"有主见"(opiniona…

2026/9/24 9:20:34 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/23 9:53:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/23 9:53:40 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/23 9:53:40 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/23 9:53:40 阅读更多 →