通过修改HUAWEI AR Engine Demo源码,改变立体AR Logo图标颜色、初始角度、缩放比例等。

什么是WorldAR

HUAWEI AR Engine是一个在华为设备上构建增强现实应用程序的平台。WorldAR是HUAWEI AR Engine的子系统,允许您的应用:

您将建立什么

一款可以在华为手机上运行的应用程序,该程序可以通过相机扫描周围环境,识别环境中的平面,在平面上放置一个虚拟物体,并且进行选中和拖拽的操作。

您将会学到什么

硬件要求

软件要求

需要的知识点

打开HwAREngineDemo示例程序

  1. 请从示例代码中下载huawei-arengine-android-demo.zip,并解压。
  2. 启动Android Studio,然后选择"打开现有的Android Studio项目"。
  3. 导航到huawei-arengine-android-demo目录,然后确定打开,等待Android Studio完成项目同步。

按需更新您的AndroidManifest.xml

为应用申请Camera权限。

<!--声明相机权限--> <uses-permission android:name="android.permission.CAMERA" />

编译并运行示例程序

  1. Codelab中的示例程序需要在真实的物理设备运行(不支持Android Emulator),教程中使用P40 Pro运行。设备需要通过USB连接到开发机器(打开开发者选项,启用调试,待手机上跳出信任连接的主机时,点击同意)。
  2. 可以在命令行中输入如下命令验证设备是否连接到计算机。
    adb devices
    这将连接到设备并输出设备的序列号
  3. 在Android Studio中,选择HwAREngineDemo,并点击运行。然后选择您的设备作为部署目标,然后点击"确定"以在设备上启动示例应用程序,在启动的程序界面选择HwAREngineDemo。
  4. 在您的设备上允许请求的权限,这将允许应用设备启动后置相机扫描周围的环境。扫描出平面以后,点击平面,即可在真实世界中添加虚拟物体。您可以点击添加的虚拟物体,然后在平面上进行拖拽操作。

修改虚拟物体渲染参数

在world/rendering/VirtualObject.java中添加更新缩放系数和旋转度数的接口,并且在渲染前提供更新的值。

public void updateScaleFactor(float scaleFactor){ // 由外部设置缩放系数,在0.15f的缩放的基础上进行再次缩放 mScaleFactor = 0.15f * scaleFactor; } public void updateRotation(float angle) { // 由外部设置旋转角度 mRotationAngle = angle; } public float[] getModelAnchorMatrix() { float[] modelMatrix = new float[MATRIX_SIZE]; if (mArAnchor != null) { mArAnchor.getPose().toMatrix(modelMatrix, 0); } else { Matrix.setIdentityM(modelMatrix, 0); } float[] rets = new float[MATRIX_SIZE]; Matrix.multiplyMM(rets, 0, modelMatrix, 0, mModelMatrix, 0); // 将模型绕y轴旋转指定角度 Matrix.rotateM(rets, 0, mRotationAngle, 0f, 1f, 0f); // 将模型的x,y,z尺寸缩放指定的系数 if (mScaleFactor != 0) { Matrix.scaleM(rets, 0, mScaleFactor, mScaleFactor, mScaleFactor); } return rets; }

在界面上添加SeekBar

在应用的主界面上添加两个SeekBar,分别用于缩放和旋转参数的控制。在res/layout/world_java_activity_main.xml中添加如下代码。

<SeekBar android:id="@+id/scaleSeekBar" android:layout_width="300dp" android:layout_height="40dp" android:layout_alignParentEnd="true" android:min="1" android:max="400" android:progress="150"/> <SeekBar android:id="@+id/rotationSeekBar" android:layout_width="300dp" android:layout_height="40dp" android:layout_below="@id/scaleSeekBar" android:layout_alignParentEnd="true" android:min="0" android:max="360" android:progress="180"/>

由用户控制旋转和缩放系数

在world/rendering/WorldRenderManager.java获取到对应的SeekBar,然后设置到当前选中的模型上,实现代码如下:

public WorldRenderManager(Activity activity, Context context) { mActivity = activity; mContext = context; mTextView = activity.findViewById(R.id.wordTextView); mSearchingTextView = activity.findViewById(R.id.searchingTextView); // 设置旋转和缩放参数 initSeekBar(activity); } private void initSeekBar(Activity activity) { mScaleSeekBar = activity.findViewById(R.id.scaleSeekBar); mScaleSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (mSelectedObj != null) { mSelectedObj.updateScaleFactor(progress / (float) 150); } } ... }); mRotationSeekBar = activity.findViewById(R.id.rotationSeekBar); mRotationSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (mSelectedObj != null) { mSelectedObj.updateRotation(progress); } } ... }); }

编译并运行修改后的程序

在Android Studio中点击运行,然后选择您的物理设备。移动您的物理设备,开始扫描周围环境,在扫描出平面以后,点击平面,即可在真实世界中添加虚拟物体。选中该虚拟物体,然后拖动界面上的Seekbar,即可观察到模型的缩放和旋转。

干得好,您已经成功完成了Codelab并学到了:

您还可以查看示例中的其他Demo程序以了解更多的HUAWEI AR Engine的能力。

您可以从示例代码获取完整的示例代码工程,并在其基础上进行扩展。

已复制代码