更新内容
注意啦!本涂色代码在Vuforia5以上版本失效了!
1.1版的UnityPackage内容更新,下载地址在后面
CameraTargetPatchLighted着色器的光照模型调整
实现了判断整张识别图进入画面再进行拾色的功能,当然这个功能市面上已经有了,我会说一下我实现的思路
说一下前一篇提到的遮挡效果
下载
提取码: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 | Shader "ColorAR/AlphaMask" { |
示例
待续…