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/1 10:03:06 阅读更多 →
总纲:把不确定性从 LLM 侧转移到工程侧

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

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

2026/8/1 9:30:41 阅读更多 →
电容器动态分析:电量不变模型原理与典型例题详解

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

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

2026/7/29 5:34:18 阅读更多 →

最新新闻

Windows Phone模拟器WPR Alpha部署与XAP应用运行实战指南

Windows Phone模拟器WPR Alpha部署与XAP应用运行实战指南

1. 项目缘起:为何在今天还要折腾Windows Phone模拟器?如果你是一位移动应用开发者,或者对移动操作系统历史有浓厚兴趣的爱好者,那么“Windows Phone”这个名字一定不会陌生。这个由微软倾力打造,却最终在移动市场浪潮中…

2026/8/2 1:53:39 阅读更多 →
如何免费提升网盘下载速度:9大平台直链解析工具完全指南

如何免费提升网盘下载速度:9大平台直链解析工具完全指南

如何免费提升网盘下载速度:9大平台直链解析工具完全指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天…

2026/8/2 1:53:39 阅读更多 →
【WebFlux】第八篇 —— 自定义调度器

【WebFlux】第八篇 —— 自定义调度器

Flux / Mono 自定义线程调度 线程调度主要讲(Schedulers / publishOn / subscribeOn)前置:你已经学过 handle、generate、create、buffer、limitRate、doOnXXX、onXxx、Sinks。 本文聚焦「响应式代码跑在哪些线程上」——这是把响应式程序从「…

2026/8/2 1:53:39 阅读更多 →
如何快速搭建私人云游戏平台:Sunshine游戏串流终极指南

如何快速搭建私人云游戏平台:Sunshine游戏串流终极指南

如何快速搭建私人云游戏平台:Sunshine游戏串流终极指南 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 想在平板上畅玩PC游戏大作?想在客厅电视上体验桌面级…

2026/8/2 1:53:39 阅读更多 →
2026世界模型与持续学习突破:开发者如何构建记忆增强Agent

2026世界模型与持续学习突破:开发者如何构建记忆增强Agent

# 2026世界模型与持续学习突破:开发者如何构建记忆增强Agent## 一、背景:从静态Transformer到动态World Models2026年4月,DeepMind CEO Demis Hassabis在20VC播客中掷地有声地指出:“AI的下一个巨大进展——以及通往AGI的路径——…

2026/8/2 1:53:39 阅读更多 →
3步掌握macOS完整安装器下载实践:从Apple服务器直连获取Big Sur系统包

3步掌握macOS完整安装器下载实践:从Apple服务器直连获取Big Sur系统包

3步掌握macOS完整安装器下载实践:从Apple服务器直连获取Big Sur系统包 【免费下载链接】DownloadFullInstaller macOS application written in SwiftUI that downloads installer pkgs for the Install macOS Big Sur application. 项目地址: https://gitcode.com…

2026/8/2 1:52:38 阅读更多 →

日新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/2 0:00:38 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/2 0:00:38 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/2 0:00:38 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/2 0:00:38 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/2 0:00:38 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/2 0:00:38 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/1 0:00:48 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/1 0:00:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/2 0:23:22 阅读更多 →