ARCore从零到一 (3) 更换AR模型

上篇文章我们讲述了如何用Unity结合ARCore做简单的案例演示,案例里的安卓机器人很可爱,但没什么用,因为在我们实际开发中加载的都是项目自身所需要的模型,所以本章我们将讲述如何更换演示模型。

、准备模型素材

在这里,我准备了一个最喜欢的游戏角色——尤尔哈2号的fbx格式模型,并且通过mixamo给模型赋予动画 ,获得了这样的一个动画模型。大家如果需要测试用的模型,也可以在这个网站上下载。

除此之外,ARCore开发的基本环境也要搭建好,没有搭建环境的小伙伴可以参考上篇文章,了解ARCore所支持的手机型号,以及下载所需要用到的环境包。

一切准备妥当后 , OK , 那就开始吧 !

二、新建项目场景

首先,创建一个 Scene 并且为其赋予名称。

删除当前场景默认的 Prefabs ,引入ARCore

在Project窗口中,找到”GoogleARCore” -> “Prefabs” ,选择 “ARCore Device” 和 “Environmental Light” prefabs,并将这两个 prefabs拖到Hierarchy窗口中,如下图所示。

添加完这两个Prefabs之后,我们还需要添加事件系统以使我们的应用能监听和处理事件信息。

三、导入模型

在Project窗口中,右键”Assets”->”Import New Asset”-> 选择模型 “你的模型名称.fbx”, 直接点击“Import”

当我们导入模型后 ,可能会发现模型身上没有颜色 ,这是因为模型的贴图没有根据指定的位置进行绑定。

所以,我们将Materials 中的Naming设置为From Model’s Material, 然后点击 Search And Remap

现在可以看到 , 模型的贴图都已经穿上了,颜色恢复正常。

如果使出这招还不管用的话,就创建一个Material,然后将贴图赋予Material,最后将材质球拖拽到模型身上即可。

四、创建平面

我们在 Hierarchy 视图内通过右键创建一个平面,命名为 VisualDetectedPlane

在Inspector窗口中,Position一定要归0,还要确保Scale为(1,1,1),否则用代码实例化平面后会出现偏移。

我们给这个平面设置一个纹理 , 也就是我们对平面进行扫描检测时显示的网格

然后 , 需要添加平面渲染脚本

通过将Hierarchy目录拖到Assets视图 , 制作一个Prefabs , 并且删除Hierarchy目录中的VisualDetectedPlane

右键新建一个Game Object,命名为 Detected PlaceGenerater

保持选中”DetectedPlaceGenerater”,在 Inspector窗口点击 “Add Component”按钮,在搜索框中输入”Detected”,可以找到DetectedPlaneGenerator,将这个脚本绑定到我们的平面上。

最后,将我们制作好的平面Prefabs挂载到Detected PlaceGenerater对象上,平面的准备工作就做好了。

五、AppController

接下来,我们需要写一个AppController 用于处理项目中的各种情况

便于管理,先创建一个文件夹 Scripts 用来放脚本代码

然后在Assets视图的Script目录右键创建一个C# 脚本,命名为AppController

AppController的代码如下

using GoogleARCore;

using System;

using UnityEngine;

public class AppController : MonoBehaviour

{

    public Camera FirstPersonCamera;

    public GameObject prefab;

    private bool mIsQuitting = false;

    private const float mModelRotation = 180.0f;

    // Use this for initialization

    void Start()

    {

        OnCheckDevice();

    }

    private void OnCheckDevice()

    {

        throw new NotImplementedException();

    }

    // Update is called once per frame

    void Update()

    {

        UpdateApplicationLifecycle();

        Touch touch;

        if (Input.touchCount < 1 || (touch = Input.GetTouch(0)).phase != TouchPhase.Began)

        {

            return;

        }

        TrackableHit hit;

        TrackableHitFlags raycastFilter = TrackableHitFlags.PlaneWithinPolygon | TrackableHitFlags.PlaneWithinBounds;

        if (Frame.Raycast(touch.position.x, touch.position.y, raycastFilter, out hit))

        {

            if ((hit.Trackable is DetectedPlane) && Vector3.Dot(FirstPersonCamera.transform.position - hit.Pose.position, hit.Pose.rotation * Vector3.up) < 0)

            {

                Debug.Log("射线击中了DetectedPlane的背面!");

            }

            else

            {

                var FoxObject = Instantiate(prefab, hit.Pose.position, hit.Pose.rotation);

                FoxObject.transform.Rotate(0, mModelRotation, 0, Space.Self);

                var anchor = hit.Trackable.CreateAnchor(hit.Pose);

                FoxObject.transform.parent = anchor.transform;

            }

        }

    }

    private void UpdateApplicationLifecycle() { if (Session.Status != SessionStatus.Tracking) { const int lostTrackingSleepTimeout = 15; Screen.sleepTimeout = lostTrackingSleepTimeout; } else { Screen.sleepTimeout = SleepTimeout.NeverSleep; } if (mIsQuitting) { return; } }

现在我们要把这个写好的AppController脚本挂载到项目场景中,在Hierarchy窗口中,右键选择”Create Empty”,新建一个空对象,并命名为”AppController”。

然后选中这个AppController对象,在右上角 Inspector视图中点击 Add Component,找到AppController脚本进行绑定。

并且,挂载ARCore Device中的相机,以及我们所要加载的模型

六、打包测试

快捷键 Ctrl+Shift+B,对项目进行打包 , 有几点需要注意 :

1.上面的 Scenes In Build 需要选中我们此次创建的Scene;

2.Platform 选择适合自己手机的Android版本;

3.Setting里面选择系统版本 , 勾选ARCore Support;

将这个Apk发送到自己的手机,进行安装后 , 我们就可以体验加载自己的模型了。

到此,可爱的二哈就这样出现在你的眼前了,你可以通过移动自己的手机,从不同角度去欣赏她的美,感受虚拟与现实的融合,这就是AR的魅力所在吧。

你可能感兴趣的:(ARCore从零到一 (3) 更换AR模型)