管理中心
我的
指南AR EngineAR Engine服务应用开发(NDK)

应用开发(NDK)

本章将依据以C++实现的示例代码,向您介绍如何快速使用AR Engine NDK接口开发您的应用。下图为使用AR Engine NDK接口开发应用的通用流程。本章节中给出了代码中关键步骤,详细实现请参见示例代码。

运行前验证

检查当前设备是否安装了AR Engine,若已经安装则正常运行,若没有安装,App应主动跳转应用市场,请求安装AR Engine。该部分代码在Java层通过调用NDK接口实现。具体实现代码如下:

收起
自动换行
深色代码主题
复制
  1. // 调用NDK接口检测是否安装了AR Engine。
  2. boolean isInstallArEngineApk = JniInterface.isArEngineApkInstalled(mNativeApplication, getApplicationContext());
  3. if (!isInstallArEngineApk) {
  4. // ConnectAppMarketActivity.class为跳转应用市场的Activity,具体实现请参见示例代码。
  5. startActivity(new Intent(this, com.huawei.arengine.demos.common.ConnectAppMarketActivity.class));
  6. isRemindInstall = true;
  7. }

创建AR场景

配置AR场景参数,示例代码在OnResume方法中调用NDK方法来启动AR场景:

收起
自动换行
深色代码主题
复制
  1. // 创建HwArSession。
  2. HwArSession_create(env, context, &mArSession);
  3. // 创建HwArConfig来配置HwArSession。
  4. HwArConfig *arConfig = nullptr;
  5. HwArConfig_create(mArSession, &arConfig);
  6. HwArSession_configure(mArSession, arConfig);
  7. // 创建完毕,销毁HwArConfig。
  8. HwArConfig_destroy(arConfig);
  9. // 开始运行,或在pause后恢复运行状态。
  10. HwArSession_resume(mArSession);

上述代码中,使用了默认配置来配置了运动跟踪(WORLD_AR)场景,您也可以定义您需要的场景,参见NDK API。在此过程中将会检查配置的参数是否支持,并返回执行状态HwArStatus,若配置成功,则通过HwArSession_resume即可启动当前的AR场景。

帧处理

  1. AR Engine的计算结果支持每帧获取,示例代码在GLSurfaceView的OnDrawFrame方法中调用HwArSession_update方法来获取每帧数据HwArFrame,并通过HwArSession_getAllTrackables方法获取当前AR Engine捕捉到的平面(HWAR_TRACKABLE_PLANE)。
    收起
    自动换行
    深色代码主题
    复制
    1. // 获取帧数据HwArFrame。
    2. HwArSession_update(arSession, arFrame);
    3. // 根据HwArFrame对象可以获取相机对象HwArCamera。
    4. HwArCamera *arCamera = nullptr;
    5. HwArFrame_acquireCamera(arSession, arFrame, &arCamera);
    6. // 获取当前捕捉到的平面列表。
    7. HwArTrackableList *planeList = nullptr;
    8. HwArTrackableList_create(arSession, &planeList);
    9. HwArTrackableType planeTrackedType = HWAR_TRACKABLE_PLANE;
    10. HwArSession_getAllTrackables(arSession, planeTrackedType, planeList);
  2. 捕捉到平面后,您可通过设备屏幕点击平面来触发命中检测功能(HwFrame_hitTest),将hit结果新建为锚点(HwArAnchor对象)添加到HwArSession对象中持续跟踪。
    收起
    自动换行
    深色代码主题
    复制
    1. // 创建命中检测结果列表。
    2. HwArHitResultList *hitResultList = nullptr;
    3. HwArHitResult_create(mArSession, &hitResultList);
    4. // 触发命中检测功能,获取命中检测结果列表并赋值给hitResultList。
    5. HwArFrame_hitTest(mArSession, mArFrame, eventX, eventY, hitResultList);
    6. // 创建命中结果对象。
    7. HwArHitResult *arHit = nullptr;
    8. HwArHitResult_create(mArSession, &arHit);
    9. // 从命中结果列表中取出最先命中的命中结果对象,并赋值给arHitResult。
    10. GetHitResult(arHitResult, hasHitFlag, hitResultListSize, trackableType, hitResultList);
    11. // 在命中检测结果对象上创建新锚点。
    12. HwArAnchor *anchor = nullptr;
    13. HwArHitResult_acquireNewAnchor(mArSession, arHitResult, &anchor);
  3. 可根据锚点位置来绘制所需的虚拟物体,具体实现请参见示例代码。