Unity涂色AR教程(二)

更新内容

注意啦!本涂色代码在Vuforia5以上版本失效了!

  • 1.1版的UnityPackage内容更新,下载地址在后面

  • CameraTargetPatchLighted着色器的光照模型调整

  • 实现了判断整张识别图进入画面再进行拾色的功能,当然这个功能市面上已经有了,我会说一下我实现的思路

  • 说一下前一篇提到的遮挡效果

下载

ColorAR-Gypsum-v1.1.unitypackage

提取码:km0l

判断整张识别图进入画面后再进行拾色

  应项目要求,要把DEMO做的好看一点,所以想办法实现了这个功能。旧版中的方法其实不是个好办法,因为即使等待1秒仍有可能没把标记图拍全,导致获取的贴图不全,模型会有一坨黑色。所以我把等待功能的代码都删除了,换成了现在的功能。你可以打开Example中的Scene导出手机查看效果。

实现的思路

  Unity有一个回调函数OnBecameVisible()会在物体被任意Camera拍摄到时(即使被拍摄到一部分),物体一进入摄像机,就会被调用。另一个OnBecameInvisible()会在移出摄像机时被调用。当然这两个直接用都不能实现判断物体整个都处在画面中的效果。我的办法是,因为标记图总是个矩形,在矩形的四个角上放置四个点,判断这四个角是否存在于画面当中,如果是则整个矩形就一定处于画面中,此时再拾取贴图就可以保证贴图的完整了。

四个角

四个点

  • 因为OnBecameVisible()要起作用必须要物体带有Renderer,所以这四个点不能是空的GameObject,我放的其实是四个Cube,Scale被设置为0所以不可见。不要忘了挂上Check Point脚本。

ImageTarget的设置

脚本设置

  • 依然是在ImageTarget下挂上ExtendTrackableEvent,代码改了所以参数有变。
  • Check Cover是一块半透明的板,它的尺寸应该完全贴合在标记图上(和QuadCatchUV一样),作用是在玩家调整位置时有一个视觉提示。
  • Check Point的数组,把四个角上的Check Point拖进去即可。
  • Other Object需要你把所有原来的AR物体放到一个父物体下面,然后赋值给它。(这个父物体会在没有拾色前隐藏起来)

遮挡

  由于AR的原理,程序总是在最下一层渲染相机画面,而3D引擎渲染出来的物体则叠加在相机画面之上。如此一来,当渲染物体的实际深度在真实物体之下时,会产生很违和的效果。而“遮挡效果”就是为了模拟真实物体和渲染物体的遮挡关系而产生的。

  通过对Shader渲染队列的修改,让Alpha渲染在物体之前以遮蔽一部分的模型,使模型在真实深度下的部分透明不可见,就可以实现这样的效果了。

1
2
3
4
5
6
7
8
9
10
Shader "ColorAR/AlphaMask" {
SubShader{
Tags {"Queen"="Geometry-10"}
Lighting Off
ZTest LEqual
ZWrite On
ColorMask 0
Pass{}
}
}

示例

待续…