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的魅力所在吧。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容

  • 上篇文章我们演示了如何用ARCore加载自己的模型,但是我们会发现 , 虽然小姐姐加载出来了 , 但她只是孤零零的...
    子羽歌阅读 607评论 0 0
  • 我们发现加载的AR模型无法通过触屏进行交互,如果想让模型实现旋转、放大、缩小,我们又该如何实现呢? 一、了解Uni...
    子羽歌阅读 1,748评论 0 0
  • Unity3D塔防开发流程 配置环境及场景搭建 编程语言:C#,略懂些许设计模式,如果不了解设计模式,BUG Mo...
    Grape_葡萄阅读 2,934评论 1 3
  • 注:内容来自阮一峰老师的书 ECMAScript 6 入门 1.属性的简洁表示 上面代码表明,ES6 允许在对象之...
    第八共同体阅读 548评论 0 0
  • 童童三月三日做的阑尾炎手术。这一次,小家伙受苦了, 刚开始喝了一天稀饭,吃了两天面条,近一个礼拜不能正常饮食,加上...
    童童和安安阅读 140评论 0 0