增强现实作为一种交互方式是用来承载内容的。用它来承载 2D 内容,就像是给我们原本的世界增添了一些信息;而用它来承载 3D 内容,就会给人一种将虚拟物体带入到现实中的感觉。这里我们将使用 高通+Unity 的方式来实现 3D 效果,并讨论如何添加阴影及如何使虚拟物体浮现出来。

整备工作

1. 下载最新版本的 Unity5
2. 下载最新的 Vuforia SDK

搭建场景

将上面准备好的 Unity Package 导入到 Unity 中,设置 ARCamera 与 ImageTarget 中得参数。创建一个简单的 Cube 对象。注意不要忘记在 ARCamera 中设置 App License Key。

最后通过编译运行,我们就能看到结果了。

添加阴影

在 Unity 中我们通常给物体添加阴影来增加真实感。

但是我们直接这么做的话会在画面中也看到一个白色的平面。所以我们需要一个透明的平面,但能够接收阴影。为了达到这个目的,我们需要一个自定义的着色器。

Shader "FX/Matte Shadow" {
 
Properties {
    _Color ("Main Color", Color) = (1,1,1,1)
    _MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
    _Cutoff ("Alpha cutoff", Range(0,1)) = 0.5
}
 
SubShader {
 
    Tags {"Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"}
    LOD 200
    Blend Zero SrcColor
 
CGPROGRAM
 
#pragma surface surf ShadowOnly alphatest:_Cutoff
 
fixed4 _Color;
 
struct Input {
    float2 uv_MainTex;
};
 
inline fixed4 LightingShadowOnly (SurfaceOutput s, fixed3 lightDir, fixed atten)
{
    fixed4 c;
    c.rgb = s.Albedo*atten;
    c.a = s.Alpha;
 
    return c;
}
 
void surf (Input IN, inout SurfaceOutput o)
{
 
    fixed4 c = _Color;
    o.Albedo = c.rgb;
    o.Alpha = 1;
 
}
 
ENDCG
 
}
 
Fallback "Transparent/Cutout/VertexLit"
 
}

使用 Matte Shadow 制作材质球,再将它拖拽到我们的平面上,就得到了我们期望的效果。注意如果没看到阴影的话,很可能是 Scale 或者 Project Quality 设置的问题。

从识别对象中浮现

要实现这个效果,我们需要使用 [Depth Shader](http://pan.baidu.com/s/1fLnFC)。原理是我们将使用一个透明但看不到内部的盒子将低于物料的物体隐藏起来。

在透明盒子上加上 DepthMask.shader,将 SetRenderQueue.cs 加在需要影藏的物体上。最终我们获得视频中的效果。