news 2026/5/1 4:59:10

鸿蒙加载3D图形

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
鸿蒙加载3D图形

最近很火的Remy大家有没有体验,平面的2D图片已经不能满足用户,未来可能会更多的相机支持拍摄3D照片。今天来了解一下鸿蒙的3D图形展示。我找了个汽车的3D模型资源,看一下展示效果。由于能力有限,本文只实现修改相机旋转角度。

ArkGraphics 3D(方舟3D图形)基于轻量级的3D引擎以及渲染管线为开发者提供基础3D场景绘制能力,供开发者便捷、高效地构建3D场景并完成渲染。

一个3D场景通常由光源、相机、模型三个关键部分组成。

光源:为整个3D场景提供光照,使得3D场景中的模型变得可见。与真实物理场景一致,没有光源场景将变得一片漆黑,得到的渲染结果也就是全黑色。
相机:为3D场景提供一个观察者。3D渲染本质上是从一个角度观察3D场景并投影到2D图片上。没有相机就没有3D场景的观察者,也就不会得到渲染结果。
模型:3D场景中的模型用于描述对象的形状、结构和外观,一般具有网格、材质、纹理、动画等属性。一些常见的3D模型格式有OBJ、FBX、glTF等。
模型加载后,可以通过ArkUI的Component3D渲染组件呈现给用户。

Component3D(sceneOptions?: SceneOptions)

Component3D组件配置选项 SceneOptions

名称说明
scene3D模型资源文件
modelType3D场景显示合成方式

设置场景 Scene

属性

名称说明
environment环境对象
animations动画数组
root3D场景树根结点

方法

名称说明
load待加载的模型文件资源路径
getNodeByPath通过路径获取结点
getResourceFactory获取场景资源工厂对象
destroy销毁场景
importNode从其他场景导入结点
importScene导入其他场景
renderFrame控制渲染帧率
createComponent在指定节点上创建新的组件
getComponent获取对应的组件实例
getDefaultRenderContext当前对象关联的渲染上下文

创建3D场景资源 SceneResourceFactory

名称说明
createCamera根据结点参数创建相机
createLight根据结点参数和灯光类型创建灯光
createNode创建结点
createMaterial根据场景资源参数和材质类型创建材质
createEnvironment根据场景资源参数创建环境
createGeometry根据场景结点参数和网格数据创建几何对象
createEffect根据特效参数创建特效对象

相机类型,Camera继承自Node

Node属性

名称类型说明
positionPosition3结点位置
rotationQuaternion结点旋转角度
scaleScale3结点缩放
visibleboolean结点是否可见
nodeTypeNodeType结点类型
layerMaskLayerMask结点的图层掩码
pathstring结点路径
parentNode结点的父结点
childrenContainer结点的子结点

Camera属性

名称说明
fov视场,取值在0到π弧度之间
nearPlane近平面,取值大于0
farPlane远平面,取值大于nearPlane
enabled是否使能相机
postProcess后处理设置
effects应用于相机输出的后处理特效
clearColor将渲染目标(render target)清空后的特定颜色
renderingPipeline控制渲染管线

3D空间中旋转的数学结构 Quaternion(四元数)

用于表示3D空间中旋转的数学结构。与传统的欧拉角相比,四元数在数值稳定性和避免万向节锁方面具有优势。
四元数的形式是 (x, y, z, w),由1 个实部(w)+ 3 个虚部(x/y/z) 组成,核心对应 3D 旋转的两个关键信息:
x/y/z:表示旋转轴的方向(比如绕 Y 轴旋转时,x=0、z=0,y≠0);
w:表示绕这个轴旋转的角度(具体是 w = cos(θ/2),θ 是旋转的总角度,单位弧度)
旋转 = 绕 (x,y,z) 这个方向的轴,旋转 2×arccos(w) 度

实现源码

import { Scene, Camera, Node, SceneResourceFactory, Quaternion } from '@kit.ArkGraphics3D'; @Entry @ComponentV2 struct GSNodeTest { @Local sceneOpt: SceneOptions | null = null; @Local scene: Scene | null = null; @Local cam: Camera | null = null; @Local node: Node | null | undefined = null; @Local cameraZ: number = 10 @Local rotationX: number = 0 @Local rotationY: number = 0 @Local rotationZ: number = 0 aboutToAppear(): void { this.init(); } init(): void { if (this.scene == null) { // 加载场景资源,支持.gltf和.glb格式,路径和文件名可根据项目实际资源自定义 Scene.load($rawfile("glbs/car.glb")) .then(async (result: Scene) => { this.scene = result; let rf: SceneResourceFactory = this.scene.getResourceFactory(); // 创建相机 this.cam = await rf.createCamera({ "name": "Camera" }); // 设置合适的相机参数 this.cam.enabled = true; // 设置相机的位置 this.cam.position.z = this.cameraZ; this.sceneOpt = { scene: this.scene, modelType: ModelType.SURFACE } as SceneOptions; this.node = this.scene.root!.children.get(0) }).catch((error: Error) => { console.error('Scene load failed:', error); }); } } eulerToQuaternion(xDeg:number, yDeg:number, zDeg:number):Quaternion { // 步骤1:角度转弧度(Math.cos/sin要求弧度制) const xRad = xDeg * Math.PI / 180; // 绕X轴旋转弧度 const yRad = yDeg * Math.PI / 180; // 绕Y轴旋转弧度 const zRad = zDeg * Math.PI / 180; // 绕Z轴旋转弧度 // 步骤2:计算半角的正弦/余弦(简化公式) const cx = Math.cos(xRad / 2); const sx = Math.sin(xRad / 2); const cy = Math.cos(yRad / 2); const sy = Math.sin(yRad / 2); const cz = Math.cos(zRad / 2); const sz = Math.sin(zRad / 2); // 步骤3:按XYZ旋转顺序计算四元数(标准欧拉角转四元数公式) const w = cx * cy * cz + sx * sy * sz; const x = sx * cy * cz - cx * sy * sz; const y = cx * sy * cz + sx * cy * sz; const z = cx * cy * sz - sx * sy * cz; return { x, y, z, w }; } build() { Column() { Row() { Column() { if (this.sceneOpt) { // 通过Component3D呈现3D场景 Component3D(this.sceneOpt) } else { Text("Loading···") } }.width('100%') }.height('60%') Column() { Row({ space: 10 }) { Text('相机高度:' + this.cameraZ) Slider({ value: this.cameraZ, min: 1, max: 30, style: SliderStyle.OutSet }).width('50%') .onChange((value: number) => { this.cameraZ = value; this.cam!.position.z = value }) } Row({ space: 10 }) { Text('X轴旋转:' + this.rotationX) Slider({ value: this.rotationX, min: 0, max: 360, style: SliderStyle.OutSet }).width('50%') .onChange((value: number) => { this.rotationX = value; this.node!.rotation = this.eulerToQuaternion(this.rotationX,this.rotationY,this.rotationZ) }) } Row({ space: 10 }) { Text('Y轴旋转:' + this.rotationY) Slider({ value: this.rotationY, min: 0, max: 360, style: SliderStyle.OutSet }).width('50%') .onChange((value: number) => { this.rotationY = value; this.node!.rotation = this.eulerToQuaternion(this.rotationX,this.rotationY,this.rotationZ) }) } Row({ space: 10 }) { Text('Z轴旋转:' + this.rotationZ) Slider({ value: this.rotationZ, min: 0, max: 360, style: SliderStyle.OutSet }).width('50%') .onChange((value: number) => { this.rotationZ = value; this.node!.rotation = this.eulerToQuaternion(this.rotationX,this.rotationY,this.rotationZ) }) } } } } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 11:30:01

Joplin完全指南:5步打造你的专属知识管理系统

Joplin完全指南:5步打造你的专属知识管理系统 【免费下载链接】joplin Joplin 是一款安全笔记记录与待办事项应用,具备跨平台同步功能,支持 Windows、macOS、Linux、Android 和 iOS 平台。 项目地址: https://gitcode.com/GitHub_Trending/…

作者头像 李华
网站建设 2026/4/20 17:13:55

开拓者-正义之怒动物伙伴培养终极指南:5个关键升级技巧

还在为动物伙伴的成长路线而烦恼吗?是否觉得自己的伙伴在关键时刻总是"掉链子"?本文将通过全新的"能力图谱分析法",为你揭示动物伙伴培养的核心奥秘,让你的召唤兽成为战场上最可靠的力量支柱。🎯 …

作者头像 李华
网站建设 2026/4/23 14:33:12

Vencord终极指南:轻松解锁Discord隐藏管理功能

Vencord终极指南:轻松解锁Discord隐藏管理功能 【免费下载链接】Vencord The cutest Discord client mod 项目地址: https://gitcode.com/GitHub_Trending/ve/Vencord 在Discord社区管理中,ModView角色显示问题一直是困扰众多用户的痛点。本文将为…

作者头像 李华
网站建设 2026/4/23 11:07:19

10、数据中心整合:从架构到实践的全面解析

数据中心整合:从架构到实践的全面解析 数据中心制冷优化 数据中心的制冷是保障设备稳定运行的关键环节。随着设备性能提升,数据中心的热负载持续快速上升,因此有效的制冷系统至关重要。 常见的制冷系统有冷液和干式空调系统。数据中心通常采用冷热通道布局,多数机架采用…

作者头像 李华
网站建设 2026/4/22 1:13:28

35、网络设备与线缆:从基础到高级的全面解析

网络设备与线缆:从基础到高级的全面解析 在当今数字化的时代,网络已经成为了人们生活和工作中不可或缺的一部分。而构建一个稳定、高效的网络,离不开各种网络设备和线缆的支持。本文将详细介绍网络中常见的设备,如集线器、交换机、路由器,以及不同类型的网络线缆,包括铜…

作者头像 李华
网站建设 2026/4/16 10:50:24

终极Windows虚拟显示器配置指南:轻松实现多屏扩展与直播推流

终极Windows虚拟显示器配置指南:轻松实现多屏扩展与直播推流 【免费下载链接】Virtual-Display-Driver Add virtual monitors to your windows 10/11 device! Works with VR, OBS, Sunshine, and/or any desktop sharing software. 项目地址: https://gitcode.com…

作者头像 李华