ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

【共创稿事节】 HarmonyOS 7从 2D 到 3D:空间计算带来的到底是什么范式变革

【共创稿事节】 HarmonyOS 7从 2D 到 3D:空间计算带来的到底是什么范式变革 HarmonyOS 7从 2D 到 3D空间计算带来的到底是什么范式变革HarmonyOS 7API 26里空间计算第一次被单独拎出来当作一个板块而不是塞在图形或媒体能力里顺手提一句。很多人第一反应是UI 能转起来了“能做 3D 卡片了”但如果只把它当成视觉增强就会漏掉真正难的部分我们过去十年熟练的这套 2D 设计语言在 Z 轴出现以后有一半的默认假设都不成立了。这篇文章想聊清楚两件事系统级能力到底把哪些门槛抹平了以及为什么认知门槛和设计门槛还在原地等着你。系统把技术门槛按了下去但没按掉认知门槛先看系统这次到底给了什么。以前要在 App 里做真实的 3D 效果你得自己引入渲染引擎、自己算透视矩阵、自己处理光照模型。ArkUI 现在把这些能力做进了声明式组件里图形变换rotate带x/y/z旋转轴、translate支持z、scale、perspective视距在一套属性链里就能组合出三维效果真正的三维变换从 API 20 起提供transform3D可以直接喂一个 4x4 矩阵处理带透视的变换场景级 3DArkGraphics 3D 通过Component3D渲染 glTF 模型相机、光源、材质都在 ArkTS 侧管理端侧重建Spatial Recon Kit 支持加载 3DGS 模型MP4 / PLY / GLB空间音频AudioKit 的AudioSpatializationManager可以查询和订阅设备的空间音频渲染状态。矩阵推导、投影、着色这些过去劝退设计师和大部分应用开发者的东西现在被封装成了属性。这是技术门槛下降的真实含义。但门槛下降的是实现不是判断。系统不会告诉你一个按钮该浮在前景还是沉到背景不会告诉你把导航放到用户左侧 30 度意味着什么也不会告诉你某个动效会不会让人头晕。能不能跑是工程问题该不该这么跑是设计问题——后者才是空间计算真正的分水岭。从 X/Y 到 X/Y/Z改的不是多一个轴把 2D 界面往 Z 轴一推很多人以为只是多了个维度。实际变动的是整套坐标语义。在 2D 里屏幕的 X/Y 是位置深度没有概念。控件要么在要么不在层叠靠zIndex做遮挡排序那只是绘制顺序用户感知不到远近。到了空间里Z 轴同时承担了四种含义遮挡关系——近的挡住远的这是最表层的物理直觉距离感——元素离观察者多远直接对应重要程度和可交互程度信息层级——前景是主任务中景是上下文背景是环境注意力资源——人眼在空间中一次只能聚焦一个焦平面深度天然就是注意力分配器。也就是说Z 轴不再是渲染参数而是一种信息组织手段。这是范式变革里最需要先扭转的一点平面设计里的上/下、左/右对应的是阅读顺序空间设计里的近/远对应的是认知优先级。同一张卡片2D 和空间两种写法下面用一个商品卡片做对照。2D 版本是常见的平铺卡片空间版本把同一张卡片放进一个有纵深的 Stack 里用perspective和z位移拉开层次。import{curves}fromkit.ArkUI;EntryComponentstruct CardParadigmDemo{Stateprivatespatial:booleanfalse;BuilderProductCard(title:string,price:string){Column({space:6}){// 占位图实际项目替换为 ImageRow().width(100%).aspectRatio(1).backgroundColor(#E8EDF5).borderRadius(12)Text(title).fontSize(15).fontWeight(FontWeight.Medium).maxLines(1)Text(price).fontSize(13).fontColor(#E85D3D)}.padding(10).width(150).backgroundColor(Color.White).borderRadius(16).shadow({radius:12,color:#14000000,offsetY:4})}build(){Column(){// Stack 是空间感的起点子组件在这里共享同一块画布Stack({alignContent:Alignment.Center}){this.ProductCard(旧旅行箱,429).zIndex(0).translate({x:this.spatial?-70:-50,y:0,z:this.spatial?-60:0}).rotate({x:0,y:1,angle:this.spatial?-18:0,perspective:900}).opacity(this.spatial?0.75:1)this.ProductCard(主推商品,199).zIndex(2).translate({x:0,y:this.spatial?6:0,z:this.spatial?20:0}).rotate({x:0,y:1,angle:this.spatial?-4:0,perspective:900}).scale({x:this.spatial?1.12:1,y:this.spatial?1.12:1})this.ProductCard(新款上市,359).zIndex(1).translate({x:this.spatial?70:50,y:0,z:this.spatial?-60:0}).rotate({x:0,y:1,angle:this.spatial?16:0,perspective:900}).opacity(this.spatial?0.75:1)}.width(100%).height(320)Button(this.spatial?回到平面:进入空间).margin({top:24}).onClick((){// 一次性把三张卡片的位移/旋转/缩放补间到目标状态this.getUIContext()?.animateTo({duration:400,curve:curves.springMotion(0.8,20)},(){this.spatial!this.spatial;});})}.width(100%).height(100%).justifyContent(FlexAlign.Center)}}这段代码里spatial这个布尔量切换的不是有没有动画而是三张卡片在 Z 轴上的相对关系主推商品被拉到z: 20并放大两侧商品退到z: -60并降低不透明度。perspective: 900提供视距——值越小透视越夸张值越大越接近正交投影。想深入的话perspective和centerZ组合还能做出绕自己所在平面翻转的效果。这个例子里真正决定信息层级的不是颜色也不是字号而是 z 位置的相对排序。这就是空间 UI 和 2D UI 最本质的区别。2D UI 与空间 UI 的设计要素对照把设计要素拆开看差异更直观设计要素2D 平面 UI空间 UI变化实质信息呈现靠网格、留白、分区组织信息量受单屏面积限制靠距离、遮挡、景深组织信息可分层堆叠在纵深上从平面排布变成纵深编排导航固定坐标系页面跳转即视角切换视角本身可移动导航可以是走过去或拉近看从切换页面变成移动观察点反馈颜色变化、缩放、位移幅度小且以像素为单位可叠加深度弹出、材质高光、空间音效、轻微透视偏移反馈通道从 1 个扩到 3 个以上状态选中/禁用/加载用样式区分除样式外还需区分在视野内/外“可触及/过远”状态维度与用户姿态相关层级zIndex只决定绘制顺序Z 位置决定真实远近参与遮挡与透视层级从视觉排序变成空间事实交互输入点击、滑动、长按触点即目标视线、手势、头部姿态协同目标需要选中过程输入从直接点变成先瞄准再动作这张表里最容易被低估的是最后两列。层级和交互输入这两栏直接决定了 2D 那套所见即所点的直觉不能照搬。案例设置中心从列表变成分层空间拿最常见的设置中心举例。2D 版本是一列设置项用户滚动、点进去、返回。空间化之后可以让一级入口作为前景层平铺二级详情沉到中景环境/预览作为背景层。2D 路径空间路径用户进入设置中心选择导航方式滚动列表点击条目页面跳转 push 详情页返回 pop 回列表视线/手势选中前台卡片卡片沿 Z 轴前移并放大二级详情在背景层淡入手势后推 返回上一层卡片回落到原始 z 位置两条路径的差别不只是动效。2D 路径里返回是撤销一次操作空间路径里返回是退后一步。后者更接近人在物理空间里的直觉代价是用户必须始终知道自己在哪一层——这正是设计门槛系统替不了你。再往前一步如果这个设置中心接入 3DGS 场景比如相机类 App 让用户在实景空间里调整参数设置项就不再是列表而是悬浮在环境里的锚点。Spatial Recon Kit 加载 3DGS 模型后配合 ArkGraphics 3D 的相机和光源锚点会随视角变化产生合理的透视关系。这类场景里设置项的空间位置本身就是语义贴近实物的参数比如滤镜强度就该靠近那件实物。几条小经验先问Z 轴在这个页面承担什么职责再动手写代码。如果答案只是好看,大概率不该上 3D。把深度当层级用别当装饰用。让用户在纵深里找到方向比让元素飘起来更有价值。2D 到 3D 的第一步通常是分层的 Stack不是加载一个 3D 模型。绝大多数页面用层叠 透视就够了。透视值perspective要统一。同屏元素用不同视距会让人眼判断不了它们的远近关系。动效时间控制在 300~500ms。空间位移过大又太慢比平面动画更容易引发不适。注意一下下哦把zIndex当成 Z 轴。zIndex只影响绘制顺序不产生透视和遮挡的物理感。要真实纵深得用translate的z配合perspective。rotate和scale的锚点打架。两个属性都设centerX/centerY时以属性链里后设置的为准。写链式调用时别想当然。透视中心默认在组件自身。做整屏空间感时往往需要把旋转锚点对齐到屏幕中心或观察者位置否则所有元素各转各的。忽略可触及范围。平面里屏幕边缘还能点空间里远处的控件既难点中也不该高频使用。只做视觉不做状态。元素进出视野、被遮挡、过远这些状态如果没设计用户会以为自己操作失败了。空间计算的门槛一半在怎么写另一半在为什么这么写。系统把前一半按低了后一半还得靠自己。#鸿蒙 #HarmonyOS 7API 26
返回列表