Vuforia实践开发案例之AR汽车


大家好,我是广州幻梦互动的半透明,最近由于有朋友需要学习制作AR项目,在此我分享一下一些有用的制作经验,写得不好还请轻轻地喷。

原创文章,请勿转载。感谢!!


本案例适合人群

必须会Unity3D引擎基础,对C#脚本编程有一定经验


目的

1 学习Vuforia的一些基本只是和操作
2 学习如何改变材质的颜色和透明度


开发平台

unity5.6.0f3


使用插件

本案列使用前还必须导入以下这些插件
CarPaintShadersAsset
一款汽车材质插件,里面含有汽车模型和汽车Shader
Vuforia
使用vuforia-unity-6-2-10版本,稳定性十分高,但是不免费,免费版本有水印


项目最终效果

项目最终效果

创建新应用

如果你是第一次创建AR项目,可以先到Vuforia官网注册账号后,点击Develop进入开发者中心,创建一个新应用,应用名为ARCar,如下图

创建新应用

创建识别图

然后点击TargetManager创建一个新的识别图,图片你可以选择一张适合的汽车图片,当你上传完成后,如下图


创建识别图

在识别图面板这里,有个Rating属性,当出现5个星星的时候,就证明这张图片能被识别的程度越高,反之星星数越低的图片,识别程度也越低,大家上传的时候注意一下。关于如何制作识别图可以参考这篇文章。
最后我们点击Download Database(All)按钮下载Unity Editor包保存为ARCar.unitypacakge.


下载Unity Editor包

项目制作

打开Unity引擎并创建一个新项目,命名为ARCar,先在playersetting把项目切换为安卓平台,然后将vuforia-unity-6-2-10.unitypackage、ARCar.unitypacakge、Car Paint Shaders Asset.unitypackage 导入到项目里,经过一轮认真的导入后,如下图:


项目图

导入完成后,我们在Project面板处右键建立项目的文件夹,命名为ARCar,再ARCar下面再新建Scenes,Scripts文件夹,这样目的是可以方便管理,不会和其他插件文件搞到一起而找不到位置,项目文件夹如下图


Paste_Image.png

场景制作

在Scenes文件夹右键,新建一个Scene命名为ARCarScene,双击进入该场景,将里面的默认MainCamera和Directional Light物体删掉,打开Vuforia文件夹,在Prefabs文件夹里我们可以看到里面有一个ARCamera组件和ImageTarget组件,分别将两个组件拖到场景里面,如下图


场景制作

点击ARCamera物体,我们在属性面板处可以看到一个open vufoira configuration 的按钮,点击后我们会看到一个vuforia的配置表,在App License Key处填入我们注册App的时候那串License Key ,如下图


填写License Key

然后我们在配置表里找到Data Set 这个选项,开启我们ARCar的数据集,这一步非常重要,很多新手都会忘记开启数据集,导致扫描后不会出现任何物体,开启效果如图
开启Data Set

好了,最后一步我们选中场景中的ImageTarget物体,然后看属性面板,将DataSet选择我们自己的数据集后,配置就完成了,如下图


设置ImageTarget数据

设置汽车模型

在CarPaintShadersAsset文件夹里,找到Prefabs文件夹,再找到Modle文件夹,将里面的Car组件拖到ImageTarget节点下,将Car调整到合适的大小,本项目设置Scale为 (0.0015, 0.0015, 0.0015),如下图

设置汽车模型

由于我们直接用了插件,Car组件有一些脚本,请大家手动删除吧,当然也可以不删。然后选中车身,目前的Shader是不支持透明材质的,我们选中它这个材质后,选择Beffio/Car Paint Transparent材质并更换,这个材质支持改变颜色和透明值, 更改后如下图


设置汽车材质

为了方便管理,我们可以将这个汽车材质拖动到我们项目下的Materials文件夹内并命名为CarBodyMat


CarBodyMat

到这里我们可以发布一个安卓包出来查看一下效果,我这里用PC来发布一下截图吧,恩好的,看起来是挺高大尚的一架汽车
AR汽车效果

实现AR换颜色功能

换颜色一般是通过控制shader里面的属性来控制,我们可以选中CarBodyMat材质看看它的一些Editor属性面板


Paste_Image.png

在这里由于只用到改变颜色,其他的属性节点就不讲述功能了,我们可以看到有个叫Base Color的属性,通过改变这个属性的颜色值,发现车子的颜色也是可以改变的,那么我们应该怎样通过UI来控制这个属性改变呢?

首先我们需要通过UI来控制颜色改变,在Hierarchy面板右键新建一个UI Button组件,并命名为RedButton,文本输入红色,红色按钮背景颜色值为 RGB = 197,33,33,之后改变汽车的颜色也是用这个颜色值,放在按钮里用于提示用户将要改变的颜色,调整后如下图


建立红色按钮

按照上面的方法,我们可以做多几种颜色变化,绿色RGB = 11,221,100 ,橙色RGB =255,121,0 。当然你可以增加更多的颜色,这个看项目需要来弄,调整后效果如下图


创建颜色按钮

然后我们点击上层的Canvas物体,在属性面板里修改一下Canvas Scaler的值,这个Resoulution的值可以设计为自己的设计稿的大小,因为是横屏设计,那最好Match方式用高度比来控制,如下图
Canvas Scaler

脚本编写

建立按钮数据脚本
新建一个脚本,命名为UICarColorButton.cs, 双击打开复制以下代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class UICarColorButton : MonoBehaviour
{
    /// <summary>
    /// 记录要改变的汽车颜色
    /// </summary>
    public Color CarColor = Color.white;
}

此时我们可以将脚本拖动到按钮处,然后我们看属性面板会发现Car Color的属性值出现在编辑器里,调整好颜色值为 RGB = 197,33,33,如图


UICarColorButton

一个简单的按钮组件就完成了,接着按照上面的方法将脚本再拖动给其他的颜色按钮即可。

建立汽车控制脚本
在我们项目的Scripts文件夹里右键新建一个CarController.cs脚本,拖动到我们的汽车物体上,双击输入以下代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CarController : MonoBehaviour {

    /// <summary>
    /// 汽车的材质链接
    /// </summary>
    public Material CarMat;

    /// <summary>
    /// 记录汽车当前的颜色值
    /// </summary>
    private Color _carColor;

    public void ChangeCarColor(Color color)
    {
        _carColor = color;
        CarMat.SetColor("_BaseColor", _carColor);
    }
}

接着我们将CarBodyMat材质拖动到GameController的CarMat节点处,如下图:


建立汽车控制脚本

建立游戏逻辑控制脚本
接着在场景中新建一个GameObject,命名为GameController,再在我们项目的Scripts文件夹里右键新建一个GameController.cs脚本,拖到GameController物体上,这个脚本的作用是控制整个游戏逻辑,双击GameController.cs脚本输入以下代码,代码作用请看代码注释。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; //如果我们要用unity的UI包,记得引入这个命名空间

public class GameController : MonoBehaviour
{
    /// <summary>
    /// 汽车控制器
    /// </summary>
    public CarController carController;

    /// <summary>
    /// 汽车颜色按钮列表
    /// </summary>
    public List<Button> CarColorButtons = new List<Button>();

    void Start ()
    {
        Init();
    }

    /// <summary>
    /// 初始化
    /// </summary>
    private void Init()
    {
        //获取列表里的按钮并指定按钮事件
        foreach (Button button in CarColorButtons)
        {
            button.onClick.AddListener(() =>
            {
                //获取按钮的UICarColorButton组件
                UICarColorButton colorButton = button.GetComponent<UICarColorButton>();
                //设置汽车颜色
                carController.ChangeCarColor(colorButton.CarColor);
            });
        }

        //判断是否有颜色数据
        if (CarColorButtons.Count > 0) 
        {
            //设置汽车颜色为第一个按钮数据的颜色
            carController.ChangeCarColor(CarColorButtons[0].GetComponent<UICarColorButton>().CarColor);
        }
    }
}

查看属性面板的GameController组件,在属性节点Car Controller处,将汽车物体拖动到这里,系统会自动将CarController脚本关联起来,此时我们就可以直接访问这个脚本,然后在属性节点 Car Color Buttons 的size处输入3(因为本案例只有3个颜色按钮),分别把3个按钮拖动到空的列表节点元素下进行绑定,完成效果如下图

建立游戏逻辑控制脚本

现在我们可以发布安卓包查看一下运行效果,效果如下图所示,如果没效果请检查一下是否有做对


运行效果

实现透视功能

该汽车Shader支持透明通道,我们可以利用Color的alpha值来实现透视效果,我们给CarController脚本增加一个能改变透明度的方法

    /// <summary>
    /// 改变透明度
    /// </summary>
    /// <param name="value"></param>
    public void ChangeTransparent(float value)
    {
        //通过材质颜色的alpha属性
        _carColor.a = value;
        CarMat.SetColor("_BaseColor", _carColor);
    }

然后在Canvas物体右键新建一个UI Slider 滑动条组件,设置好组件的大小和位置,效果如下图


创建滑动条

双击GameController脚本修改脚本如下(简书没法在code下编辑文字格式,按照新增的代码对照一下)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; //如果我们要用unity的UI包,记得引入这个命名空间

public class GameController : MonoBehaviour
{
    /// <summary>
    /// 汽车控制器
    /// </summary>
    public CarController carController;

    /// <summary>
    /// 汽车颜色按钮列表
    /// </summary>
    public List<Button> CarColorButtons = new List<Button>();

    /// <summary>
    /// 控制条
    /// </summary>
    public Slider TransparentSlider;

    void Start ()
    {
        Init();
    }

    /// <summary>
    /// 初始化
    /// </summary>
    private void Init()
    {
        //获取列表里的按钮并指定按钮事件
        foreach (Button button in CarColorButtons)
        {
            button.onClick.AddListener(() =>
            {
                //每次点击颜色按钮应先将透明值恢复为正常
                TransparentSlider.value = 1;
                //获取按钮的UICarColorButton组件
                UICarColorButton colorButton = button.GetComponent<UICarColorButton>();
                //设置汽车颜色
                carController.ChangeCarColor(colorButton.CarColor);
            });
        }

        //判断是否有颜色数据
        if (CarColorButtons.Count > 0) 
        {
            //设置汽车颜色为第一个按钮数据的颜色
            carController.ChangeCarColor(CarColorButtons[0].GetComponent<UICarColorButton>().CarColor);
        }
        
        //滑动条事件
        TransparentSlider.onValueChanged.AddListener(value =>
        {
            carController.ChangeTransparent(value);
        });

    }
}

最后我们将Slider组件拖动到GameController下进行绑定,如图


绑定Slider组件

现在我们可以发布安卓包查看一下最终运行效果,拖动滑动条,汽车也跟着透明起来了,如下图所示,如果没效果请检查一下是否有做对

最终效果

总结

此案例并不是十分复杂,主要是学习如何通过修改材质颜色和透明度达到对应效果,后期还可以加上手势控制汽车模型旋转放大,脱卡等功能完善项目。如果我有时间会继续完善功能开发。

最后放出源码包供大家使用
OSGIT下载地址
https://git.oschina.net/UnityLession/arcar.git

感谢大家看到最后,祝大家学业进步,有兴趣的同学可以加我QQ 409999619 一起多多交流。


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

推荐阅读更多精彩内容