[HarmonyOS Next示例代码]AREngine

HarmonyOS next 示例代码全集

AREngine_SampleCode_Clientdemo_cpp: 本示例通过调用AR引擎服务接口,结合XComponent和OpenGL/EGL,将识别到的点云信息,平面信息等显示在屏幕上。

AREngine

介绍

本示例展示了AREngine提供的平面检测,运动跟踪,环境跟踪和碰撞检测能力。

效果预览

应用首页识别平面通过碰撞检测显示模型

  1. 在手机的主屏幕,点击“ArSample”,启动应用,在主界面可见“ArWorld”按钮。
  2. 点击“ArWorld”按钮,拉起ArEngine平面识别界面,对准地面,桌面,墙面等平面缓慢移动扫描,即可识别到平面并绘制到屏幕上。
  3. 识别出平面后,点击平面上某个点,通过AREngine提供的命中检测的能力,会在屏幕被点击位置放置一个3d模型。

具体实现

集成服务

使用AREngine服务接口需要在CMakeLists中引入依赖:

find_library(
arengine-lib
libarengine_ndk.z.so
)
target_link_libraries(entry PUBLIC
${arengine-lib}
)

使用时引入头文件 #include "ar/ar_engine_core.h"

代码结构解析

├─entry/src/main
│  module.json5                                            // 模块的配置文件。              
│ 
├─cpp                                                      // C++代码区。
│  │  CMakeLists.txt                                       // CMake配置文件。
│  │
│  ├─src
│  │  │  app_napi.h                                        // 业务侧虚基类。
│  │  │  global.cpp                                        // napi初始化。
│  │  │  global.h                                          // C++和ets接口映射配置。
│  │  │  module.cpp                                        // C++接口注册。
│  │  │  napi_manager.cpp                                  // C++接口实现。
│  │  │  napi_manager.h
│  │  │
│  │  ├─graphic                                            // 渲染相关工具类
│  │  │
│  │  ├─utils                                              // util工具类。                                                               
│  │  │
│  │  └─world                                              // ArWorld模块。
│  │          world_ar_application.cpp                     // ArWorld模块接口实现。
│  │          world_ar_application.h
│  │          world_background_renderer.cpp                // 背景渲染。
│  │          world_background_renderer.h
│  │          world_object_renderer.cpp                    // 3D物体渲染。
│  │          world_object_renderer.h
│  │          world_plane_renderer.cpp                     // 平面渲染。
│  │          world_plane_renderer.h
│  │          world_render_manager.cpp                     // 每一帧渲染。
│  │          world_render_manager.h
│  │
│  ├─thirdparty                                            // 渲染相关三方库
│  └─types                                                 // 接口存放文件夹。
│      └─libentry
│              index.d.ts                                  // 接口文件。
│              oh-package.json5                            // 接口注册配置文件。
│
├─ets                                                      // ets代码区。
│  ├─entryability
│  │      EntryAbility.ets                                 // 程序入口类。
│  │
│  ├─pages
│  │      ArWorld.ets                                      // ArWorld界面。
│  │      Selector.ets                                     // 主界面。
│  │
│  └─utils
│          Logger.ets                                      // ets日志打印。
│
└─resources                                                // 资源文件目录。

创建会话和帧数据相关接口

AREngine_ARStatus HMS_AREngine_ARConfig_Create(const AREngine_ARSession *session, AREngine_ARConfig **outConfig);
void HMS_AREngine_ARConfig_Destroy(AREngine_ARConfig *config);

AREngine_ARStatus HMS_AREngine_ARSession_Create(void *env, void *applicationContext, AREngine_ARSession **outSessionPointer);
AREngine_ARStatus HMS_AREngine_ARSession_Configure(AREngine_ARSession *session, const AREngine_ARConfig *config);
void HMS_AREngine_ARSession_Destroy(AREngine_ARSession *session);

AREngine_ARStatus HMS_AREngine_ARFrame_Create(const AREngine_ARSession *session, AREngine_ARFrame **outFrame);
void HMS_AREngine_ARFrame_Destroy(AREngine_ARFrame *frame);

平面识别相关接口:

AREngine_ARStatus HMS_AREngine_ARTrackableList_Create(const AREngine_ARSession *session, AREngine_ARTrackableList **outTrackableList);
AREngine_ARStatus HMS_AREngine_ARSession_GetAllTrackables(const AREngine_ARSession *session, AREngine_ARTrackableType filterType, AREngine_ARTrackableList *outTrackableList);
AREngine_ARStatus HMS_AREngine_ARTrackableList_GetSize(const AREngine_ARSession *session, const AREngine_ARTrackableList *trackableList, int32_t *outSize);
AREngine_ARStatus HMS_AREngine_ARTrackableList_AcquireItem(const AREngine_ARSession *session, const AREngine_ARTrackableList *trackableList, int32_t index, AREngine_ARTrackable **outTrackable);
void HMS_AREngine_ARTrackableList_Destroy(AREngine_ARTrackableList *trackableList);

AREngine_ARStatus HMS_AREngine_ARTrackable_GetTrackingState(const AREngine_ARSession *session, const AREngine_ARTrackable *trackable, AREngine_ARTrackingState *outTrackingState);
void HMS_AREngine_ARTrackable_Release(AREngine_ARTrackable *trackable);

AREngine_ARStatus HMS_AREngine_ARPlane_AcquireSubsumedBy(const AREngine_ARSession *session, const AREngine_ARPlane *plane, AREngine_ARPlane **outSubsumedBy);
AREngine_ARStatus HMS_AREngine_ARPlane_AcquireSubsumedBy(const AREngine_ARSession *session, const AREngine_ARPlane *plane, AREngine_ARPlane **outSubsumedBy);
AREngine_ARStatus HMS_AREngine_ARPlane_GetCenterPose(const AREngine_ARSession *session, const AREngine_ARPlane *plane, AREngine_ARPose *outPose);
AREngine_ARStatus HMS_AREngine_ARPlane_GetPolygonSize(const AREngine_ARSession *session, const AREngine_ARPlane *plane, int32_t *outPolygonSize);
AREngine_ARStatus HMS_AREngine_ARPlane_GetPolygon(const AREngine_ARSession *session, const AREngine_ARPlane *plane, float *outPolygonXz, int32_t polygonSize);
AREngine_ARStatus HMS_AREngine_ARPlane_IsPoseInPolygon(const AREngine_ARSession *session, const AREngine_ARPlane *plane, const AREngine_ARPose *pose, int32_t *outPoseInPolygon);

碰撞检测相关接口:

AREngine_ARStatus HMS_AREngine_ARHitResultList_Create(const AREngine_ARSession *session, AREngine_ARHitResultList **outHitResultList);
AREngine_ARStatus HMS_AREngine_ARHitResultList_GetSize(const AREngine_ARSession *session, const AREngine_ARHitResultList *hitResultList, int32_t *outSize);
AREngine_ARStatus HMS_AREngine_ARHitResultList_GetItem(const AREngine_ARSession *session, const AREngine_ARHitResultList *hitResultList, int32_t index, AREngine_ARHitResult *outHitResult);
void HMS_AREngine_ARHitResultList_Destroy(AREngine_ARHitResultList *hitResultList);

AREngine_ARStatus HMS_AREngine_ARHitResult_AcquireNewAnchor(AREngine_ARSession *session, AREngine_ARHitResult *hitResult, AREngine_ARAnchor **outAnchor);
AREngine_ARStatus HMS_AREngine_ARHitResult_GetHitPose(const AREngine_ARSession *session, const AREngine_ARHitResult *hitResult, AREngine_ARPose *outPose);
AREngine_ARStatus HMS_AREngine_ARHitResult_AcquireTrackable(const AREngine_ARSession *session, const AREngine_ARHitResult *hitResult, AREngine_ARTrackable **outTrackable);
void HMS_AREngine_ARHitResult_Destroy(AREngine_ARHitResult *hitResult);

运动跟踪能力图文介绍:

AR Engine通过获取终端设备摄像头数据,结合图像特征和惯性传感器(IMU),计算设备位置(沿x、y、z轴方向位移)和姿态(绕x、y、z轴旋转),实现6自由度(6DoF)运动跟踪能力。

6DoF运动跟踪能力示意图(红色线代表设备运动方向) 

相关权限

使用相机,加速度传感器和陀螺仪传感器权限,相机权限由应用申请。

依赖

依赖设备具备相机,加速度传感器和陀螺仪传感器能力。

约束与限制

  1. 本实例仅支持标准系统上运行,支持设备:华为手机(mate 60, mate 60pro, mate x5)。
  2. DevEco Studio版本:DevEco Studio NEXT Developer Beta2及以上。
  3. HarmonyOS SDK版本:HarmonyOS NEXT Developer Beta2及以上。
  • 18
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值