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

什么是WorldAR?

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

您将建立什么

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

您将会学到什么

硬件要求

软件要求

打开HwAREngineDemo示例程序

  1. 从下载的示例代码中的目录解压出HwAREngineDemo。
  2. 启动HUAWEI DevEco Studio,然后选择"打开现有的DevEco Studio项目"。
  3. 导航到HwAREngineDemo目录,然后确定打开,等待DevEco Studio完成项目同步。

按需更新您的AndroidManifest.xml

设置为AR Engine为Required并且具有Camera权限和连接网络权限。

<!--声明相机权限和网络访问权限--> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.INTERNET" /> <application ... <!--声明AREngine必须--> <meta-data android:name="com.huawei.ar.engine" android:value="required" /> </application>

编译并运行示例程序

  1. 本codelab需要真实的物理设备运行(不支持Android Emulator)。设备需要通过USB连接到开发机器(打开开发者选项,启用调试,待手机上跳出信任连接的主机时,点击同意)。
  2. 可以在命令行中输入如下命令以验证设备是否连接到计算机:
    adb devices
  3. 这将连接到设备并输出设备的序列号。
    在DevEco Studio中,选择HwAREngineDemo,并点击运行。然后选择您的设备作为部署目标,然后单击"确定"以在设备上启动示例应用程序,在启动的程序界面选择HwAREngineDemo。

  4. 在您的设备上允许请求的权限,这将允许应用设备启动后置相机启动扫描周围的环境。扫描出平面以后,点击平面,即可在真实世界中添加虚拟物体。您可以点击添加的虚拟物体,然后在平面上进行拖拽操作。

修改虚拟物体渲染参数

在WorldAR/VirtualObject.java中添加更新缩放系数和旋转度数的接口,并且在渲染前提供更新的值:
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中添加如下代码:
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"/>

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

在WorldAR/rendering/RenderUtil.java获取到对应的SeekBar,然后设置到对应的当前选中的模型上:
RenderUtil.java

public RenderUtil(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); } } ... }); }

编译并运行修改后的程序

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

干得好,你已经成功完成了codelab并学到了:

您还可以查看示例中的其他demo程序以了解更多的AREngine的能力。

您可以阅读下面链接,了解更多相关的信息。

已复制代码