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/8/30 17:50:21 阅读更多 →
总纲:把不确定性从 LLM 侧转移到工程侧

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

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

2026/9/4 3:36:31 阅读更多 →
电容器动态分析:电量不变模型原理与典型例题详解

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

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

2026/9/4 5:03:10 阅读更多 →

最新新闻

ARM服务器OpenSSL编译指南:制作aarch64便携包解决部署难题

ARM服务器OpenSSL编译指南:制作aarch64便携包解决部署难题

简介:本资源是为嵌入式与ARM平台开发者提供的aarch64架构专用OpenSSL交叉编译成果包,面向需在64位ARM设备(如服务器、边缘计算终端、国产化硬件)上部署安全通信能力的中高级工程师。压缩包内含84个文件,以libcrypto.so…

2026/9/4 12:47:45 阅读更多 →
半导体制冷片实战指南:从原理到安全集成,破解YYX7MAX散热方案

半导体制冷片实战指南:从原理到安全集成,破解YYX7MAX散热方案

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

2026/9/4 12:47:45 阅读更多 →
xiaozhi-esp32 + ML307 4G 模块:让 ESP32 设备插上 SIM 卡就上线

xiaozhi-esp32 + ML307 4G 模块:让 ESP32 设备插上 SIM 卡就上线

xiaozhi-esp32 ML307 4G 模块:让 ESP32 设备插上 SIM 卡就上线 【免费下载链接】xiaozhi-esp32 An MCP-based chatbot | 一个基于MCP的聊天机器人 项目地址: https://gitcode.com/GitHub_Trending/xia/xiaozhi-esp32 想把 ESP32 语音助手放到公园、仓库或车…

2026/9/4 12:47:45 阅读更多 →
三层认知模型:从技术表象到系统根源的问题解决思维

三层认知模型:从技术表象到系统根源的问题解决思维

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

2026/9/4 12:47:45 阅读更多 →
Kimi    LeetCode 45. 跳跃游戏 II Python3实现

Kimi LeetCode 45. 跳跃游戏 II Python3实现

这是 LeetCode 45「跳跃游戏 II」的 Python3 实现,采用贪心算法,时间复杂度 O(n),空间复杂度 O(1)。 class Solution:def jump(self, nums: List[int]) -> int:n len(nums)if n 1:return 0jumps 0 # 已使用的跳跃次数current_…

2026/9/4 12:47:45 阅读更多 →
小团队AI落地四步走:代码审查、知识问答、UI测试与日志脱敏实战

小团队AI落地四步走:代码审查、知识问答、UI测试与日志脱敏实战

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

2026/9/4 12:46:44 阅读更多 →

日新闻

ESP32S2嵌入式收音机全栈开发实战指南

ESP32S2嵌入式收音机全栈开发实战指南

简介:本资源是一个基于ESP32-S2芯片的嵌入式综合实践项目,面向本科毕业设计、课程设计及实训开发人员,聚焦网络收音机与FM收音机双模功能实现,融合ESP-IDF框架、ESP-ADF音频开发库与LVGL图形界面库,具备完整软硬件协同…

2026/9/4 0:00:28 阅读更多 →
WorkBuddy+Python实战:从零搭建商品库存管理系统

WorkBuddy+Python实战:从零搭建商品库存管理系统

最近想自己动手做一个“商品库存管理系统”的人变多了。很多开网店、做小团队ERP选型、或者刚学Python的读者,不是不想用系统,而是被传统开发路径劝退了:要装数据库,要写后端接口,要学前端页面,还要考虑多人…

2026/9/4 0:00:28 阅读更多 →
旅游情感分析:基于Python的垂直场景深度解析

旅游情感分析:基于Python的垂直场景深度解析

简介:本资源是一份面向计算机专业本科生的毕业设计实践项目,聚焦旅游行业真实场景,解决旅游平台对用户评论情感倾向自动识别与管理的需求。系统基于Python 3.9.11与Anaconda环境构建,集成携程、马蜂窝双平台爬虫模块,并…

2026/9/4 0:00:28 阅读更多 →

周新闻

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

每年校招季我都会接触不少准备数据库方向笔试的同学,看到最多的状态就是:简历上写着“熟悉 MySQL”“了解索引优化”,一碰到数据库管理工程师的笔试卷,却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

2026/9/4 10:54:27 阅读更多 →
数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

1. 这不是“背公式”的事:时间参数到底在约束什么你翻过数字电路教材,一定见过这两个词:建立时间(Setup Time)和保持时间(Hold Time)。它们常被并列写在触发器(Flip-Flop&#xff09…

2026/9/3 4:22:01 阅读更多 →
蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

1. 项目缘起:从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目,我至今记忆犹新。它没有直接给出一个花哨的名字,而是用“超声波测距机”这个朴实无华的功能描述,精准地勾勒出了考核的核心。对于当时备赛的我而言…

2026/9/3 4:22:59 阅读更多 →

月新闻

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

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

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

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

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

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

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

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

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

2026/9/4 9:37:01 阅读更多 →